[原创] 如何减少map-only的Pig job的输出文件数

查看更多Apache Pig的教程请点击这里

如果一个Pig job是map-only的job,并且其输入文件数很多的话,那么输出的文件数也会同样多,此时,如果每个文件大小又比较小的话,长久下去就会对Haodoop NameNode造成很大压力。我们可以通过给Pig job添加一个reduce过程来减少输出文件数。

话不多说,直接上代码:

D = LOAD '/user/abc/xxx' AS (col1: long, col2: chararray);  
E = FOREACH (GROUP D BY RANDOM() PARALLEL 100) GENERATE FLATTEN(D); 

文章来源:https://www.codelast.com/
其中:
加载到D里的数据就是文件数量巨大,并且每个文件大小都比较小的一份数据。
PARALLEL后的100可以视情况更改,设置为100则输出文件数为100。
这里的实现逻辑是:添加一个reduce过程,其shuffle key是由Pig的 RANDOM() 函数生成的一个随机数,因此不会出现让大量数据聚集在同一个reducer里的情况,这样做是试图使输出数据尽可能均匀地分布在100个输出文件里。

但实际上你会发现,实际输出的文件大小并不均衡,比如有些300多MB大,有些只有100多MB大,这是因为 RANDOM() 函数输出的是一个 [0.0, 1.0) 范围内的数,这个小数作为shuffle key的话,很难说会有什么后果,因此我们把它放大1000倍再转为int,就可以避免这个问题,真正让输出数据的大小很平均:

 E = FOREACH (GROUP D BY ((int) (RANDOM() * 1000)) PARALLEL 100) GENERATE FLATTEN(D); 

文章来源:https://www.codelast.com/
➤➤ 版权声明 ➤➤ 
转载需注明出处:codelast.com 
感谢关注我的微信公众号(微信扫一扫):

wechat qrcode of codelast
以及我的微信视频号:

发表评论