配置 hive 与 hbase 整合的目的是利用 HQL 语法实现对 hbase 数据库的增删改查操作,基本原理就是利用两者本身对外的API接口互相进行通信,两者通信主要是依靠hive_hbase-handler.jar工具类。 但请注意:使用Hive操作HBase中的表,只是提供了便捷性,前面章节已经介绍,hiveQL引擎使用的是MapReduce,对于性能上,表现比较糟糕,在实际应用过程中可针对不同的场景酌情使用。
注意:本文介绍的内容适用的版本见我前面章节,HDP2.4.2 ( HBase-1.1.2, hive-1.2.1, hadooop-2.7.1), 文章命令中的路径根据你配置集群选择的安装路径不同而可能不一样,请根据实际安装目录进行调整。
目录:
- hive配置
- dfs权限
- 测试
hive配置:
- 在<HIVE_HOME>/lib 目录需要有下面的这些文件,其中(guava-14.0.1.jar、zookeeper-3.4.6.2.4.2.0-258.jar、hive-hbase-handler-1.2.1000.2.4.2.0-258.jar、htrace-core-3.1.0-incubating.jar)在hive安装时已经包含,列表中的其它文件需要从 <HBASE_HOME>/lib 下copy. (注意: 如果 hive 安装时自带的文件版本与 hbase/lib 下的不一致时,应先删除 hive/lib 下的文件,再从 hbase/lib 下copy 过来)
guava-14.0.1.jar zookeeper-3.4.6.2.4.2.0-258.jar htrace-core-3.1.0-incubating.jar hbase-common-1.1.2.2.4.2.0-258.jar hbase-common-1.1.2.2.4.2.0-258-tests.jar hbase-client-1.1.2.2.4.2.0-258.jar hbase-server-1.1.2.2.4.2.0-258.jar hbase-protocol-1.1.2.2.4.2.0-258.jar hive-hbase-handler-1.2.1000.2.4.2.0-258.jar
- 在 hbase master 主机 hdp4上,执行下面的命令,将文件copy至 hdp1、hdp2、hdp3 的<HIVE_HOME>/lib 目录
- hdp4命令:cd /usr/hdp/2.4.2.0-258/hbase/lib
- hdp4命令:scp hbase-common-1.1.2.2.4.2.0-258.jar hbase-common-1.1.2.2.4.2.0-258-tests.jar hbase-client-1.1.2.2.4.2.0-258.jar hbase-server-1.1.2.2.4.2.0-258.jar hbase-protocol-1.1.2.2.4.2.0-258.jar hdp1:/usr/hdp/2.4.2.0-258/hive/lib (再次执行上面命令,修改红色标注机器名更新文件至 hdp2,hdp3)
- 在 ambari 管理界面修改 hive-site.xml 配置文件,hive --> advanced --> custom hive-site, 选择 “ Add Property ... ", 弹出框中: key输入:hive.aux.jars.path, Value的值就是 <HIVE_HOME>/lib 目录下上面列出文件名(绝对地址),如下:
/usr/hdp/2.4.2.0-258/hive/lib/guava-14.0.1.jar,/usr/hdp/2.4.2.0-258/hive/zookeeper-3.4.6.2.4.2.0-258.jar,/usr/hdp/2.4.2.0-258/hive/hive-hbase-handler-1.2.1000.2.4.2.0-258.jar,/usr/hdp/2.4.2.0-258/hive/hbase-common-1.1.2.2.4.2.0-258.jar,/usr/hdp/2.4.2.0-258/hive/hbase-server-1.1.2.2.4.2.0-258.jar,/usr/hdp/2.4.2.0-258/hive/hbase-client-1.1.2.2.4.2.0-258.jar,/usr/hdp/2.4.2.0-258/hive/hbase-common-1.1.2.2.4.2.0-258-tests.jar,/usr/hdp/2.4.2.0-258/hive/htrace-core-3.1.0-incubating.jar,/usr/hdp/2.4.2.0-258/hive/hbase-protocol-1.1.2.2.4.2.0-258.jar
- 上一步实际就是在 hive-site.xml (/etc/hive/2.4.2.0-258/0) 配置文件中增加一个参数 ,不让手工修改的原因是,hive服务重启后,手工修改的配置会被冲掉。
- 在ambari中修改完参数并保存时会生成新的配置版本,同时自动检测此参数修改对其它主机和组件的影响,提示组件服务重启,按提示操作即可。
- 将 hdp4 主机上 hbase/conf 下的hbase-site.xml文件复制到所有hadoop节点的hadoop/conf下
dfs权限:
- 进入ambari管理界面,选择 HDFS --> Advanced --> Advanced hdfs-site ,设置 dfs.permissions.enabled 属性为: false 如图:
测试:
- 使用 xshell 连接 hive 主机 hdp1
- 命令: cd /usr/hdp/2.4.2.0-258/hive/bin (切换至 hive/bin 目录)
- 单节点连接hbase命令: beeline -hiveconf hbase.master=hdp4.60000 (hdp4是hbase的master节点,见hd2.4安装第五部分)
- 以集群连接hbase命令:beeline -hiveconf hbase.zookeeper.quorum=R (意思是由zookeeper来分配主机,HBase使用的zookeeper集群,默认端口是2181,可以不指定,如果修改过zookeeper端口,则为:zkNode1:2222,zkNode2:2222,zkNode3:2222)
- beeline: !connect jdbc:hive2://hdp1:10000/default (连接hive)
- 测试: show databases; (查看 hive 中所有的数据库,验证hive连接成功否)
- 执行下面的sql, 创建 hive 的扩展表与 hbase 数据库 stocksInfo 表关联。 (见 HBase(二): c#访问HBase之股票行情Demo)
CREATE EXTERNAL TABLE if not exists StocksInfo( Rowkey string, Code string, Name string ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES('hbase.columns.mapping' = ':key,d:Code,d:Name') TBLPROPERTIES('hbase.table.name' = 'StocksInfo');
- hbase.columns.mapping: Hive表和HBase表的字段映射关系,分别为:Hive表中第一个字段映射:key(rowkey),d:code (d 指hbase 数据库 stocksInfo 表列族,code 列名)
- 表创建成功后,执行 : select * from stocksInfo; 查一下,如下则OK
- hive 扩展表可理解为关系型数据库里面的视图, 表删除时,并不会删除数据,我在应用过程中,大部分场景是与 hbase 数据关联。
- 如果创建 hive 实表与 hbase 关联时,通过 hiveQL 进行的创建表、增加数据等操作均会影响到 hbase 数据库中的数据,具体会在以后的章节介绍。