Hive集成Phoenix

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.pathfile:///opt/cloudera/parcels/PHOENIX/lib/phoenix-5.0.0-cdh6.2.0-hive.jar

编辑配置 hive-site.xml 的 Hive 客户端高级配置代码段(安全阀),添加属性:

属性
hive.aux.jars.pathfile:///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.portZooKeeper端口。默认2181。
phoenix.rowkeysPhoenix表的primary key的列的列表。
phoenix.column.mappingHive表和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.cache100单元请求读取的行大小
hbase.scan.cacheblockfalse是否缓存块
split.by.statsfalse如果设置为true,mapper使用表statistics,每个guidepost一个mapper。了解 Statistics Collection
[hive-table-name].reducer.count1reducers数量。在Tez模式下,这仅影响单表查询。详情请看Limitations
[phoenix-table-name].query.hintPhoenix查询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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值