1.背景
Hive是建立在Hadoop之上的数据仓库基础构架、是为了减少MapReduce编写工作的批处理系统,Hive本身不存储和计算数据,它完全依赖于HDFS和MapReduce。
Hive可以理解为一个客户端工具,将我们的sql操作转换为相应的MapReduce jobs,然后在Hadoop上面运行。
HBase全称为Hadoop Database,即HBase是Hadoop的数据库,是一个分布式的存储系统。HBase利用Hadoop的HDFS作为其文件存储系统,利用Hadoop的MapReduce来处理HBase中的海量数据。利用Zookeeper作为其协调工具。
HBase数据库的缺点在于——语法格式异类,没有类sql的查询方式,因此在实际的业务当中操作和计算数据非常不方便,但是Hive就不一样了,Hive支持标准的sql语法,于是我们就希望通过Hive这个客户端工具对HBase中的数据进行操作与查询,进行相应的数据挖掘,这就是所谓Hive与hBase整合的含义。
2.准备Hbase测试表
准备了一张hbase测试表
进入hbase shell
依次执行命令创建一个有两个列簇ca,cb的mytable表:
create 'mytable','ca','cb'
put 'mytable','110','ca:name','rose'
put 'mytable','111','cb:age','20'
往mytable表里面塞入两条数据
查询mytable表:
hbase(main):014:0> scan 'mytable'
ROW COLUMN+CELL
110 column=ca:name, timestamp=1557976394000, value=rose
111 column=cb:age, timestamp=1557976405399, value=20
2 row(s) in 0.0240 seconds
3.jar包准备
根据CDH版本决定,有些版本无需拷贝jar包,因为hbase的lib文件夹下没有hive-hbase-handler.jar包,这个包的存放路径在hive的lib文件夹下面,所以需要拷贝,在hbase的master节点中,执行如下命令:
cp /opt/cloudera/parcels/CDH-5.11.2-1.cdh5.11.2.p0.4/lib/hive/lib/hive-hbase-handler.jar /opt/cloudera/parcels/CDH-5.11.2-1.cdh5.11.2.p0.4/lib/hbase/lib/
4.修改hive配置
通过Hive -> 配置 -> 搜索栏中搜索 hive.server2.enable.doAs ,默认为勾选,取消勾选即可,即能修改配置为 false。
5.重启 hive、hbase、hue、还有oozie
6.创建基于Hbase的hive外部表
依次执行添加一下hive设置:
SET hbase.zookeeper.quorum=masternode1,masternode2,masternode3;
SET zookeeper.znode.parent=/hbase;
ADD jar /opt/cloudera/parcels/CDH-5.11.2-1.cdh5.11.2.p0.4/lib/hive/lib/hive-hbase-handler.jar;
hbase.zookeeper.quorum:
指定HBase使用的zookeeper集群,默认端口是2181,可以不指定,如果指定,格式为zkNode1:2222,zkNode2:2222,zkNode3:2222
zookeeper.znode.parent
指定HBase在zookeeper中使用的根目录
ADD jar /opt/cloudera/parcels/CDH-5.11.2-1.cdh5.11.2.p0.4/lib/hive/lib/hive-hbase-handler.jar;
使用hive-hbase-handler.jar连接hbase
在hive中使用如下语句建表在hive中使用如下语句建表:
hive> create external table mytable(rowkey string,ca map<string,string>,cb map<string,string>)
> STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
> WITH SERDEPROPERTIES ("hbase.columns.mapping" =":key,ca:,cb:")
> TBLPROPERTIES ("hbase.table.name"="mytable");
OK
Time taken: 2.52 seconds
这里使用外部表映射到HBase中的表,这样,在Hive中删除表,并不会删除HBase中的表,否则,就会删除。
另外,除了rowkey,其他字段使用Map结构来保存HBase中的每一个列族。
7.在hive中查询Hbase
上面在Hive中创建好表之后,直接查询:
hive> select * from mytable;
OK
110 {"name":"rose"} {}
111 {} {"age":"20"}
Time taken: 0.691 seconds, Fetched: 2 row(s)
用统计函数查询总条数:
select count(1) from mytable
查询结果2条