设为首页 收藏本站
查看: 564|回复: 0

[经验分享] Hadoop Hive与Hbase关系 整合

[复制链接]

尚未签到

发表于 2016-12-9 08:24:24 | 显示全部楼层 |阅读模式
用hbase做数据库,但由于hbase没有类sql查询方式,所以操作和计算数据非常不方便,于是整合hive,让hive支撑在hbase数据库层面 的 hql查询.hive也即 做数据仓库

1. 基于Hadoop+Hive架构对海量数据进行查询:http://blog.csdn.net/kunshan_shenbin/article/details/7105319
2. HBase 0.90.5 + Hadoop 1.0.0 集成:http://blog.csdn.net/kunshan_shenbin/article/details/7209990
本文的目的是要讲述如何让Hbase和Hive能互相访问,让Hadoop/Hbase/Hive协同工作,合为一体。
本文测试步骤主要参考自:http://running.iyunv.com/blog/898399
当然,这边博文也是按照官网的步骤来的:http://wiki.apache.org/hadoop/Hive/HBaseIntegration
1. 拷贝hbase-0.90.5.jar和zookeeper-3.3.2.jar到hive/lib下。
注意:如何hive/lib下已经存在这两个文件的其他版本(例如zookeeper-3.3.1.jar),建议删除后使用hbase下的相关版本。
2. 修改hive/conf下hive-site.xml文件,在底部添加如下内容:


[html] view plaincopy
<!--  
<property>  
<name>hive.exec.scratchdir</name>   
<value>/usr/local/hive/tmp</value>   
</property>   
-->  
<property>   
<name>hive.querylog.location</name>   
<value>/usr/local/hive/logs</value>   
</property>   
<property>  
<name>hive.aux.jars.path</name>   
<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>  
</property>  


注意:如果hive-site.xml不存在则自行创建,或者把hive-default.xml.template文件改名后使用。

具体请参见:http://blog.csdn.net/kunshan_shenbin/article/details/7210020


3. 拷贝hbase-0.90.5.jar到所有hadoop节点(包括master)的hadoop/lib下。

4. 拷贝hbase/conf下的hbase-site.xml文件到所有hadoop节点(包括master)的hadoop/conf下。

注意,hbase-site.xml文件配置信息参照:http://blog.csdn.net/kunshan_shenbin/article/details/7209990

注意,如果3,4两步跳过的话,运行hive时很可能出现如下错误:  [html] view plaincopy
org.apache.hadoop.hbase.ZooKeeperConnectionException: HBase is able to connect to ZooKeeper but the connection closes immediately.

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

then make sure you are reusing HBaseConfiguration as often as you can. See HTable's javadoc for more information. at org.apache.hadoop.

hbase.zookeeper.ZooKeeperWatcher.

参考:http://blog.sina.com.cn/s/blog_410d18710100vlbq.html

现在可以尝试启动Hive了。
单节点启动:



> bin/hive -hiveconf hbase.master=master:60000


集群启动:
> bin/hive -hiveconf hbase.zookeeper.quorum=slave
如何hive-site.xml文件中没有配置hive.aux.jars.path,则可以按照如下方式启动。
> bin/hive --auxpath /usr/local/hive/lib/hive-hbase-handler-0.8.0.jar, /usr/local/hive/lib/hbase-0.90.5.jar, /usr/local/hive/lib/zookeeper-3.3.2.jar -hiveconf hbase.zookeeper.quorum=slave
接下来可以做一些测试了。

1.创建hbase识别的数据库:


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
hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE

pokes;

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代码

hbase(main):003:0> describe "hbase_table_2"

DESCRIPTION ENABLED

{NAME => 'hbase_table_2', FAMILIES => [{NAME => 'a', COMPRESSION => 'N true

ONE', VERSIONS => '3', TTL => '2147483647', BLOCKSIZE => '65536', IN_M

EMORY => 'false', BLOCKCACHE => 'true'}, {NAME => 'd', COMPRESSION =>

'NONE', VERSIONS => '3', TTL => '2147483647', BLOCKSIZE => '65536', IN

_MEMORY => 'false', BLOCKCACHE => 'true'}]}

1 row(s) in 1.0630 seconds

4.查看hbase的数据

Java代码

hbase(main):004:0> scan 'hbase_table_2'

ROW COLUMN+CELL

100 column=a:b, timestamp=1297695262015, value=val_100

100 column=a:c, timestamp=1297695262015, value=101

100 column=d:e, timestamp=1297695262015, value=102

98 column=a:b, timestamp=1297695242675, value=val_98

98 column=a:c, timestamp=1297695242675, value=99

98 column=d:e, timestamp=1297695242675, value=100

2 row(s) in 0.0380 seconds

5.在hive中查看

Java代码

hive> select * from hbase_table_2;

OK

100 val_100 101 102

98 val_98 99 100

Time taken: 3.238 seconds

参考资料:

http://running.iyunv.com/blog/898399

http://heipark.iyunv.com/blog/1150648

http://www.javabloger.com/article/apache-hadoop-hive-hbase-integration.html




