淘先锋技术网

首页 1 2 3 4 5 6 7

HBase 整合 Hive
1、原理
Hive 与 HBase 利用两者本身对外的 API 来实现整合,主要是靠 HBaseStorageHandler 进
行通信,利用 HBaseStorageHandler,Hive 可以获取到 Hive 表对应的 HBase 表名,列簇以及
列,InputFormat 和 OutputFormat 类,创建和删除 HBase 表等。
Hive 访问 HBase 中表数据,实质上是通过 MapReduce 读取 HBase 表数据,其实现是在 MR
中,使用 HiveHBaseTableInputFormat 完成对 HBase 表的切分,获取 RecordReader 对象来读
取数据。
对 HBase 表的切分原则是一个 Region 切分成一个 Split,即表中有多少个 Regions,MR 中就
有多少个 Map。
读取 HBase 表数据都是通过构建 Scanner,对表进行全表扫描,如果有过滤条件,则转化为
Filter。当过滤条件为 rowkey 时,则转化为对 rowkey 的过滤,Scanner 通过 RPC 调用
RegionServer 的 next()来获取数据
2、准备 HBase 表和数据
创建 HBase 表:
create ‘mingxing’,{NAME => ‘base_info’,VERSIONS => 1},{NAME => ‘extra_info’,VERSIONS => 1}
插入准备数据:
put ‘mingxing’,‘rk001’,‘base_info:name’,‘huangbo’
put ‘mingxing’,‘rk001’,‘base_info:age’,‘33’
put ‘mingxing’,‘rk001’,‘extra_info:math’,‘44’
put ‘mingxing’,‘rk001’,‘extra_info:province’,‘b’
put ‘mingxing’,‘rk002’,‘base_info:name’,‘xuzheng’
put ‘mingxing’,‘rk002’,‘base_info:age’,‘44’
put ‘mingxing’,‘rk003’,‘base_info:name’,‘wangbaoqiang’
put ‘mingxing’,‘rk003’,‘base_info:age’,‘55’
put ‘mingxing’,‘rk003’,‘base_info:gender’,‘male’
put ‘mingxing’,‘rk004’,‘extra_info:math’,‘33’
put ‘mingxing’,‘rk004’,‘extra_info:province’,‘tianjin’
put ‘mingxing’,‘rk004’,‘extra_info:children’,‘3’
put ‘mingxing’,‘rk005’,‘base_info:name’,‘liutao’
put ‘mingxing’,‘rk006’,‘extra_info:name’,‘liujialing’
3、Hive 端操作
hive VS hbase
https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration
/home/bigdata/app/hive/bin/hive --auxpath /home/bigdata/app/hive/lib/hive-hbase-handler-2.1.0.jar,/home/bigdata/app/hive/lib/zookeeper-3.4.6.jar,/home/bigdata/app/hive/lib/guava-14.0.1.jar --hiveconf hbase.master=bigdata01:16010
CREATE EXTERNAL TABLE hhh1 (
id int,
name string,
age int
) STORED BY ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’
WITH SERDEPROPERTIES (“hbase.columns.mapping” = “:key,f:name,f:age”)
TBLPROPERTIES (“hbase.table.name” = “xyz”);
在hive中如果关联hbase中已经存在的表,要使用外部表,反之使用内部关联的话,会在hbase中创建对应的新表。

CREATE EXTERNAL TABLE event_log_hourly (
rowkey string,
u_ud string,
pl string,
s_time bigint,
bt string,
bv string,
province string
) STORED BY ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’
WITH SERDEPROPERTIES (“hbase.columns.mapping” = “:key,f:u_ud, f:pl,f:s_time,f:bt, f:bv, f:province”)
TBLPROPERTIES (“hbase.table.name” = “nginx_js”);
进入 Hive 客户端,需要进行一下参数设置:
指定 hbase 所使用的 zookeeper 集群的地址:默认端口是 2181,可以不写
set hbase.zookeeper.quorum=hadoop03:2181,hadoop04:2181,hadoop05:2181;
指定 hbase 在 zookeeper 中使用的根目录
set zookeeper.znode.parent=/hbase;
加入指定的处理 jar
add jar /home/hadoop/apps/apache-hive-1.2.1-bin/lib/hive-hbase-handler-1.2.1.jar;
创建基于 HBase 表的 hive 表:
所有列簇:
create external table mingxing(rowkey string, base_info map<string, string>, extra_info
map<string, string>)
row format delimited fields terminated by ‘\t’
stored by ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’
with serdeproperties (“hbase.columns.mapping” = “:key,base_info:,extra_info:”)
tblproperties (“hbase.table.name” = “mingxing”);
部分列簇部分列:
create external table mingxing1(rowkey string, name string, province string)
row format delimited fields terminated by ‘\t’
stored by ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’
with serdeproperties (“hbase.columns.mapping” = “:key,base_info:name,extra_info:province”)
tblproperties (“hbase.table.name” = “mingxing”);
org.apache.hadoop.hive.hbase.HBaseStorageHandler:处理 hive 到 hbase 转换关系的处理器
hbase.columns.mapping:定义 hbase 的列簇和列到 hive 的映射关系
hbase.table.name:hbase 表名