我有一个猪脚本,可以对不同的客户进行分组和统计,如下所示
by_customer = GROUP customer BY (start_date, spc);
cust_cnt = FOREACH by_customer {
cust = DISTINCT customer.cid;
GENERATE FLATTEN(group), COUNT(cust);
};
问题是最后一个reducer由于内存问题而挂起或失败。 我可以看到在Reducer之间分配的数据是高度倾斜的。 有没有办法分配组的输出,使每个reducer只获得一个分组包。
答案 0 :(得分:0)
您可以对group by使用并行语句来增加reducer的数量。如果您的数据确实存在,那么实际上是不正确的,因为一个减速器仍然可能获得太多数据。减轻这种情况的一种常用方法是引入随机数字段并将其添加到组中。
customer_random = foreach customer generate RANDOM() as seed, start_date, spc, cid, ...
by_customer = group customer_random by (seed, start_date, spc);
显然,这会生成不同于最初的组,因此您需要在进一步处理时考虑到这一点(不同的计数,总和等)。使事情变得复杂一些,但应该在reducer之间更好地分配数据。
答案 1 :(得分:0)
我修复了这个问题,做了一个解决方法来获得不同的计数而不需要使用不同的关键字。
by_customer = GROUP customer BY (cid,start_date,spc);
dist_customer = FOREACH by_customer GENERATE group.start_date as start_date,group.spc as spc,1 as cst_cnt;
cust = GROUP dist_customer by (start_date,spc);
cust_cnt = FOREACH cust GENERATE FLATTEN(group), SUM(dist_customer.cst_cnt);
这完美无缺。 不确定为什么区别不起作用。
感谢您的帮助。