gpt4 book ai didi

hadoop - tez/hive 中的 OOM

转载 作者:可可西里 更新时间:2023-11-01 16:37:47 34 4
gpt4 key购买 nike

[经过一些回答和评论后,我根据此处获得的知识提出了一个新问题: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 已用完 => 我用尽了所有内存
  • 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 图形 View :

tez graphical view

来自这张图片:

  • contact 表有 150M 行,283GB 的 ORC 压缩数据(有一个大的 json 字段,横向 View )
  • 表m有1M行,20MB的ORC压缩数据
  • 表 c 有 2k 行,< 1MB ORC 压缩
  • 表 e 有 800k 行,压缩了 7GB 的 ORC
  • e 与所有其他表左连接

e和contact是分区的,WHERE子句中只选择了一个分区。

因此我尝试增加 map 的数量:

  • 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 * 最小容器大小)
  • mapred-site/mapreduce.map.java.opts = 819(0.8 * 最小容器大小)
  • mapred-site/mapreduce.reduce.java.opts = 1638 (0.8 * mapreduce.reduce.memory.mb)
  • mapred-site/yarn.app.mapreduce.am.resource.mb = 2048(2 * 最小容器大小)
  • 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 * 最小容器大小)

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

上下文:hdp2.6、8 个数据节点和 32GB Ram,使用基于通过直线运行的 json 的 block 状横向 View 进行查询。

最佳答案

这个问题显然是由于 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

关于hadoop - tez/hive 中的 OOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48403972/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com