【问题标题】:Error: java heap space on Google Data-Proc Cluster错误:Google Data-Proc 集群上的 java 堆空间
【发布时间】:2017-09-14 12:29:31
【问题描述】:

我正在 Google dataproc 集群上从一个表运行 Hive 插入覆盖查询

 13783531 

记录到另一个分区表而不进行任何转换。 失败并出现错误

Diagnostic Messages for this Task:
Error: Java heap space

FAILED: Execution Error, return code 2 from 
org.apache.hadoop.hive.ql.exec.mr.MapRedTask
MapReduce Jobs Launched: 
Stage-Stage-1: Map: 34   Cumulative CPU: 1416.18 sec   HDFS Read: 6633737937 
HDFS Write: 0 FAIL

集群详情

n1-standard-16 (16 vCPU, 60.0 GB memory)

有 5 个工作节点。

误差在 超出 Java 堆空间和 GC 开销限制。 我尝试设置参数

set mapreduce.map.memory.mb=7698;
set mapreduce.reduce.memory.mb=7689;
set mapreduce.map.java.opts=-Xmx7186m;
set mapreduce.reduce.java.opts=-Xmx7186m;

仍然失败。

【问题讨论】:

  • 你的桌子是拼花格式的吗?
  • @lake 表格为文本格式
  • 两个表?如果是这种情况,您能否确保源表文件有效?例如,不是所有数据的大线?
  • 在您设置参数的示例中,对于 map,您的 java.opts 正确小于 memory.mb,但对于 reduce,则相反;这只是问题中的一个错字,还是您实际上在蜂巢中将它们颠倒了?

标签: java hadoop hive google-cloud-platform google-cloud-dataproc


【解决方案1】:

所以问题是插入覆盖试图创建太多小文件。 看来我们有解决办法

 set hive.optimize.sort.dynamic.partition=true;

https://community.hortonworks.com/articles/89522/hive-insert-to-dynamic-partition-query-generating.html

有两个可用的解决方案,它们都有效

1. use    set hive.optimize.sort.dynamic.partition=true;

2. use DISTRIBUTE BY <PARTITION_COLUMN>

其中任何一个都可以。 最好不要使用解决方案#1。似乎 JIRA 说它在与 GROUP BY 一起使用时将记录插入错误的分区 这就是为什么它在最近的蜂巢中默认被禁用的原因 https://issues.apache.org/jira/browse/HIVE-8151

【讨论】:

    【解决方案2】:

    您需要在这里解决几件事:

    分配的总 JVM 内存与 JVM 堆内存

    分配的总JVM内存是通过这些参数设置的:

    mapreduce.map.memory.mb
    mapreduce.reduce.memory.mb
    

    JVM 堆内存是通过这些参数设置的:

    mapreduce.map.java.opts
    mapreduce.reduce.java.opts
    

    您必须始终确保总内存 > 堆内存。 (请注意,您提供的参数值违反了此规则)

    总堆比

    我们的一个供应商建议我们应该在大多数情况下始终将大约 80% 的总内存用于堆。即使有这个建议,您也经常会遇到各种内存错误。

    错误:堆内存

    可能需要同时增加总数和堆。

    错误:Permgen 空间不足

    需要增加堆外内存,这意味着您可以减少堆内存而不必增加总内存。

    错误:超出 GC 开销限制

    这是指允许 JVM 进行垃圾收集的时间量。如果在很长一段时间内接收到的空间太少,那么它将继续出错。尝试增加总内存和堆内存。

    【讨论】:

    • 我在堆内存和 JVM 内存之间进行了必要的更改,但看起来这些更改并未反映在 DataProc 集群中,配置与设置集群时保持相同。有什么办法可以通过在作业级别进行设置来更新配置。?
    • 这些配置会改变你的 Hive 内存配置。如果您使用的是 Tez 或其他类似的查询引擎,那么您必须参考该查询引擎的文档以确定您需要设置哪些参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    相关资源
    最近更新 更多