我有一个pig脚本,它对不同的客户进行分组和计数,如下所示
by_customer = GROUP customer BY (start_date, spc);
cust_cnt = FOREACH by_customer {
cust = DISTINCT customer.cid;
GENERATE FLATTEN(group), COUNT(cust);
};
问题是最后一个reducer由于内存问题而挂起或失败。我可以看到分布在减速器中的数据是高度倾斜的。是否有一种方法来分配分组输出,使得每个减速机只得到一个分组包。
2条答案
按热度按时间jaql4c8m1#
我解决了这个问题,做了一个变通办法,不使用distinct关键字获得distinct count。
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);
这很有效。不知道为什么distinct不起作用。谢谢你的帮助。
dsekswqp2#
您可以使用GROUPBY的并行语句来增加减速器的数量。如果你的数据是真的,真的倾斜,这将不会有帮助,虽然因为一个减速机仍然可能得到太多的数据。缓解这种情况的常用方法是引入一个随机数字段,并将其添加到分组中。
显然,这会生成不同于原来的组,因此在进一步处理(不同的计数、总和等)时需要考虑到这一点。使事情变得更加复杂,但是应该在减速器之间更好地分配数据。