错误:googledataproc集群上的java堆空间

zbdgwd5y  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(414)

我正在googledataproc集群上从一个具有

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;

仍然失败。

kh212irz

kh212irz1#

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

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

jdgnovmf

jdgnovmf2#

这里有几件事你需要解决:
分配的jvm内存总量与jvm堆内存
分配的jvm内存总量通过以下参数设置:

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

jvm堆内存是通过以下参数设置的:

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

必须始终确保总内存>堆内存(请注意,您提供的参数值违反了此规则)
总堆比
我们的一个供应商建议,在大多数情况下,我们应该始终将大约80%的内存用于堆。即使使用此建议,您也会经常遇到各种内存错误。
错误:堆内存
可能需要同时增加total和heap。
错误:permgen空间不足
需要增加堆外内存,这意味着您可以减少堆内存而不必增加总内存。
错误:超出gc开销限制
这是指允许jvm进行垃圾收集的时间量。如果在很长一段时间内接收到的空间太小,那么它将继续出错。尝试增加总内存和堆内存。

相关问题