Hive支持使用HDFS之外的存储系统作为底层存储系统,其中官方明确支持HBase,Kudu,Druid和JDBC(MySQL等)。
Hive提供了相应的接口 StorageHandlers,用以实现和其他存储系统的整合。
Phoenix实现了相应的接口,可以使用Phoenix作为Hive的底层存储系统,在Hive中操作Phoenix表,并和Hive本地表进行互操作。
Phoenix官网该特性的详细描述可参考 Phoenix Storage Handler for Apache Hive。
本文主要描述在CDH集群中如何集成Hive和Phoenix,及其基本使用和注意事项。
在CDH集群中,部署Phoenix后,可以通过配置Hive,以启用Hive使用Phoenix作为底层存储的特性。
配置
准备Phoenix-Hive连接器
在运行有Hive服务的所有集群节点,创建一个Hive可读的目录,将 opt/cloudera/parcels/PHOENIX/lib/phoenix/phoenix-<version>-hive.jar
复制到这个目录。
例如,创建目录 /opt/hive/phoenix-hive
,复制 /opt/cloudera/parcels/PHOENIX/lib/phoenix/phoenix-5.0.0-cdh6.2.0-hive.jar
到该目录下。
配置Hive
导航到Cloudera Manager中Hive服务的配置。
编辑配置 Hive 辅助 JAR 目录 ,值为 /opt/hive/phoenix-hive
。
编辑配置 hive-site.xml 的 Hive 服务高级配置代码段(安全阀),添加属性:
属性 | 值 |
---|---|
hive.aux.jars.path | file:///opt/cloudera/parcels/PHOENIX/lib/phoenix-5.0.0-cdh6.2.0-hive.jar |
编辑配置 hive-site.xml 的 Hive 客户端高级配置代码段(安全阀),添加属性:
属性 | 值 |
---|---|
hive.aux.jars.path | file:///opt/cloudera/parcels/PHOENIX/lib/phoenix-5.0.0-cdh6.2.0-hive.jar |
保存并按照提示重启。
Phoenix-Hive使用
建表
Hive有 managed vs external 两种表,在使用Phoenix作为底层存储时,概念不变。
创建managed表
Hive完全管理表和数据。
create table phoenix_table (
s1 string,
i1 int,
f1 float,
d1 double
)
STORED BY 'org.apache.phoenix.hive.PhoenixStorageHandler'
TBLPROPERTIES (
"phoenix.table.name" = "phoenix_table",
"phoenix.zookeeper.quorum" = "localhost",
"phoenix.zookeeper.znode.parent" = "/hbase",
"phoenix.zookeeper.client.port" = "2181",
"phoenix.rowkeys" = "s1, i1",
"phoenix.column.mapping" = "s1:s1, i1:i1, f1:f1, d1:d1",
"phoenix.table.options" = "SALT_BUCKETS=10, DATA_BLOCK_ENCODING='DIFF'"
);
创建external表
Hive只管理表的元数据。
在创建external表之前,Phoenix表必须已经存在。
create external table ext_table (
i1 int,
s1 string,
f1 float,
d1 decimal
)
STORED BY 'org.apache.phoenix.hive.PhoenixStorageHandler'
TBLPROPERTIES (
"phoenix.table.name" = "ext_table",
"phoenix.zookeeper.quorum" = "localhost",
"phoenix.zookeeper.znode.parent" = "/hbase",
"phoenix.zookeeper.client.port" = "2181",
"phoenix.rowkeys" = "i1",
"phoenix.column.mapping" = "i1:i1, s1:s1, f1:f1, d1:d1"
);
属性说明
属性 | 说明 |
---|---|
phoenix.table.name | 指定Phoenix表名。默认同Hive表名。 |
phoenix.zookeeper.quorum | 指定HBase的ZooKeeper quorum。默认localhost。 |
phoenix.zookeeper.znode.parent | 指定HBase的ZooKeeper parent node。默认/hbase。 |
phoenix.zookeeper.client.port | ZooKeeper端口。默认2181。 |
phoenix.rowkeys | Phoenix表的primary key的列的列表。 |
phoenix.column.mapping | Hive表和Phoenix表的列映射。需要注意Phoenix表区分大小写,默认是大写。 |
插入,更新和删除
Phoenix-Hive在使用上有一些限制,Cloudera官方文档和Phoenix官方文档都提出了一些限制,但是略有不同,下面给出链接:
https://docs.cloudera.com/documentation/enterprise/6/6.3/topics/phoenix_hive_connector.html#concept_esk_t4h_43b
http://phoenix.apache.org/hive_storage_handler.html#Limitations
如果使用Cloudera Phoenix,以Cloudera文档为主。
由于这些限制,使用建议如下:
-
Hive端只用于插入数据
-
Phoenix端可以插入,更新和删除数据。
使用示例:
Hive
insert into table T values (....);
insert into table T select c1,c2,c3 from source_table;
Phoenix
upsert into table T values (.....);
Phoenix CSV BulkLoad tools
查询数据
在Hive端查询数据时,单表查询可以达到和Phoenix客户端一样的速度,只需要设置:
set hive.fetch.task.conversion=more
set hive.exec.parallel=true
在查询数据时,还可以配置其他,如下:
参数 | 默认值 | 描述 |
---|---|---|
hbase.scan.cache | 100 | 单元请求读取的行大小 |
hbase.scan.cacheblock | false | 是否缓存块 |
split.by.stats | false | 如果设置为true,mapper使用表statistics,每个guidepost一个mapper。了解 Statistics Collection。 |
[hive-table-name].reducer.count | 1 | reducers数量。在Tez模式下,这仅影响单表查询。详情请看Limitations。 |
[phoenix-table-name].query.hint | Phoenix查询Hint。详情请看 Hint。 |
性能调试
性能调试可参考 Tuning。
其他:
https://docs.cloudera.com/documentation/enterprise/6/6.3/topics/phoenix_performance_tuning.html
http://phoenix.apache.org/hive_storage_handler.html#Performance%20Tuning