千家信息网

HBase 与Hive数据交互整合过程详解

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,Hive和Hbase整合理论1、为什么hive要和hbase整合2、整合的优缺点优点:(1).Hive方便地提供了Hive QL的接口来简化MapReduce的使用,而HBase提供了低延迟的数据库访
千家信息网最后更新 2024年11月23日HBase 与Hive数据交互整合过程详解

Hive和Hbase整合理论

1、为什么hive要和hbase整合

2、整合的优缺点

优点:

(1).Hive方便地提供了Hive QL的接口来简化MapReduce的使用,

而HBase提供了低延迟的数据库访问。如果两者结合,可以利

用MapReduce的优势针对HBase存储的大量内容进行离线的计算和分析。

(2).操作方便,hive提供了大量系统功能

缺点:

性能的损失,hive有这样的功能, 他支持通过类似sql语句的语法来操作hbase

中的数据, 但是速度慢。


3、整合需要做什么样的准备工作

4、整合后的目标

(1). 在hive中创建的表能直接创建保存到hbase中。

(2). 往hive中的表插入数据,数据会同步更新到hbase对应的表中。

(3). hbase对应的列簇值变更,也会在Hive中对应的表中变更。

(4). 实现了多列,多列簇的转化:(示例:hive中3列对应hbase中2列簇)


5、hive和Hbase整合后如果通信?

查看hive和Hbase通信图:

主要是通过hive 的lib目录下的hive-hbase-handler-1.2.1.jar来实现hive

和Hbase通信。


整合过程(案例操作)

在hive中创建的表的数据直接保存在hbase中。

第一: 首先启动hive.进入交互式界面,然后创建表。

hive版本: apache-hive-1.2.1

hbase版本:apache-hbase-1.1.2

hadoop版本: hadoop-2.7.3

第一: 创建hbase能识别的表。

建表语句:

create table if not exists hive_hbase(

id int,

name String,

age int,

sex String,

address String

)

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

WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf_info:eName,cf_info:eAge,cf_info:eSex,cf_beizhu:eAddress")

TBLPROPERTIES ("hbase.table.name" = "ns2:hive_hbase01");


注意: 此处的 org.apache.hadoop.hive.hbase.HBaseStorageHandler 类是hive的lib包下的,需要替换成.hive-1.2.1版本的jar包。否则会报错提示找不到这个类。

错误提示:FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. org.apache.hadoop.hbase.HTableDescriptor.addFamily(Lorg/apache/hadoop/hbase/HColumnDescriptor;)V

也不能hive版本过高。比如2.x版本会报错

Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

要确保hive目录的lib目录下有mysql-connector的数据库包。否则也会报错。

创建后可以在hbase中查看一下表。list

第二:

自己准备测试数据。此处省略

create table test(

id int,

name string)

row format delimited fields terminated by ','

lines terminated by '\n'

stored as textfile;

加载数据到表中:

load data local inpath '/usr/local/test01.txt' overwrite into table test;

通过结果集的方式插入数据到表中

insert overwrite table hive_hbase select * from test;

此处会跑mapreduce程序。过程省略。

第三: 在hbase中查询插入的 数据

select * from hive_hbase;

20170616,zhangshaoqi,22,nan,jincheng

20170617,xuqianya,29,nv,beijing

20170618,xiaolin,29,nv,jincheng

20170619,xiaopan,33,nan,guizhou

20170620,xiaohu,26,nan,shouzhou

1 row(s) in 3.19 seconds
第四:在hbase中扫描这个表,查看是否有数据

scan 'ns2:hive_hbase01'

第五: hive访问已经存在的hbase

需要使用external 类型的外部表,否则会报错

REATE EXTERNAL TABLE hbase_table_3(key int, value string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = "info:name")
TBLPROPERTIES("hbase.table.name" = "student");
hive> CREATE EXTERNAL TABLE hbase_table_3(key int, value string)
> STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
> WITH SERDEPROPERTIES ("hbase.columns.mapping" = "info:name")
> TBLPROPERTIES("hbase.table.name" = "student");
OK
Time taken: 1.21 seconds

注意:如果hbase中列簇名name数据变更,那么hive中查询结果也会相应的变更,如果hbase中不是其他列簇
内容更新则hive中查询结果不显示

就这些了,有问题欢迎讨论


0