Hive HBase集成
Avro 数据存储在 HBase 列中
版本信息:
Avro 数据存储在 HBase 列中 从 Hive 0.9.0 开始,HBase 集成至少需要 HBase 0.92, 早期版本的 Hive 使用 HBase 0.89/0.90。
Hive 1.x 将与 HBase 0.98.x 及更低版本保持兼容。 Hive 2.x 将与 HBase 1.x 及更高版本兼容。(有关详细信息,请参阅 HIVE-10990。) 想要使用 Hive 1.x 使用 HBase 1.x 的消费者需要自己编译 Hive 1.x 流代码。
介绍
此文章记录了最初在 HIVE-705 中引入的 Hive/HBase 集成支持。此功能允许 Hive QL 语句访问 HBase 表以进行读取 (SELECT) 和写入 (INSERT)。甚至可以通过连接和联合将 HBase 表的访问与本机 Hive 表相结合。
用法
存储处理程序构建为独立模块 hive-hbase-handler-x.y.z.jar,它必须在 Hive 客户端辅助路径以及 HBase、Guava 和 ZooKeeper jar 上可用。它还需要设置正确的配置属性才能连接到正确的 HBase 主服务器。
-
这是一个在源构建环境中使用 CLI 的示例,目标是单节点 HBase 服务器。 (请注意,Hive 0.9.0 中的 jar 位置和名称已更改,因此对于早期版本,需要进行一些更改。)
$HIVE_SRC/build/dist/bin/hive --auxpath $HIVE_SRC/build/dist/lib/hive-hbase-handler-0.9.0.jar,$HIVE_SRC/build/dist/lib/hbase-0.92.0.jar,$HIVE_SRC/build/dist/lib/zookeeper-3.3.4.jar,$HIVE_SRC/build/dist/lib/guava-r09.jar --hiveconf hbase.master=hbase.yoyodyne.com:60000
-
这是一个以分布式 HBase 集群为目标的示例,其中使用 3 个zookeeper 的仲裁来选举 HBase 主节点:
$HIVE_SRC/build/dist/bin/hive --auxpath $HIVE_SRC/build/dist/lib/hive-hbase-handler-0.9.0.jar,$HIVE_SRC/build/dist/lib/hbase-0.92.0.jar,$HIVE_SRC/build/dist/lib/zookeeper-3.3.4.jar,$HIVE_SRC/build/dist/lib/guava-r09.jar --hiveconf hbase.zookeeper.quorum=zk1.yoyodyne.com,zk2.yoyodyne.com,zk3.yoyodyne.com
-
处理程序需要 Hadoop 0.20 或更高版本,并且仅通过依赖版本 hadoop-0.20.x、hbase-0.92.0 和 zookeeper-3.3.4 进行了测试。如果您不使用 hbase-0.92.0,则需要使用与您的版本匹配的 HBase jar 重建处理程序,并相应地更改上面的 --auxpath 。不使用匹配版本会导致误导性的连接失败,例如 MasterNotRunningException,因为 HBase RPC 协议经常变化。
为了创建一个由 Hive 管理的新 HBase 表,请在 CREATE TABLE 上使用 STORED BY 子句:
CREATE TABLE hbase_table_1(key int, value string) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val") TBLPROPERTIES ("hbase.table.name" = "xyz", "hbase.mapred.output.outputtable" = "xyz");
-
hbase.columns.mapping 属性是必需的,将在下一节中解释。 hbase.table.name 属性是可选的;它控制 HBase 已知的表的名称,并允许 Hive 表具有不同的名称。在此示例中,该表在 Hive 中称为 hbase_table_1,在 HBase 中称为 xyz。如果未指定,则 Hive 和 HBase 表名称将相同。 hbase.mapred.output.outputtable 属性是可选的;如果您打算向表中插入数据,则需要它(该属性由 hbase.mapreduce.TableOutputFormat 使用)
执行上述命令后,您应该能够在 HBase shell 中看到新的(空)表:
$ hbase shell HBase Shell; enter 'help<RETURN>' for list of supported commands. Version: 0.20.3, r902334, Mon Jan 25 13:13:08 PST 2010 hbase(main):001:0> list xyz 1 row(s) in 0.0530 seconds hbase(main):002:0> describe "xyz" DESCRIPTION ENABLED { NAME => 'xyz', FAMILIES => [{ NAME => 'cf1', COMPRESSION => 'NONE', VE true RSIONS => '3', TTL => '2147483647', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}]} 1 row(s) in 0.0220 seconds hbase(main):003:0> scan "xyz" ROW CO