如何强制PigStorage输出一些大文件而不是数千个小文件?

mna*_*dig 1 performance hadoop apache-pig hdfs

我在我的猪脚本中使用这些行:

set default_parallel 20;
requests = LOAD ‘/user/me/todayslogs.gz’ USING customParser;
intermediate_results = < some-processing ... >
some_data = FOREACH intermediate_results GENERATE day, request_id, result;
STORE some_data INTO '/user/me/output_data' USING PigStorage(',');
Run Code Online (Sandbox Code Playgroud)

'/user/me/todayslogs.gz'包含数千个gzip压缩文件,每个文件大小为200 MB.

当脚本完成时,'/ user/me/output_data'在HDFS上有数千个小(<1 KB)文件.

我必须在另一个pig脚本中读取'/ user/me/output_data'中的文件以进行进一步处理.我发现它会伤害性能.如果some_data输出的文件是gzip-ed,则性能会更差.

这是MapReduceLauncher的输出.

2013-11-04 12:38:11,961 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - Processing aliases campaign_join,detailed_data,detailed_requests,fields_to_retain,grouped_by_reqid,impressions_and_clicks,minimal_data,ids_cleaned,request_id,requests,requests_only,requests_typed,xids_from_request
2013-11-04 12:38:11,961 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - detailed locations: M: requests[30,11],campaign_join[35,16],null[-1,-1],null[-1,-1],detailed_requests[37,20],detailed_data[39,16],null[-1,-1],minimal_data[49,15],null[-1,-1],ids_cleaned[62,18],grouped_by_reqid[65,21] C:  R: null[-1,-1],xids_from_request[66,21],impressions_and_clicks[69,26],fields_to_retain[70,20],requests_only[67,17],request_id[68,18],requests_typed[73,17]
Run Code Online (Sandbox Code Playgroud)

如何强制PigStorage将输出写入较少的输出文件?

reo*_*toa 8

发生这种情况的原因是因为您的工作仅限地图.您在处理过程中不需要减少阶段,因此每个映射器都会将记录输出到自己的文件中,最终每个映射器都会有一个文件.如果您有数千个输入文件,则会有数千个输出文件.

当你使用a时它消失的原因ORDER BY是因为它触发了一个reduce阶段,此时默认的20的并行性发挥作用.

如果要避免此行为,则必须以某种方式强制执行reduce阶段.既然你已经做了JOIN,你可以选择不这样做USING 'replicated'.或者,如果您处于不进行连接的情况,您可以使用无操作强制它GROUP BY,如下所示:

reduced = FOREACH (GROUP some_data BY RANDOM()) GENERATE FLATTEN(some_data);
Run Code Online (Sandbox Code Playgroud)