错误:Google Data-Proc Cluster上的Java堆空间

时间:2017-04-18 15:15:15

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

我正在使用

的表格在Google dataproc群集上运行Hive insert overwrite query
 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;

仍然失败。

2 个答案:

答案 0 :(得分:1)

这里有几件事你需要解决:

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

分配的总JVM内存是通过以下参数设置的:

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

JVM堆内存通过以下参数设置:

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

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

总堆比

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

错误:堆内存

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

错误:Permgen空间不够

需要增加堆外内存,这意味着您可以在不增加总内存的情况下减少堆内存。

错误:GC开销限制超出

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

答案 1 :(得分: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>

其中任何一个都可行。 最好不要使用Solution#1。看看JIRA说它在与GROUP BY一起使用时会将记录插入错误的分区 这就是为什么在最近的配置单元中默认禁用它 https://issues.apache.org/jira/browse/HIVE-8151