Hive映射Hbase

  • Hbase表已存在

  1. 在Hive里只能创建外部表与其映射

  2. 删除Hive表的同时不会删除Hbase表及数据

  3. 数据最终存在Hbase中

  4. 不能使用load方式向hive导入数据

hive建外部表语句样例:

CREATE EXTERNAL TABLE person(
key 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" = "person");

 针对已存在的hbase表,如果没开启压缩,执行

disable 'person'
alter 'person',{NAME=>'f', COMPRESSION=>'snappy'}
enable 'person'
# 对已有数据进行压缩
major_compact 'person'

PS : bin/hbase org.apache.hadoop.util.NativeLibraryChecker #检查支持的压缩
  • Hbase表不存在

  1. 在Hive里只能创建内部表与其映射,且会自动在Hbase中创建表,且没有开启压缩

  2. 删除Hive表的同时会删除Hbase表及数据

  3. 数据最终存在Hbase中

  4. 不能使用load方式向hive导入数据

hive建内部表语句样例:

CREATE TABLE person(
key 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" = "person");

hbase表开启压缩样例:

disable 'person'
alter 'person',{NAME=>'f', COMPRESSION=>'snappy'}
enable 'person'

PS : bin/hbase org.apache.hadoop.util.NativeLibraryChecker #检查支持的压缩
  • Exception

  1. Hive Runtime Error: Map local work exhausted memory

原因:默认hive开启mapjoin,当数据量小于设置的值则采用mapjoin,因为hive映射hbase,数据都存在hbase里,hive里是没有数据的,所以会采用mapjoin,但是实际从hbase拉取数据的时候,很可能会非常大,造成OOM。

解决:

set hbase.client.scanner.caching=10000; #hbase拉取数据量cache
set hbase.regionserver.lease.period=180000; #hbase regionserver租赁周期,客户端必须在此周期内报告,否则被认为未活动
set hive.auto.convert.join=false; #关闭自动转化mapjoin
set hive.ignore.mapjoin.hint=false; #关闭忽略显式mapjoin,也就是打开显式mapjoin

例如select  /*+ mapjoin(t1) */ t1.id,t2.id from tb1 as t1 join tb2 as t2 on t1.id = t2.id 就是将t1表cache进行mapjoin

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值