我在我的猪脚本中使用这些行:
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(',');
'/ 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]
如何强制PigStorage将输出写入较少的输出文件?
答案 0 :(得分:8)
发生这种情况的原因是因为您的工作仅限地图。您在处理过程中不需要减少阶段,因此每个映射器都会将记录输出到自己的文件中,最终每个映射器都会有一个文件。如果您有数千个输入文件,则会有数千个输出文件。
当你使用ORDER BY
时,这种情况消失的原因是因为它触发了一个减少阶段,此时默认的20的并行性发挥作用。
如果您想避免此行为,则必须以某种方式强制执行缩减阶段。由于您已经在使用JOIN
,因此您可以选择不执行此操作USING 'replicated'
。或者,如果您处于不进行连接的情况,您可以使用无操作GROUP BY
强制它,如下所示:
reduced = FOREACH (GROUP some_data BY RANDOM()) GENERATE FLATTEN(some_data);
答案 1 :(得分:1)
您可能希望合并多个输入文件并将其输入到单个映射器中。以下链接可以帮助您。
http://pig.apache.org/docs/r0.10.0/perf.html#combine-files
您可能希望为第一个脚本和第二个脚本执行此操作。
答案 2 :(得分:0)
另一种解决方案是在作业之后运行脚本,将小文件连接成更大的文件。