11

在两个表之间执行简单连接时出现此错误。我在 Hive 命令行中运行此查询。我将表命名为 a & b。表 a 是 Hive 内部表,b 是外部表(在 Cassandra 中)。表 a 只有 1610 行,表 b 有大约 800 万行。在实际生产场景中,表 a 可以达到 100K 行。下面显示的是我与表 b 作为连接中的最后一个表的连接

从 a JOIN b ON (a.col1=b.col1 AND a.col2=b.col2) 中选择 a.col1、a.col2、b.col3、b.col4;

下图是错误

MapReduce 作业总数 = 1
执行日志位于:/tmp/pricadmn/.log
2014-04-09 07:15:36 开始启动本地任务以处理 map join;最大内存 = 932184064
2014-04-09 07:16:41 处理行数:200000 哈希表大小:199999 内存使用率:197529208 百分比:0.212
2014-04-09 07:17:12 处理行数:300000 哈希表大小:299999 内存使用率: 163894528 百分比:0.176
2014-04-09 07:17:43 处理行数:400000 哈希表大小:399999 内存使用率:347109936 百分比:0.372
...
...
...

2014-04-09 07:24:29 处理行数:1600000 哈希表大小:1599999 内存使用率:714454400 百分比:0.766
2014-04-09 07:25:03 处理行数:1700000 哈希表大小:1699999 内存使用率:901427928 百分比:0。
执行失败,退出状态:3
获取错误信息


任务失败!
任务 ID:
Stage-5

日志:

/u/applic/pricadmn/dse-4.0.1/logs/hive/hive.log
失败:执行错误,从 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 感兴趣.join=true

我将 mapred.map.child.java.opts 增加到 1G,我又得到了几条记录,然后出错了。这看起来不是一个好的解决方案。我也改变了加入的顺序,但没有帮助。我看到了这个链接Hive Map join : out of memory Exception但没有解决我的问题。

对我来说,看起来 Hive 正试图在本地任务阶段将更大的表放入内存中,这让我感到困惑。根据我的理解,第二个表(在我的情况下是表 b)应该被流入。如果我错了,请纠正我。非常感谢解决此问题的任何帮助。

4

3 回答 3

33
set hive.auto.convert.join = false;
于 2014-10-31T09:43:08.623 回答
2

您的任务似乎内存不足。检查MapredLocalTask​​ 类的第 324 行

 } catch (Throwable e) {
  if (e instanceof OutOfMemoryError
      || (e instanceof HiveException && e.getMessage().equals("RunOutOfMeomoryUsage"))) {
    // Don't create a new object if we are already out of memory
    return 3;
  } else {
于 2014-04-10T18:52:47.180 回答
-2

最后一个连接应该是最大的表。您可以更改连接表的顺序。

于 2014-04-10T15:52:26.233 回答