我有一个包含3072个文件的文件夹,每个文件大约50mb。我正在使用Hadoop Streaming运行一个Python脚本并提取一些数据。
在单个文件上,脚本不会超过2秒。但是,在具有40 m1.large任务节点和3072个文件的EMR群集上运行此操作需要12分钟。
Hadoop流媒体可以做到这一点:
14/11/11 09:58:51 INFO mapred.FileInputFormat: Total input paths to process : 3072
14/11/11 09:58:52 INFO mapreduce.JobSubmitter: number of splits:3072
因此创建了3072个地图任务。
当然,Map Reduce开销也会发挥作用。从一些初步的研究来看,如果地图任务花费的时间少于30-40秒,那么效率非常低。
我可以做些什么来减少地图任务的数量?理想情况下,如果每个任务处理大约10-20个文件,它将大大减少开销。
我试过玩块大小;但由于文件大小都在50mb左右,它们已经在单独的块中,并且增加块大小没有区别。
答案 0 :(得分:0)
不幸的是你做不到。给定作业的映射任务数由输入拆分数驱动。对于每个输入拆分,将生成一个映射任务。因此,在mapreduce作业的生命周期中,map任务的数量等于输入拆分的数量。
答案 1 :(得分:0)
mapred.min.split.size将指定映射器要处理的最小分割大小。
因此,增加分割大小应该减少映射器的数量。
查看链接 Behavior of the parameter "mapred.min.split.size" in HDFS