Hive整合HBase——通过Hive读/写 HBase中的表

本文介绍如何通过Hive与HBase的整合,实现Hive读取HBase中的数据。主要内容包括整合原理、具体步骤及测试案例。适用于希望了解Hadoop生态中这两种常用框架如何结合使用的读者。

写在前面一:

本文将Hive与HBase整合在一起,使Hive可以读取HBase中的数据,让Hadoop生态系统中最为常用的两大框架互相结合,相得益彰。


写在前面二:

使用软件说明


约定所有软件的存放目录:

/home/yujianxin

一、Hive整合HBase原理

Hive与HBase整合的实现是利用两者本身对外的API接口互相进行通信,相互通信主要是依靠hive-hbase-handler-0.9.0.jar工具类,如下图


Hive与HBase通信示意图


二、具体步骤

安装前说明

1、关于Hadoop、HBase、Hive集群的搭建,请参考本人博文“基于Hadoop的数据分析综合管理平台之Hadoop、HBase完全分布式集群搭建

2、本文中Hadoop、HBase、Hive安装路径


2.1、拷贝jar包
删除$HIVE_HOME/lib/下HBase、Zookeeper相关jar

rm -rf $HIVE_HOME/lib/zookeeper-*.jar
rm -rf $HIVE_HOME/lib/hbase*.jar
重新拷贝
cp $HBASE_HOME/hbase-0.94.7-security.jar $HIVE_HOME/lib/ 
cp $HBASE_HOME/lib/zookeeper-3.4.5.jar $HIVE_HOME/lib/

2.2、修改$HIVE_HOME/conf/hive-site.xml
mkdir $HIVE_HOME/logs
在尾部添加

<property>
<name>hive.querylog.location</name>
<value>/home/yujianxin/hive/hive-0.9.0/logs</value>
</property>
<property>
<name>hive.aux.jars.path</name>
<value>
file:///home/yujianxin/hive/hive-0.9.0/lib/hive-hbase-handler-0.9.0.jar,
file:///home/yujianxin/hive/hive-0.9.0/lib/hbase-0.94.7-security.jar,
file:///home/yujianxin/hive/hive-0.9.0/lib/zookeeper-3.4.5.jar	
</value>
</property>
修改
<property>
  <name>hive.zookeeper.quorum</name>
  <value>master,slave1,slave2</value>
</property>
2.3、拷贝hbase-0.94.7-security.jar到所有hadoop节点(包括master)的hadoop/lib下
cp $HBASE_HOME/hbase-0.94.7-security.jar $HADOOP_HOME/lib
2.4、拷贝hbas e/conf下的hbase-site.xml文件到所有hadoop节点(包括master)的hadoop/conf下
cp $HBASE_HOME/conf/hbase-site.xml  $HADOOP_HOME/conf

三、启动、使用配置后Hive,测试是否配置成功

3.1、启动Hive

集群方式启动

hive --auxpath /home/yujianxin/hive/hive-0.9.0/lib/hive-hbase-handler-0.9.0.jar,/home/
yujianxin/hive/hive-0.9.0/lib/hbase-0.94.7-security.jar,/home/yujianxin/hive/hive-0.9.
0/lib/zookeeper-3.4.5.jar

可以将此启动Hive与HBase整合的命令写成Shell脚本,设置成开机启动


3.2、在Hive中创建HBase识别的表

CREATE TABLE hbase_hive_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.table.name 定义在hbase中的table名称

多列时,data:1,data:2
多列族时,data1:1,data2:1
hbase.columns.mapping 定义在hbase的列族,里面的:key 是固定值而且要保证在表pokes中的foo字段是唯一值

创建有分区的表

CREATE TABLE hbase_hive_2(key int, value string)  
partitioned by (day string) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' 
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val") 
TBLPROPERTIES ("hbase.table.name" = "xyz2");

分别查看Hive、HBase中建立的表

    

3.3、导入数据

新建hive的数据表

create table pokes(foo int,bar string)
row format delimited fields terminated by ',';
批量导入数据


load data local inpath '/home/yujianxin/temp/data1.txt' overwrite into table pokes;
使用sql导入hbase_table_1
SET hive.hbase.bulk=true;
insert overwrite table hbase_hive_1 select * from pokes;
导入有分区的表
insert overwrite table hbase_hive_2  partition (day='2012-01-01') select * from pokes;

往Hive中插入数据同时会插入到HBase中

3.4、分别查看Hive、HBase中的数据


OK,到此Hive、HBase整合成功。

——————————————————————————————————————————————————————————————————

下面再给出较复杂的测试例子

