Tez / hive中的OOM

时间:2018-01-23 14:21:05

标签: hadoop hive out-of-memory tez

[经过几个答案和评论之后,我根据这里获得的知识提出了一个新问题:Out of memory in Hive/tez with LATERAL VIEW json_tuple]

我的一个查询始终因错误而失败:

ERROR : Status: Failed
ERROR : Vertex failed, vertexName=Map 1, vertexId=vertex_1516602562532_3606_2_03, diagnostics=[Task failed, taskId=task_1516602562532_3606_2_03_000001, diagnostics=[TaskAttempt 0 failed, info=[Container container_e113_1516602562532_3606_01_000008 finished with diagnostics set to [Container failed, exitCode=255. Exception from container-launch.
Container id: container_e113_1516602562532_3606_01_000008
Exit code: 255
Stack trace: ExitCodeException exitCode=255: 
    at org.apache.hadoop.util.Shell.runCommand(Shell.java:933)
    at org.apache.hadoop.util.Shell.run(Shell.java:844)
    at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:1123)
    at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:237)
    at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:317)
    at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:83)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

Container exited with a non-zero exit code 255
]], TaskAttempt 1 failed, info=[Error: Failure while running task:java.lang.RuntimeException: java.lang.OutOfMemoryError: Java heap space
    at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.initializeAndRunProcessor(TezProcessor.java:173)

此处的关键字似乎是java.lang.OutOfMemoryError: Java heap space

我环顾四周,但没想到我从Tez那里得到的东西帮助了我:

  • yarn-site / yarn.nodemanager.resource.memory-mb max up up =>我使用了所有的内存
  • yarn-site / yarn.scheduler.maximum-allocation-mb:与yarn.nodemanager.resource.memory-mb相同
  • yarn-site / yarn.scheduler.minimum-allocation-mb = 1024
  • hive-site / hive.tez.container.size = 4096(yarn.scheduler.minimum-allocation-mb的倍数)

我的查询有4个映射器,3个非常快,第4个每次都死掉。以下是查询的Tez图形视图:

tez graphical view

从这张图片:

  • 表联系人有150M行,283GB ORC压缩数据(有一个大的json字段,LATERAL VIEW'ed)
  • 表m有1M行,20MB ORC压缩数据
  • 表c具有2k行,< 1MB ORC压缩
  • 表e有800k行,7GB ORC压缩
  • e与所有其他表格LEFT JOIN一起

e和联系人已分区,并且在WHERE子句中只选择了一个分区。

我因此试图增加地图数量:

  • tez.grouping.max-size:默认为650MB,即使我将其降低为 - tez.grouping.min-size(16MB)没什么区别
  • tez.grouping.split-count甚至增加到1000并没有什么区别
  • tez.grouping.split-wave 1.7默认情况下,甚至增加到5没有区别

如果相关,这里有一些其他的内存设置:

  • mapred-site / mapreduce.map.memory.mb = 1024(最小容器大小)
  • mapred-site / mapreduce.reduce.memory.mb = 2048(2 * min容器大小)
  • mapred-site / mapreduce.map.java.opts = 819(0.8 * min容器大小)
  • mapred-site / mapreduce.reduce.java.opts = 1638(0.8 * mapreduce.reduce.memory.mb)
  • mapred-site / yarn.app.mapreduce.am.resource.mb = 2048(2 * min容器大小)
  • mapred-site / yarn.app.mapreduce.am.command-opts = 1638(0.8 * yarn.app.mapreduce.am.resource.mb)
  • mapred-site / mapreduce.task.io.sort.mb = 409(0.4 * min容器大小)

我的理解是,tez可以在很多负载中分割工作,因此需要很长时间但最终完成。我错了,还是有一种我没找到的方法?

context:hdp2.6,带有32GB Ram的8个datanode,使用基于json直线运行的粗略侧视图进行查询。

2 个答案:

答案 0 :(得分:1)

问题显然是由于SKEWED数据。我建议您添加DISTRIBUTE BY COL来从源中选择查询,以便reducer具有均匀分布的数据。在下面的示例中,COL3是更均匀分布的数据,如ID列 实施例

ORIGINAL QUERY : insert overwrite table X AS SELECT COL1,COL2,COL3 from Y
NEW QUERY      : insert overwrite table X AS SELECT COL1,COL2,COL3 from Y distribute by COL3

答案 1 :(得分:0)

我遇到了同样的问题,增加所有内存参数并没有帮助。

然后我切换到MR并出现以下错误。

Failed with exception Number of dynamic partitions created is 2795, which is more than 1000.

设置较高的值后,我返回到tez,问题已解决。