Error: java heap space on Google Data-Proc Cluster
Error: java heap space on Google Data-Proc Cluster
我是运行 Hive 在 Google dataproc 集群上的 table 具有
的插入覆盖查询
13783531
记录到另一个分区 table 没有任何转换。
失败并显示错误
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 堆 space 和 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;
仍然失败。
这里有几件事需要解决:
分配的总 JVM 内存与 JVM 堆内存
分配的 总 JVM 内存 通过这些参数设置:
mapreduce.map.memory.mb
mapreduce.reduce.memory.mb
JVM堆内存是通过这些参数设置的:
mapreduce.map.java.opts
mapreduce.reduce.java.opts
您必须始终确保总内存 > 堆内存。 (请注意,您提供的参数值违反了此规则)
总堆比
我们的一位供应商建议,在大多数情况下,我们应该始终将大约 80% 的总内存用于堆。即使采用此建议,您仍会经常遇到各种内存错误。
错误:堆内存
可能需要增加总量和堆。
错误:Permgen space 不够
需要增加堆外内存,这意味着您可以减少堆内存而不必增加总内存。
错误:超出 GC 开销限制
这是指允许 JVM 进行垃圾收集的时间量。如果在很长一段时间内收到的 space 太少,则会继续出错。尝试增加总内存和堆内存。
所以问题是插入覆盖试图创建太多的小文件。
看来我们有解决办法
set hive.optimize.sort.dynamic.partition=true;
有两个可用的解决方案,它们都有效
1. use set hive.optimize.sort.dynamic.partition=true;
或
2. use DISTRIBUTE BY <PARTITION_COLUMN>
这些都行。
最好不要使用解决方案 #1.Seems JIRA 说它在与 GROUP BY 一起使用时将记录插入错误的分区
这就是为什么它在最近的配置单元中默认被禁用的原因
https://issues.apache.org/jira/browse/HIVE-8151
我是运行 Hive 在 Google dataproc 集群上的 table 具有
的插入覆盖查询 13783531
记录到另一个分区 table 没有任何转换。 失败并显示错误
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 堆 space 和 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;
仍然失败。
这里有几件事需要解决:
分配的总 JVM 内存与 JVM 堆内存
分配的 总 JVM 内存 通过这些参数设置:
mapreduce.map.memory.mb
mapreduce.reduce.memory.mb
JVM堆内存是通过这些参数设置的:
mapreduce.map.java.opts
mapreduce.reduce.java.opts
您必须始终确保总内存 > 堆内存。 (请注意,您提供的参数值违反了此规则)
总堆比
我们的一位供应商建议,在大多数情况下,我们应该始终将大约 80% 的总内存用于堆。即使采用此建议,您仍会经常遇到各种内存错误。
错误:堆内存
可能需要增加总量和堆。
错误:Permgen space 不够
需要增加堆外内存,这意味着您可以减少堆内存而不必增加总内存。
错误:超出 GC 开销限制
这是指允许 JVM 进行垃圾收集的时间量。如果在很长一段时间内收到的 space 太少,则会继续出错。尝试增加总内存和堆内存。
所以问题是插入覆盖试图创建太多的小文件。 看来我们有解决办法
set hive.optimize.sort.dynamic.partition=true;
有两个可用的解决方案,它们都有效
1. use set hive.optimize.sort.dynamic.partition=true;
或
2. use DISTRIBUTE BY <PARTITION_COLUMN>
这些都行。 最好不要使用解决方案 #1.Seems JIRA 说它在与 GROUP BY 一起使用时将记录插入错误的分区 这就是为什么它在最近的配置单元中默认被禁用的原因 https://issues.apache.org/jira/browse/HIVE-8151