情况一、对于在hbase已经存在的表,在hive中使用CREATE EXTERNAL TABLE来建立联系

create external table hive_test (key int,gid map<string,string>,sid map<string,string>,uid map<string,string>) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' 
WITH SERDEPROPERTIES ("hbase.columns.mapping" ="a:,b:,c:")  
TBLPROPERTIES  ("hbase.table.name" = "test1");


查询gid字段中value值


Hive成功读取到HBase中的数据

情况二、如果hbase表test2中的字段为user:gid,user:sid,info:uid,info:level


在hive中建表语句为

CREATE EXTERNAL TABLE hive_test_2(key int,user map<string,string>,info map<string,string>) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' 
WITH SERDEPROPERTIES ("hbase.columns.mapping" ="user:,info:")  
TBLPROPERTIES  ("hbase.table.name" = "test2");

Hive成功读取到HBase中的数据


### HiveHBase整合的基本概念 在大数据生态系统中,HiveHBase各自承担着不同的角色。Hive主要用于处理大规模数据集的批处理任务,并支持类SQL的查询方式;而HBase则是一个分布式、版本化的键值存储系统,适用于实时场景。由于HBase本身的查询语言较为原始,缺乏类SQL的支持,因此常常通过Hive来简化对HBase中数据的操作[^1]。 ### 整合步骤概述 #### 1. 配置环境 在CDH环境中实现HiveHBase整合之前,需要确保以下几点配置正确: - **HiveHBase服务已安装并正常运行**:确保Hive Metastore服务、HiveServer2以及HBase的相关服务(如HMaster、HRegionServer)均已启动。 - **启用Hive访问HBase的功能**:确保Hive的`hive-site.xml`文件中包含了HBase相关的JAR包路径,通常这些JAR包位于HBase的lib目录下。 - **调整HiveServer2的安全设置**:如果使用HiveServer2或Beeline进行操作,则建议将`hive.server2.enable.doAs`参数设置为`false`,以避免在创建HBase时出现权限问题[^4]。 #### 2. 创建Hive外部指向HBase 为了能够在Hive中操作HBase中的数据,可以通过定义一个外部的方式,使得Hive能够访问HBase中的现有。具体语法如下: ```sql CREATE EXTERNAL TABLE user_profile ( username STRING, labels MAP<STRING, STRING> ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf:#s:b") TBLPROPERTIES("hbase.table.name" = "user_profile"); ``` 此语句创建了一个名为`user_profile`的外部,它映射到HBase中同名的。其中,`:key`HBase行键,`cf:#s:b`示列族`cf`下的所有列,且数据类型为字符串。这种方式允许Hive直接HBase中的数据,而不影响HBase中原有的数据结构[^3]。 #### 3. 创建由Hive管理的HBase 除了可以创建指向已有HBase的外部之外,还可以通过Hive直接创建新的HBase。这种情况下,Hive不仅负责定义结构,还负责管理底层HBase的生命周期。示例如下: ```sql 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中创建一个名为`xyz`的新,并且该Hive管理。每当通过Hive对该执行插入操作时,实际上是在向HBase入数据。同时,Hive也会维护这个的元数据信息[^2]。 #### 4. 数据导入与导出 一旦完成了HiveHBase之间的整合,就可以利用Hive提供的丰富SQL接口来进行数据导入和导出操作。例如,可以从其他Hive中抽取数据并通过INSERT INTO语句将其加载到HBase中,或者反过来从HBase中提取数据用于进一步分析。 ```sql -- 向HBase中插入数据 INSERT INTO TABLE hbase_table_1 VALUES (1, 'value1'), (2, 'value2'); -- 查询HBase中的数据 SELECT * FROM hbase_table_1; ``` 以上命令展示了如何向HBase中添加记录以及如何检索这些记录。值得注意的是,在实际应用过程中可能还需要根据具体的业务需求优化查询性能,比如合理设计索引、分区策略等。 ### 注意事项 - 在进行HiveHBase整合时,需要注意两者版本之间的兼容性问题。不同版本的CDH可能会有不同的依赖关系和配置要求。 - 对于生产环境中的大规模部署,应仔细规划资源分配,包括内存、CPU及磁盘I/O等方面,以保证系统的稳定性和高效性。 - 安全性方面,除了上述提到的`hive.server2.enable.doAs`参数外,还应该考虑Kerberos认证、SSL加密传输等安全机制的应用。 通过以上步骤,可以在CDH环境中成功地将HiveHBase集成起来,从而充分利用两者的优点,提高数据处理效率和灵活性。
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值