用hbase做数据库,但由于hbase没有类sql查询方式,所以操作和计算数据非常不方便,于是整合hive,让hive支撑在hbase数据库层面 的 hql查询.hive也即 做数据仓库

1. 基于Hadoop+Hive架构对海量数据进行查询:http://blog.csdn.net/kunshan_shenbin/article/details/7105319
2. HBase 0.90.5 + Hadoop 1.0.0 集成:http://blog.csdn.net/kunshan_shenbin/article/details/7209990
本文的目的是要讲述如何让Hbase和Hive能互相访问,让Hadoop/Hbase/Hive协同工作,合为一体。
本文测试步骤主要参考自:http://running.iyunv.com/blog/898399
当然,这边博文也是按照官网的步骤来的:http://wiki.apache.org/hadoop/Hive/HBaseIntegration
1. 拷贝hbase-0.90.5.jar和zookeeper-3.3.2.jar到hive/lib下。
注意:如何hive/lib下已经存在这两个文件的其他版本(例如zookeeper-3.3.1.jar),建议删除后使用hbase下的相关版本。
2. 修改hive/conf下hive-site.xml文件,在底部添加如下内容:


[html] view plaincopy
<!--  
<property>  
<name>hive.exec.scratchdir</name>   
<value>/usr/local/hive/tmp</value>   
</property>   
-->  
<property>   
<name>hive.querylog.location</name>   
<value>/usr/local/hive/logs</value>   
</property>   
<property>  
<name>hive.aux.jars.path</name>   
<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>  
</property>  


注意:如果hive-site.xml不存在则自行创建,或者把hive-default.xml.template文件改名后使用。

具体请参见:http://blog.csdn.net/kunshan_shenbin/article/details/7210020


3. 拷贝hbase-0.90.5.jar到所有hadoop节点(包括master)的hadoop/lib下。

4. 拷贝hbase/conf下的hbase-site.xml文件到所有hadoop节点(包括master)的hadoop/conf下。

注意,hbase-site.xml文件配置信息参照:http://blog.csdn.net/kunshan_shenbin/article/details/7209990

注意,如果3,4两步跳过的话,运行hive时很可能出现如下错误:  [html] view plaincopy
org.apache.hadoop.hbase.ZooKeeperConnectionException: HBase is able to connect to ZooKeeper but the connection closes immediately.

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

then make sure you are reusing HBaseConfiguration as often as you can. See HTable's javadoc for more information. at org.apache.hadoop.

hbase.zookeeper.ZooKeeperWatcher.

参考:http://blog.sina.com.cn/s/blog_410d18710100vlbq.html

现在可以尝试启动Hive了。
单节点启动:



> bin/hive -hiveconf hbase.master=master:60000


集群启动:
> bin/hive -hiveconf hbase.zookeeper.quorum=slave
如何hive-site.xml文件中没有配置hive.aux.jars.path,则可以按照如下方式启动。
> bin/hive --auxpath /usr/local/hive/lib/hive-hbase-handler-0.8.0.jar, /usr/local/hive/lib/hbase-0.90.5.jar, /usr/local/hive/lib/zookeeper-3.3.2.jar -hiveconf hbase.zookeeper.quorum=slave
接下来可以做一些测试了。

1.创建hbase识别的数据库:


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
hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE

pokes;

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代码

hbase(main):003:0> describe "hbase_table_2"

DESCRIPTION ENABLED

{NAME => 'hbase_table_2', FAMILIES => [{NAME => 'a', COMPRESSION => 'N true

ONE', VERSIONS => '3', TTL => '2147483647', BLOCKSIZE => '65536', IN_M

EMORY => 'false', BLOCKCACHE => 'true'}, {NAME => 'd', COMPRESSION =>

'NONE', VERSIONS => '3', TTL => '2147483647', BLOCKSIZE => '65536', IN

_MEMORY => 'false', BLOCKCACHE => 'true'}]}

1 row(s) in 1.0630 seconds

4.查看hbase的数据

Java代码

hbase(main):004:0> scan 'hbase_table_2'

ROW COLUMN+CELL

100 column=a:b, timestamp=1297695262015, value=val_100

100 column=a:c, timestamp=1297695262015, value=101

100 column=d:e, timestamp=1297695262015, value=102

98 column=a:b, timestamp=1297695242675, value=val_98

98 column=a:c, timestamp=1297695242675, value=99

98 column=d:e, timestamp=1297695242675, value=100

2 row(s) in 0.0380 seconds

5.在hive中查看

Java代码

hive> select * from hbase_table_2;

OK

100 val_100 101 102

98 val_98 99 100

Time taken: 3.238 seconds

参考资料:

http://running.iyunv.com/blog/898399

http://heipark.iyunv.com/blog/1150648

http://www.javabloger.com/article/apache-hadoop-hive-hbase-integration.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-311649-1-1.html 上篇帖子: Hadoop 稳定性与性能提升浅析 下篇帖子: Hadoop-- 海量文件的分布式计算处理方案
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表