事务描述
- 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 比较麻烦
感谢阅读!!!