Hadoop技术栈(五)HIVE事务、元数据和存储

事务描述

  • Hive提供行级别的ACID语义
  • BEGIN、COMMIT、ROLLBACK 暂时不支持,所有操作自动提交
  • 目前只支持 ORC 的文件格式
  • 默认事务是关闭的,需要设置开启
  • 要是使用事务特性,表必须是分桶的
  • 只能使用内部表
  • 如果一个表用于ACID写入(INSERT、UPDATE、DELETE),必须在表中设置表属性 : "transactional=true"
  • 必须使用事务管理器 org.apache.hadoop.hive.ql.lockmgr.DbTxnManager
  • 目前支持快照级别的隔离。就是当一次数据查询时,会提供一个数据一致性的快
  • LOAD DATA语句目前在事务表中暂时不支持
    -- 这些参数也可以设置在 hive-site.xml 中
    SET hive .support.concurrency = true ;
    -- Hive 0.x and 1.x only
    SET hive .enforce.bucketing = true ;
    SET hive .exec.dynamic.partition.mode = nonstrict;
    SET hive .txn.manager =
    org .apache.hadoop.hive.ql.lockmgr.DbTxnManager ;
    -- 创建表用于更新。满足条件:内部表、 ORC 格式、分桶、设置表属性
    create table zxz_data(
    name string,
    nid int ,
    phone string,
    ntime date )
    clustered by (nid) into 5 buckets
    stored as orc
    tblproperties( 'transactional' = 'true' );

元数据

元数据包含用 Hive 创建的 database 、 table 、表的字段等元信 息。元数据存储在关系型数据库中。如hive 内置的 Derby 、第三方如 MySQL 等。
Metastore 即元数据服务,是 Hive 用来管理库表元数据的一个服务。有了它上层的服务不用再跟裸的文件数据打交道,而是可以基于结构化的库表信息构建计算框架。通过metastore 服务将 Hive 的元数据暴露出去,而不是需要通过对 Hive 元数据库mysql的访问才能拿到 Hive 的元数据信息; metastore 服务实际上就是一种 thrift 服务,通过它用户可以获取到Hive 元数据,并且通过 thrift 获取元数据的方式,屏蔽了数据库访问需要驱动,url ,用户名,密码等细节。
内嵌模式 本地模式 远程模式
远程模式下,需要单独起 metastore 服务,然后每个客户端都在配置文件里配置连接到该metastore 服务。远程模式的 metastore 服务和 hive 运行在不同的进程里。 在生 产环境中,建议用远程模式来配置 Hive Metastore

启动 metastore 服务

nohup hive --service metastore &

查询 9083 端口 (metastore 服务占用的端口 )

lsof -i :9083

安装 lsof

yum install lsof
修改 linux122 上 hive-site.xml 。删除配置文件中: MySQL 的配置、连接数据库的用户名、口令等信息;增加连接metastore 的配置
<!-- hive metastore 服务地址 -->
<property>
<name> hive.metastore.uris </name>
<value> thrift://linux121:9083,thrift://linux123:9083 </value>
</property>
启动 hive 。此时 client 端无需实例化 hive 的 metastore ,启动速度会加快。

HiveServer2

为 Hive 提供了一种允许客户端远程访问的服务
基于 thrift 协议,支持跨平台,跨编程语言对 Hive 访问
允许远程访问 Hive

存储格式

Hive 支持的存储数的格式主要有: TEXTFILE (默认格式) 、 SEQUENCEFILE 、
RCFILE 、 ORCFILE 、 PARQUET 。
TEXTFILE 、 SEQUENCEFILE 的存储格式是基于行存储的;
ORC 和 PARQUET 是基于列式存储的。
行存储与列存储
行式存储下一张表的数据都是放在一起的,但列式存储下数据被分开保存了。
行式存储:
优点:数据被保存在一起, insert 和 update 更加容易
缺点:选择( selection )时即使只涉及某几列,所有数据也都会被读取
列式存储:
优点:查询时只有涉及到的列会被读取,效率高
缺点:选中的列要重新组装, insert/update 比较麻烦
感谢阅读!!!