Hive onver Hbase详解

7 篇文章 0 订阅

Hive为什么与Hbase集成?

         Hbase不支持SQL语句查询,如果要实现count\group等操作需要借助Mapreduce程序,门槛较高;

         Hive对于SQL的支持有强大的功能,我们不需要写过多的自定义函数就能实现较为复杂的查询;

Hive over Hbase优缺点

优点:

1、Hive方便地提供了Hive QL的接口来简化MapReduce的使用,而HBase提供了低延迟的数据库访问。如果两者结合,可以利用MapReduce的优势针对HBase存储的大量内容进行离线的计算和分析;

2、操作方便,hive提供了大量系统功能;

3、降低业务开发人员技术门槛,只需要掌握SQL即可;

 

缺点:

性能的损失,hive有这样的功能, 他支持通过类似sql语句的语法来操作hbase中的数据, 但是速度慢;

 

限制条件:

Hbase表需要有多个字段,如果是单列,字段采用特殊字符分隔,那么导入

集成步骤

1、将以下jar包拷贝到$HIVE_HOME/lib/目录中

cp hbase-common-1.0.0-cdh5.5.0.jar$HIVE_HOME/lib/

cp hbase-server-1.0.0-cdh5.5.0.jar$HIVE_HOME/lib/

cp hbase-client-1.0.0-cdh5.5.0.jar$HIVE_HOME/lib/

cp hbase-protocol-1.0.0-cdh5.5.0.jar$HIVE_HOME/lib/

cp hbase-hadoop2-compat-1.0.0-cdh5.5.0.jar $HIVE_HOME/lib/

cp hbase-hadoop-compat-1.0.0-cdh5.5.0.jar$HIVE_HOME/lib/

cp htrace-core-3.2.0-incubating.jar$HIVE_HOME/lib/

cp netty-all-4.0.23.Final.jar$HIVE_HOME/lib/

cp metrics-core-2.2.0.jar  $HIVE_HOME/lib/

2、在hive-site.xml中增加以下配置

<property>

<name>hbase.zookeeper.quorum</name>

<value>master:2181,slave1:2182,slave2:2183</value>

</property>

<property>

<name>hive.aux.jars.path</name>

            <value>file:///cdh550/hive/lib/hive-hbase-handler-1.1.0-cdh5.5.0.jar,file:///cdh550/hive/lib/hbase-common-1.0.0-cdh5.5.0.jar,file:///cdh550/hive/lib/hbase-server-1.0.0-cdh5.5.0.jar,file:///cdh550/hive/lib/hbase-client-1.0.0-cdh5.5.0.jar,file:///cdh550/hive/lib/hbase-protocol-1.0.0-cdh5.5.0.jar,file:///cdh550/hive/lib/zookeeper-3.4.5-cdh5.5.0.jar</value>

</property>

3、启动Hive服务端

nohup hive --service metastore  > metastore.log&

nohup hive --service hiveserver2>hiveserver2.log &

 

4、启动hive客户端

hive [-hiveconf hive.root.logger=DEBUG,console]

测试

Hive关联已存在Hbase表

CREATE EXTERNAL TABLE hive_hbase_1(keystring, value string)    

STORED BY'org.apache.hadoop.hive.hbase.HBaseStorageHandler'    

WITH SERDEPROPERTIES("hbase.columns.mapping" = "c1:d1")    

TBLPROPERTIES("hbase.table.name"= "platjava_test_20170401", "hbase.mapred.output.outputtable"= " platjava_test_20170401");

 

--hbase.columns.mapping指向对应的列族;多列时,data:1,data:2;多列族时,data1:1,data2:1;

--hbase.table.name指向对应的表;hbase_table_2(keystring, value string),这个是关联表。

 

注意:

建表或映射表的时候如果没有指定:key则第一个列默认就是行键

HBase对应的Hive表中没有时间戳概念,默认返回的就是最新版本的值

由于HBase中没有数据类型信息,所以在存储数据的时候都转化为String类型

Hive创建Hbase识别的表

CREATE TABLE hbase_table_1(key int, valuestring)

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.table.name:参数是可选的,是Hbase可识别的名字,如果不设置则和Hive表名一致;

在Hive中创建的和Hbase整合的表不支持load data导入数据,需要在Hive中创建中间表导入数据后采用insert方式导入数据。

将Hive数据导入Hbase

         例:INSERTOVERWRITE TABLE hbase_table_1 SELECT * FROM pokes WHERE foo=98;

         当有大量数据导入Hbase时,建议将WAL关闭:sethive.hbase.wal.enabled=false;

遇到的问题

创建表失败

问题描述

FAILED: Execution Error, return code 1 fromorg.apache.hadoop.hive.ql.exec.DDLTask. java.lang.RuntimeException: MetaException(message:org.apache.hadoop.hive.serde2.SerDeExceptionorg.apache.hadoop.hive.hbase.HBaseSerDe: columns has 1 elements whilehbase.columns.mapping has 2 elements (counting the key if implicit))

问题解决

在创建hive/hbase相关联的表时,hbase表结构默认会有一个字段key,如果没有一个显示的字段'key'那么在创建表时,会自己创建,这样hive对应的表就会出现问题,所以在hive对应的表里一定要加上key这个字段,为了避免这个问题,在hbase表结构里可以显示的添加'key'字段,这样不容易出问题。

遗留问题

1、  Hive SQL在执行过程中是否会对Hbase的实时数据读写造成影响?(不考虑主机资源情况下)

2、  Hbase单列数据,按特殊字符分隔,希望在Hive中按特殊字符拆分到多个字段,如何进行关联?

参考资料

https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration

http://www.aboutyun.com/thread-7317-1-1.html

http://www.aboutyun.com/thread-6546-1-1.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值