pig中group时数据倾斜问题

在使用pig时遇到了数据倾斜问题。某些数据能够正常计算,但是对于另一些数据reduce job运行至某个地方会报错GC overhead limit exceeded,实际上就是OOM了。

首先分析问题是什么,观察到计算错误的数据并没有被计算完,且每次日志是停在固定位置的,从日志内容可以看出,GC overhead发生在reduce job前准备reduce的参数Tuple时,推断某些key过大导致Tuple过大,因而无法计算完成。

pig中group时数据倾斜问题_第1张图片

一种可能的解决方式就是增大reduce job数,将原来可能1亿的key到同一个reduce job变为1亿key分到多个reduce job,这种方式在遇到瓶颈时只需要加reduce job数就可以继续扩展。

修改前的代码如下

population_info = FOREACH (GROUP data_cols BY ($PSIColumn, $1) PARALLEL $column_parallel) GENERATE PopulationCounter(*) as counters;

修改后的代码,基本思想就是使用一个salt同时作为group by的key先做一次group by,此时数据已经被处理和归并过一次,无论是长度还是条数都大幅减小,然后再使用原来的key再做一次group by,此时得到的结果就是最终想要的结果,其过程类似“大内存优化reduce”中的做法。

data_cols = FOREACH data_cols GENERATE $PSIColumn, columnId, value, tag,  rand as salt, weight;
data_cols_grd = GROUP data_cols BY ($PSIColumn, columnId, salt) PARALLEL $column_parallel;
population_info = FOREACH data_cols_grd GENERATE FLATTEN(group), PopulationCounter(*) as counters;

population_info = FILTER population_info BY counters is not null;

population_grp = GROUP population_info BY ($PSIColumn, columnId);
population_info = FOREACH population_grp GENERATE PopulationCounterSum(*) as counters;

pig参数调优详解 https://www.twblogs.net/a/5b8e28312b7177188343377e/zh-cn

pig性能调优分析 https://pdfs.semanticscholar.org/ec19/1d78641c81fcc7e744cded3a0e8847fe86a4.pdf

大内存优化reduce https://stackoverflow.com/questions/11999268/how-to-handle-spill-memory-in-pig

你可能感兴趣的:(big,data)