-
Hbase表已存在
-
在Hive里只能创建外部表与其映射
-
删除Hive表的同时不会删除Hbase表及数据
-
数据最终存在Hbase中
-
不能使用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表不存在
-
在Hive里只能创建内部表与其映射,且会自动在Hbase中创建表,且没有开启压缩
-
删除Hive表的同时会删除Hbase表及数据
-
数据最终存在Hbase中
-
不能使用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
- 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