我在两个表之间执行简单连接时收到此错误.我在Hive命令行中运行此查询.我将表命名为a&b.表a是Hive内部表,b是外部表(在Cassandra中).表a只有1610行,表b有~8百万行.在实际生产场景中,表a可以达到100K行.下面显示的是我与表b的连接作为连接中的最后一个表
选择a.col1,a.col2,b.col3,b.col4 FROM JOIN b ON(a.col1 = b.col1 AND a.col2 = b.col2);
下面显示的是错误
总MapReduce作业= 1
执行日志位于:/tmp/pricadmn/.log
2014-04-09 07:15:36开始启动本地任务来处理地图联接; 最大内存= 932184064
2014-04-09 07:16:41处理行数:200000哈希表大小:199999内存使用情况:197529208百分比:0.212
2014-04-09 07:17:12处理行数:300000哈希表大小:299999内存使用情况: 163894528比例:0.176
2014年4月9日七时十七分43秒处理行:400000哈希表大小:399999内存使用:347109936比例:0.372
... ...
... ...
... ...
2014年4月9日7时24分29秒处理行:1600000哈希表大小:1599999内存使用情况:714454400百分比:0.766
2014-04-09 07:25:03处理行:1700000哈希表大小:1699999内存使用情况:901427928百分比:0.967
执行失败,退出状态:3
获取错误信息
任务失败!
任务ID:
Stage- 5日志
:
/u/applic/pricadmn/dse-4.0.1/logs/hive/hive.log
FAILED:执行错误,从org.apache.hadoop.hive.ql.exec.mr返回代码3 .MapredLocalTask
我正在使用DSE 4.0.1.以下是我可能感兴趣的一些设置
mapred.map.child.java.opts = -Xmx512M
mapred.reduce.child.java.opts = -Xmx512M
mapred.reduce.parallel.copies = 20
hive.auto.convert .加入=真
我将mapred.map.child.java.opts增加到了1G,我得到了更多的记录然后出错了.它看起来不是一个好的解决方案.我也改变了连接中的顺序但没有帮助.我看到这个链接Hive Map join:out of memory Exception但是没有解决我的问题.
对我来说,看起来Hive试图在本地任务阶段将更大的表放在内存中,我感到困惑.根据我的理解,第二张表(在我的情况下表b)应该流入.如果我错了,请纠正我.我们非常感谢您解决此问题的任何帮助.
set hive.auto.convert.join = false;