hive/lib下的hbase-handler ,zookeeper都使用Hbase/lib下的版本
/hive --auxpath /opt/hive/lib/hive-hbase-handler-0.8.1.jar,/opt/hive/lib/hbase-0.90.4.jar,/opt/hive/lib/zookeeper-3.3.2.jar -hiveconf hbase.zookeeper.quorum=datanode1,datanode2
三个Jar之前用‘,’直接相连接,不能有空格,quorum只是regionserver,即slaves
Hive与HBase的整合功能的实现是利用两者本身对外的API接口互相进行通信,相互通信主要是依靠hive_hbase-handler.jar工具类 (Hive Storage Handlers), 大致意思如图所示:
口水:
对 hive_hbase-handler.jar 这个东东还有点兴趣,有空来磋磨一下。
一、2个注意事项:
1、需要的软件有 Hadoop、Hive、Hbase、Zookeeper,Hive与HBase的整合对Hive的版本有要求,所以不要下载.0.6.0以前的老版 本,Hive.0.6.0的版本才支持与HBase对接,因此在Hive的lib目录下可以看见多了hive_hbase-handler.jar这个 jar包,他是Hive扩展存储的Handler ,HBase 建议使用 0.20.6的版本,这次我没有启动HDFS的集群环境,本次所有测试环境都在一台机器上。
2、运行Hive时,也许会出现如下错误,表示你的JVM分配的空间不够,错误信息如下:
Invalid maximum heap size: -Xmx4096m
The specified size exceeds the maximum representable size.
Could not create the Java virtual machine.
解决方法:
/work/hive/bin/ext# vim util/execHiveCmd.sh 文件中第33行
修改,
HADOOP_HEAPSIZE=4096
为
HADOOP_HEAPSIZE=256
另外,在 /etc/profile/ 加入 export $HIVE_HOME=/work/hive
二、启动运行环境
1启动Hive
hive –auxpath /work/hive/lib/hive_hbase-handler.jar,/work/hive/lib/hbase-0.20.3.jar,/work/hive/lib/zookeeper-3.2.2.jar -hiveconf hbase.master=127.0.0.1:60000
加载 Hive需要的工具类,并且指向HBase的master服务器地址,我的HBase master服务器和Hive运行在同一台机器,所以我指向本地。
2启动HBase
/work/hbase/bin/hbase master start
3启动Zookeeper
/work/zookeeper/bin/zkServer.sh start
三、执行
在Hive中创建一张表,相互关联的表
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");
在运行一个在Hive中建表语句,并且将数据导入
建表
CREATE TABLE pokes (foo INT, bar STRING);
数据导入
LOAD DATA LOCAL INPATH '/work/hive/examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;
在Hive与HBase关联的表中 插入一条数据
INSERT OVERWRITE TABLE hbase_table_1 SELECT * FROM pokes WHERE foo=98;
运行成功后,如图所示:
插入数据时采用了MapReduce的策略算法,并且同时向HBase写入,如图所示:
在HBase shell中运行 scan 'xyz' 和describe "xyz" 命令,查看表结构,运行结果如图所示:
xyz是通过Hive在Hbase中创建的表,刚刚在Hive的建表语句中指定了映射的属性 "hbase.columns.mapping" = ":key,cf1:val" 和 在HBase中建表的名称 "hbase.table.name" = "xyz"
在hbase在运行put命令,插入一条记录
put 'xyz','10001','cf1:val','www.javabloger.com'
在hive上运行查询语句,看看刚刚在hbase中插入的数据有没有同步过来,
select * from hbase_table_1 WHERE key=10001;
如图所示:
最终的效果
以上整合过程和操作步骤已经执行完毕,现在Hive中添加记录HBase中有记录添加,同样你在HBase中添加记录Hive中也会添加, 表示Hive与HBase整合成功,对海量级别的数据我们是不是可以在HBase写入,在Hive中查询 喃?因为HBase 不支持复杂的查询,但是HBase可以作为基于 key 获取一行或多行数据,或者扫描数据区间,以及过滤操作。而复杂的查询可以让Hive来完成,一个作为存储的入口(HBase),一个作为查询的入口(Hive)。如下图示。
1. 基于Hadoop+Hive架构对海量数据进行查询:http://blog.youkuaiyun.com/kunshan_shenbin/article/details/7105319
2. HBase 0.94.0 + Hadoop 1.0.2集成:http://blog.youkuaiyun.com/kunshan_shenbin/article/details/7209990
本文的目的是要讲述如何让Hbase和Hive能互相访问,让Hadoop/Hbase/Hive协同工作,合为一体。
本文测试步骤主要参考自:http://running.iteye.com/blog/898399
当然,这边博文也是按照官网的步骤来的:http://wiki.apache.org/hadoop/Hive/HBaseIntegration
1. 拷贝HBase 0.94.0.jar和zookeeper-3.4.3.jar到hive/lib下。 0.94.0和hive不兼容改用0.94.2
注意:如何hive/lib下已经存在这两个文件的其他版本(例如zookeeper-3.3.1.jar),建议删除后使用hbase下的相关版本。
2. 修改hive/conf下hive-site.xml文件,在底部添加如下内容:
01 | [html] view plaincopy |
02 | <!-- |
03 | <property> |
04 | <name>hive.exec.scratchdir</name> |
05 | <value>/usr/local/hive/tmp</value> |
06 |
07 | </property> |
08 | --> |
09 | |
10 | <property> |
11 | <name>hive.querylog.location</name> |
12 | <value>/usr/local/hive/logs</value> |
13 | </property> |
14 | |
15 | <property> |
16 | <name>hive.aux.jars.path</name> |
17 | <value>file: ///usr/local/hive/lib/hive-hbase-handler-0.8.0.jar,file:///usr/local/hive/lib/hbase-0.90.5.jar,file:///usr/local/hive/lib/zookeeper-3.3.2.jar</value> |
18 |
19 | </property> |
注意:如果hive-site.xml不存在则自行创建,或者把hive-default.xml.template文件改名后使用。
具体请参见:http://blog.youkuaiyun.com/kunshan_shenbin/article/details/7210020
3. 拷贝hbase-0.94.2.jar到所有hadoop节点(包括master)的hadoop/lib下。
4. 拷贝hbase/conf下的hbase-site.xml文件到所有hadoop节点(包括master)的hadoop/conf下。
注意,hbase-site.xml文件配置信息参照:http://blog.youkuaiyun.com/kunshan_shenbin/article/details/7209990
注意,如果3,4两步跳过的话,运行hive时很可能出现如下错误:
1 | [html] view plaincopy |
2 | org.apache.hadoop.hbase.ZooKeeperConnectionException: HBase is able to connect to ZooKeeper but the connection closes immediately. |
3 | This could be a sign that the server has too many connections ( 30 is the default ). Consider inspecting your ZK server logs for that error and |
4 | then make sure you are reusing HBaseConfiguration as often as you can. See HTable's javadoc for more information. at org.apache.hadoop. |
5 | hbase.zookeeper.ZooKeeperWatcher. |
参考:http://blog.sina.com.cn/s/blog_410d18710100vlbq.html
现在可以尝试启动Hive了。
单节点启动:
1 | > bin/hive -hiveconf hbase.master=master: 60000 |
集群启动:
1 | > bin/hive -hiveconf hbase.zookeeper.quorum=slave |
如何hive-site.xml文件中没有配置hive.aux.jars.path,则可以按照如下方式启动。
1 | > bin/hive --auxpath /usr/local/hive/lib/hive-hbase-handler- 0.9 . 0 .jar, /usr/local/hive/lib/hbase- 0.94 .0
.jar, /usr/local/hive/lib/zookeeper- 3.4 .3
.jar -hiveconf hbase.zookeeper.quorum=slave |
接下来可以做一些测试了。
1.创建hbase识别的数据库:
[sql] view plaincopy
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.table.name 定义在hbase的table名称
hbase.columns.mapping 定义在hbase的列族
2.使用sql导入数据
a) 新建hive的数据表
[sql] view plaincopy
<span><span></span></span>hive> CREATE TABLE pokes (foo INT, bar STRING);
b) 批量插入数据
[sql] view plaincopy
1 | hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE |
c) 使用sql导入hbase_table_1
[sql] view plaincopy
hive> INSERT OVERWRITE TABLE hbase_table_1 SELECT * FROM pokes WHERE foo=86;
3. 查看数据
[sql] view plaincopy
hive> select * from hbase_table_1;
这时可以登录Hbase去查看数据了.
> /usr/local/hbase/bin/hbase shell
hbase(main):001:0> describe 'xyz'
hbase(main):002:0> scan 'xyz'
hbase(main):003:0> put 'xyz','100','cf1:val','www.360buy.com'
这时在Hive中可以看到刚才在Hbase中插入的数据了。
hive> select * from hbase_table_1
4. hive访问已经存在的hbase
使用CREATE EXTERNAL TABLE
[sql] view plaincopy
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");
多列和多列族(Multiple Columns and Families)
1.创建数据库
Java代码
CREATE TABLE hbase_table_2(key int, value1 string, value2 int, value3 int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
"hbase.columns.mapping" = ":key,a:b,a:c,d:e"
);
2.插入数据
Java代码
INSERT OVERWRITE TABLE hbase_table_2 SELECT foo, bar, foo+1, foo+2
FROM pokes WHERE foo=98 OR foo=100;
这个有3个hive的列(value1和value2,value3),2个hbase的列族(a,d)
Hive的2列(value1和value2)对应1个hbase的列族(a,在hbase的列名称b,c),hive的另外1列(value3)对应列(e)位于列族(d)
3.登录hbase查看结构
Java代码
1 | hbase(main): 003 : 0 > describe "hbase_table_2" |
2 | DESCRIPTION ENABLED |
3 | {NAME => 'hbase_table_2' , FAMILIES => [{NAME => 'a' , COMPRESSION => 'N true |
4 | ONE ', VERSIONS => ' 3 ', TTL => ' 2147483647 ', BLOCKSIZE => ' 65536 ', IN_M |
5 | EMORY => 'false' , BLOCKCACHE => 'true' }, {NAME => 'd' , COMPRESSION => |
6 | 'NONE' , VERSIONS => '3' , TTL => '2147483647' , BLOCKSIZE => '65536' , IN |
7 | _MEMORY => 'false' , BLOCKCACHE => 'true' }]} |
8 | 1 row(s) in 1.0630 seconds |
4.查看hbase的数据
Java代码
1 | hbase(main): 004 : 0 > scan 'hbase_table_2' |
2 | ROW COLUMN+CELL |
3 | 100 column=a:b, timestamp= 1297695262015 , value=val_100 |
4 | 100 column=a:c, timestamp= 1297695262015 , value= 101 |
5 | 100 column=d:e, timestamp= 1297695262015 , value= 102 |
6 | 98 column=a:b, timestamp= 1297695242675 , value=val_98 |
7 | 98 column=a:c, timestamp= 1297695242675 , value= 99 |
8 | 98 column=d:e, timestamp= 1297695242675 , value= 100 |
9 | 2 row(s) in 0.0380 seconds |
5.在hive中查看
Java代码
1 | hive> select * from hbase_table_2; |
2 | OK |
3 | 100 val_100 101 102 |
4 | 98 val_98 99 100 |
5 | Time taken: 3.238 seconds |
问题:Can not create a Path from an empty string
解决:
hive-env.sh
export HIVE_AUX_JARS_PATH=/hadoop/hive-0.9.0-bin/lib/hive-hbase-handler-0.9.0.jar, /hadoop/hive-0.9.0-bin/lib/hbase-0.94.0.jar, hadoop/hive-0.9.0-bin/lib/zookeeper-3.4.3.jar
参考资料:
http://running.iteye.com/blog/898399
http://heipark.iteye.com/blog/1150648
http://www.javabloger.com/article/apache-hadoop-hive-hbase-integration.html