hive与hbase整合。hive2.3.3版本与hbase1.2.6版本。

介绍

版本信息

hive1.x兼容hbase0.98.x及之前版本,hive2.x兼容hbase1.x及之后版本。

hive与hbase整合,允许hql 语句访问hbase表,包括select 和insert,甚至可以通过join、union方式将hbase表和hive表组合在一起。

storage handlers

StorageHandler类是org.apache.hadoop.hive.hbase.HBaseStorageHandler,该类在hive-hbase-handler-x.y.z.jar中。不同于elasticsearch-hadoop-x.y.z.jar 因为是由ES公司维护的而未预装在hive 安装包中,hive-hbase-handler-x.y.z.jar 是由hive 组织维护的,从groupId=org.apache.hive 就可以看出,故该jar是预装在hive 安装包中的,具体是在$HIVE_HOME/lib 目录中。

为了能正确连接hbase服务,还需要设置hiveconf。

示例:

在命令行连接hbase

bin/hive --hiveconf hbase.zookeeper.quorum=zk1:port[,zk2:port,zk3:port]

通常在hbase 服务器会安装zookeeper,用来在多台hbase 中选举hbase master。实测,即使只有单台hbase,用start-hbase.sh 启动hbase服务后,也会启动自带的zookeeper服务,端口默认是2181,可以在hbase-site.xml 中由hbase.zookeeper.property.clientPort 配置项配置。

为了新建一个由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中看到xyz表了。

通过往hive表插入数据来向hbase表插入数据:

insert overwrite table hbase_table_1 select * from pokes where foo = 98;

这个时候,查hbase_table_1表和xyz表都可以看到这条记录。

插入大量数据时可能由于wal开销而很慢,可以在insert 前设置hive.hbase.wal.enabled=false,即set hive.hbase.wal.enabled=false;

值的注意的是,禁用hbase wal可能会造成数据丢失。

如果想用hive访问一个现存的hbase 表,则需创建外部表

示例:

create external table hbase_table_2 (key int, value string)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties ("hbase.columns.mapping" = "cf1:val")
tblproperties ("hbase.table.name" = "some_existing_table", "hbase.mapred.output.outputtable" = "some_existing_table");

同样,hbase.columns.mapping 属性是必需的,它会校验现存hbase表的列族。

hbase.table.name 和 hbase.mapred.output.outputtable 都是可选的。

column mapping

列映射

serdeproperties (hbase.columns.mapping) 控制着hbase 列到hive 列的映射。

对每一个hive 列,都必须在hbase.columns.mapping 属性值中指定,多个列以逗号分隔。hbase.columns.mapping值字符串中不能有空格。

映射条目格式必须是:key 或 :timestamp 或 column-family-name:[column-name][#(binary | string)]