Hive java.lang.RuntimeException: problem advancing post rec#4010960 的处理方法

当Hive 的Reduce任务出现以下失败信息时,信息指示处理到第4010960 个记录出错。当然实际中出错的记录数可能和本文不一致。如果记录数比较大出错,如百万级,可能是由于Reduce内存不足导致的。

Error: java.lang.RuntimeException: java.lang.RuntimeException: problem advancing post 
rec#4010960 
at org.apache.hadoop.hive.ql.exec.mr.ExecReducer.reduce(ExecReducer.java:256) at 

处理方法1. 增大Reduce内存

以下方法设置reduce内存为8G,jvm参数相应调整。

set mapreduce.reduce.memory.mb=8192;
set mapreduce.reduce.java.opts="-Xmx7000m -Xms1800m";

处理方法2. 增大Reduce的个数

增大reduce的个数,目的是减少每个reduce的数据量,使reduce的内存够用。
如以下参数设置每128M数据一个reduce,如果默认设置为256M,则生成的reduce的数量增大一倍。

set hive.exec.reducers.bytes.per.reducer=128000000;

处理方法3. 同时增大Reduce内存和增大Reduce的个数

处理方法4. 减少运行Reduce时的Shuffle缓冲区的内存占用

如果是MapReduce运行,设置运行Reduce时,把shuffle缓冲区保留的数据为0. 设置以下参数不为0可以加大程序的执行速度。如reduce的 shuffle缓冲区大小为2G时,设置此值为0.5,则运行Reduce时,可以有1Gshuffle 数据在内存中。这部分数据不用先写到硬盘,运行Reduce时再从硬盘读入。但是运行Reduce时,可能会造成内存不足。

mapreduce.reduce.input.buffer.percent=0;

处理方法5. 倾斜的数据单独处理

如果前面的方法不能解决问题,说明数据同一key的数据过多,不论reduce设置多少,他们还是进入同一个reduce处理。如果Reduce内存已经设置系统的上限还是报错,只能把倾斜的数据单独处理。 用两个 SQL ,一个SQL只处理倾斜的数据,另一个SQL处理其他数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值