hbase hdfs外部表_hive关联查询连接hbase的外部表时,内存溢出问题

计划把数据都保存到hbase中,而查询统计数据使用hive。在把数据灌入hbase中后,发现两个外部表的数据大概在200万和300万左右,join查询后报错,内存溢出。错误如下方

“默认情况下,Hive会自动将小表加到DistributeCache中,然后在Map扫描大表的时候,去和DistributeCache中的小表做join,这称为Mapjoin。”

这里意思是,因为查询的表是连接hbase后的外部表,所以在hive的存储目录中是空的目录,数据文件大小是0,所以hive将之视为小数据表,会把它加载到DistributeCache并进行mapjoin。但实际上数据量是很大的,结果就内存溢出了。

解决方法:

在hive中执行以下命令:

SET mapred.job.queue.name=queue3;

SET hbase.client.scanner.caching=10000;

SET hbase.zookeeper.quorum=node1,node2,node3,node4,node5;

SET zookeeper.znode.parent=/hbase;

SET hbase.regionserver.lease.period=180000;

SET hive.auto.convert.join=false;

SET hive.ignore.mapjoin.hint=false;

其中SET mapred.job.queue.name=queue3;是设置一个queue队列,我的hadoop没有配置队列,我也不太熟,直接改为SET mapred.job.queue.name=default;(貌似不执行就是default吧)

SET hbase.client.scanner.caching=10000;是设置hbase每次所描数据的记录个数,默认是1的,改了会有较大性能提升。

SET hbase.zookeeper.quorum=node1,node2,node3,node4,node5;设置zookeeper

SET zookeeper.znode.parent=/hbase;这个还不知道

set hbase.regionserver.lease.period=180000; 这个也不清楚

SET hive.auto.convert.join=false;关闭自动转化MapJoin,默认为true;

SET hive.ignore.mapjoin.hint=false;关闭忽略mapjoin的hints(不忽略,hints有效),默认为true(忽略hints)。

hive的sql执行后,内存溢出的日志信息如下:

Query ID = hadoop_20150826162508_4c06d5ea-0f33-485d-8e0d-904dc67f51b1

Total jobs = 1

Execution log at: /tmp/hadoop/hadoop_20150826162508_4c06d5ea-0f33-485d-8e0d-904dc67f51b1.log

2015-08-26 16:25:17     Starting to launch local task to process map join;      maximum memory = 477102080

2015-08-26 16:27:09     Dump the side-table for tag: 1 with group count: 60765 into file: file:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值