Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop 如何处理猪的内存溢出_Hadoop_Apache Pig - Fatal编程技术网

Hadoop 如何处理猪的内存溢出

Hadoop 如何处理猪的内存溢出,hadoop,apache-pig,Hadoop,Apache Pig,我的代码如下所示: pymt = LOAD 'pymt' USING PigStorage('|') AS ($pymt_schema); pymt_grp = GROUP pymt BY key results = FOREACH pymt_grp { /* * some kind of logic, filter, count, distinct, sum, etc. */ } 但现在我发现很多这样的日志: org.apache.pig.i

我的代码如下所示:

pymt = LOAD 'pymt' USING PigStorage('|') AS ($pymt_schema);

pymt_grp = GROUP pymt BY key

results = FOREACH pymt_grp {

      /*
       *   some kind of logic, filter, count, distinct, sum, etc.
       */
}
但现在我发现很多这样的日志:

org.apache.pig.impl.util.SpillableMemoryManager: Spilled an estimate of 207012796 bytes from 1 objects. init = 5439488(5312K) used = 424200488(414258K) committed = 559284224(546176K) max = 559284224(546176K)

事实上我找到了原因,主要原因是有一个“热”密钥,比如key=0作为ip地址,但我不想过滤这个密钥。有什么解决办法吗?我已经在我的UDF中实现了代数和累加器接口。

对于严重倾斜的数据或FOREACH中的DISTINCT嵌套,我有类似的问题(因为PIG将在内存中执行DISTINCT)。解决方案是以FOREACH中的DISTINCT为例,看看我的答案

如果您不想在求和和计数之前进行区分,我建议使用2分组。第一个组在键列上加上另一列或随机数mod 100,它充当一个Salt(将单个键的数据传播到多个还原器中)。然后在第二个GROUP BY键列上计算第1组计数或和的最终和

例:


日志似乎会减慢聚合速度。如果我过滤这个热键,可能需要5分钟,但如果不过滤,则需要2个多小时。多亏了Alexeipab,事情是按照你的建议完成的。很有趣。我有相同的SpillableMemoryManager日志消息,但是我没有任何不同的子句。我有JOIN、GROUP、Internal ORDER by和Internal LIMIT。GROUP将创建一个太大的包,内部订单无法在内存中排序。我认为任何超过90Mb的行李内部操作(不同或顺序)都会抛出错误。在您的情况下,您可以在腌制的组中找到最小值,以及最小值中的最小值。使用GROUP BY(id,SALT)来查找最小值/最大值,这将创建更多更小且适合RAM的袋子。然后展平并再次分组(id)
inpt = load '/data.csv' using PigStorage(',') as (Key, Value);
view = foreach inpt generate Key, Value, ((int)(RANDOM() * 100)) as Salt;

group_1 = group view by (Key, Salt);
group_1_count = foreach group_1 generate group_1.Key as Key, COUNT(view) as count;

group_2 = group group_1_count by Key;
final_count = foreach group_2 generate flatten(group) as Key, SUM(group_1_count.count) as count;