1.整合操作

    hive整合hbase实际上是为用户提供一种sqlOnHbase的方法。Hive和HBase通过接口互通,用户可以方便地通过SQL接口进行建表、映射表、查询、删除等操作。由于对于hiveOnHbase表的查询走MR框架,因此查询效率较为缓慢需酌情使用。

    在非CM管理的CDH集群进行整合时需以下几步:1.拷贝hbase相关jar包、 2.修改配置文件、  3.重启hive服务

1> 修改hive配置

hive 映射hbase外部表 hbase表映射hive表_python

2> 更新过期配置

hive 映射hbase外部表 hbase表映射hive表_hive 映射hbase外部表_02

3> 重启相关服务

hive 映射hbase外部表 hbase表映射hive表_hive_03



2.内部表

    在hive中建立hbase的内部映射表,会同时在hive和hbase两端都执行建表操作,要求hbase端的表事先不存在。hive端执行表删除操作时,hbase对应的表也会被删除。

1> hive中建表

    hive建表时定义hbase对应表名为HIVEIN2HBASE,其包含一个列族0和两个列PARENTID、DEPARTMENTID 

CREATE TABLE test.hivein2hbase
  (key string, 
   parentid string,
   departmentid string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
  WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,0:PARENTID,0:DEPARTMENTID")
TBLPROPERTIES ("hbase.table.name" = "HIVEIN2HBASE", "hbase.mapred.output.outputtable" = "HIVEIN2HBASE")

hbase.columns.mapping:
    定义HBase表列族和列":key,CF1:Col1,CF1:Col2..."。使用“:key”映射行健,用户可以把映射行健放置在任意位置
hbase.table.name:
    可选参数,仅当用户想在Hive和HBase中使用不同表名时才需要填写。定义相同表名可省略
hbase.mapred.output.outputtable:
    可选参数,仅当你想往这个表中插入数据时使用(在hbase.mapreduce.TableOutputFormat中使用到)

2> hbase查看表结构

    hbase中对应的表也已经建立,通过描述信息可知hbase表包含了一个名称为“0”的列族。

hive 映射hbase外部表 hbase表映射hive表_hive 映射hbase外部表_04

3> hive中插入数据

    将hive中的一张表的数据插入hivein2hbase中,插入操作会通过hive的MR实现插入操作。

insert into table hivein2hbase select * from dim_staff;

4> hbase查看数据

hive 映射hbase外部表 hbase表映射hive表_建表_05



3.外部表

    在hive中建立hbase的外部映射表,只在hive端执行建表操作,要求hbase端的表事先存在。hive端执行表删除操作时,只会删除hive端的外部映射表,对hbase中被映射的表无影响

1> hbase已存在表

hive 映射hbase外部表 hbase表映射hive表_大数据_06

2> hive中建立映射表

CREATE EXTERNAL TABLE test.hiveout2hbase
  (key string, 
   parentid string,
   departmentid string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
  WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,0:PARENTID,0:DEPARTMENTID")
TBLPROPERTIES ("hbase.table.name" = "TESTA", "hbase.mapred.output.outputtable" = "TESTA")

3> hive中查询

hive 映射hbase外部表 hbase表映射hive表_hive 映射hbase外部表_07



4.优化

1> 预分区

    对HBase表进行预分区,增大其MapReduce作业的并行度

2> 合理设计rowkey
    合理的设计rowkey使其尽可能的分布在预先分区好的Region上

3> 设置参数
    set hbase.client.scanner.caching设置合理的扫描缓存(内存未提供数据的情况下扫描仪下次调用时所提取的行数。较高缓存值需启用较快速度的扫描仪,但这需要更多的内存且当缓存为空时某些下一次调用会运行较长时间)