前言
HBase作为分布式的NOSQL数据库,并不支持传统的SQL查询,通过将Hive框架与HBase进行集成,我们可以实现使用HQL对HBase的数据进行操作,本文对具体的操作流程进行演示与使用测试:
一、导入HBase下的jar包
当我们使用HBase与Hive集成,其本质是Hive作为HBase的客户端。
因此我们需要让Hive能够读取到HBase的一些配置JAR包。
采用软链接的方式将$HBASE_HOME/lib
下的对应版本的common
、server
、client
、protocol
、it
、htrace-core
六个包链接到$HIVE_HOME/lib
下:
[root@hadoop lib]# ln -s hbase-common-0.98.6-cdh5.3.6.jar /opt/cdh5.3.6/hive-0.13.1-cdh5.3.6/lib/hbase-common-0.98.6-cdh5.3.6.jar
[root@hadoop lib]# ln -s hbase-server-0.98.6-cdh5.3.6.jar /opt/cdh5.3.6/hive-0.13.1-cdh5.3.6/lib/hbase-server-0.98.6-cdh5.3.6.jar
[root@hadoop lib]# ln -s hbase-client-0.98.6-cdh5.3.6.jar /opt/cdh5.3.6/hive-0.13.1-cdh5.3.6/lib/hbase-client-0.98.6-cdh5.3.6.jar
[root@hadoop lib]# ln -s hbase-protocol-0.98.6-cdh5.3.6.jar /opt/cdh5.3.6/hive-0.13.1-cdh5.3.6/lib/hbase-protocol-0.98.6-cdh5.3.6.jar
[root@hadoop lib]# ln -s hbase-it-0.98.6-cdh5.3.6.jar /opt/cdh5.3.6/hive-0.13.1-cdh5.3.6/lib/hbase-it-0.98.6-cdh5.3.6.jar
[root@hadoop lib]# ln -s htrace-core-2.04.jar /opt/cdh5.3.6/hive-0.13.1-cdh5.3.6/lib/htrace-core-2.04.jar
完成拷贝后进入Hive的lib目录下进行检查发现几个包都拷贝进去,接下来我们还要确认三个事项:
①$HBASE_HOME/lib
下的zookeeper
包与$HIVE_HOME/lib
下是一致的。
②$HBASE_HOME/lib
下的guava
包与$HIVE_HOME/lib
下是一致的。
(不一致的话删除一个然后拷贝另一个即可。)
③$HBASE_HOME/lib
下存在hive-hbase-handler
jar包。
二、添加Zookeeper配置
在$HIVE_HOME/conf
下找到hive-site.xml
添加zookeeper的地址:
<property>
<name>hbase.zookeeper.quorum</name>
<value>hostname1,hostname2,hostname3</value>
</property>
设置为自己zookeeper集群的主机名即可。
三、通过Hive创建HBase表测试
1、进入Hive的shell创建表:
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");
使用desc formatted hbase_table_1
查看表的属性:
可以看到我们创建了一个名为xyz的表,类型是管理表,有key和value两个字段。
如果以上配置都没问题的话,此时我们再进入HBase的shell输入list可以看到xyz表已经在其中。
或者我们通过HDFS webUI进行查看:
Hive目录下:
HBase目录下:
2、插入数据
我们从当前Hive下随便找一个有数据的表(包含int和string字段即可),通过Hive表中已有的数据插入到HBase表中。
然后从Hive中执行数据导入操作:
INSERT OVERWRITE TABLE hbase_table_1 select id,name from emp1;
接下来它会通过一个MapReduce任务来完成数据的插入,完成后我们在Hive中查看数据插入是否成功:
数据已经成功插入表中。
进入HBase中通过scan
进行查看:
此时的数据已经插入到HBase中,如果对HBase存储机制有所了解的话当前的写入应该仍保存在内存中。
我们再通过flush ‘xyz’
将其写入HDFS后可以看到数据写入了盘。