当前位置:   article > 正文

【HBASE插入数据】HBASE与HIVE映射表_hive 映射hbase表外部表

hive 映射hbase表外部表

1. 创建HBASE

create 'bd:od_t1','cf'

需要注意的:

一定要指定压缩格式COMPRESSION=>'SNAPPY',否则写入Hbase的数据会很大 如果数据量巨大(总量超1亿)要先预分区,预分区可以直接指定,比如SPLITS => ['0|', '1|', '2|'],若预分区数量大可先写入一个文件中再使用{SPLITS_FILE => '/data/zp_dw/init/hbase/split.txt'}进行分区。预分区直接会影响到写入的效率,合理的分区能带来5倍以上效率的提升 预分区是以Hbase中表的Rowkey进行的分区,一般而言如果rowkey开头是数字,那么我们会以数字开头,并以|结尾来作为预分区的边界。 若不需要多版本存储,可以指定VERSIONS=>1版本号为1.

2. 创建 hive 外部表

  1. -- hbase 机器
  2. set hbase.zookeeper.quorum="192.12.141,192.12.142,192.12.143";
  3. -- hive 的库名
  4. use ods ;
  5. --hive 和 HBASE 映射表名
  6. ods_hbase_1
  7. -- 原始数据源表名
  8. ods_1
  9. -- HBASE 表名
  10. bd:od_t1
  11. CREATE EXTERNAL TABLE if not exists ods.ods_hbase_1
  12. (
  13. key string comment data_day|id|logid ',
  14. data_day string comment ' 时间 ',
  15. id string comment 'id',
  16. name string comment ' 姓名 ',
  17. logid string comment ' 日志 id'
  18. )
  19. STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
  20. WITH SERDEPROPERTIES
  21. ( \" hbase.columns.mapping \" = \"
  22. :key,
  23. cf:data_day,
  24. cf:id,
  25. cf:name,
  26. cf:logid \"
  27. )
  28. TBLPROPERTIES( \" hbase.table.name \" = \" bd:od_t1 \" );

需要注意的

hive表应为外部表,创建时加external关键字 指定存储为stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' 需要指定hive字段与Hbase列的mapping,"hbase.columns.mapping" = ":key, cf1:data_day, cf1:, name...... 指定Hbase表的属性信息。

3. 往映射表插入数据

Hive映射Hbase表,主要用来向Hbase推送数据。建立映射后向Hive表写入数据会实时写到Hbase对应的表中。写入时可设置参数加快写入速度。比如:

  1. SET hive.hbase.bulk=true;
  2. set hbase.zookeeper.quorum="192.12.141,192.12.142,192.12.143";
  3. insert into table ods.ods_hbase_1
  4. select 
  5. concat(data_day,"|",id,"|",logid) as key,
  6. data_day,
  7. id,
  8. name,
  9. logid
  10. from ods.ods_1;

需要注意:合理的参数会加快写入速度,比如:

  1. set hive.hbase.bulk=true;
  2. set hive.hbase.wal.enabled=false;

实际使用中HBase的优势和问题

先说优势,在明确rowkey的情况下,随机存取海量数据无压力,而且可根据数据大小自动水平扩展,数据量不会成为瓶颈。底层基于HDFS构建,数据都有副本冗余存储,可靠性和高可用都有保证。

遇到的问题

我们将Hive映射至Hbase表,写入数据后。发现某些数据行中会多出一个空列,名称为_0。因为是随机出现,且该数据只通过Hive写入,所以一直怀疑是Hive的bug。近期频繁发生,决定彻底解决一下,下载了hive的源码,其中包org.apache.hadoop.hive.hbase下有写入Hbase的相关操作,查看并未发现有写空列的操作,Hive写Hbase是根据建表是的列映射信息进行的。空列与hive没有关系。继续梳理于hbase有关的服务,发现Phoenix比较可疑,当时为了查询方面,安装了Phoenix,并建表与hbase关联。查看Phoenix文档,其中有一句The empty or dummy KeyValue (with a column qualifier of _0) is needed to ensure that a given column is available for all rows.,原因定位,去除Phoenix与hbase映射,问题解决。

 

当然问题也不少:

  1. 首要的是二级索引问题,HBase并未原生支持二级索引,第三方Phoenix等实现的又并不完善,使用有很大的局限。比如:用户行为轨迹数据,rowkey的组成“用户_id+日期+本行hash值”,这样前台应用可按用户id非常快的找到该用户的所有轨迹数据,但如果我们要按日期查找就无能为力了,只有扫描全表百亿数据才行,当数据按天写入,想核验某一日期写入的数据是否正确,就非常麻烦。
  2. 其次Hbase原生只支持API访问,并没有sql接口,对于使用来说还是很复杂,需要了解Hbase的好多概念才能正确使用。
  3. 对于数据的聚合,目前Hbase是无能为力,只能通过基于Hbase的Kylin、Phoenix等第三方应用实现。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/78957
推荐阅读
相关标签
  

闽ICP备14008679号