如何通过实现getSplits来增加hadoop map任务

时间:2013-01-28 23:17:41

标签: csv hadoop amazon-emr hadoop-partitioning

我想处理多行CSV文件,为此我写了custom CSVInputFormat

我想在每个hadoop节点上有大约40个线程处理CSV行。但是,当我在Amazon EMR上使用5台计算机(1个主计算机和4个核心)创建集群时,我可以看到只运行2个映射任务,即使有6个可用的映射插槽:

dashboard on EMR showing number of map tasks and available slots

我在inputFormat中实现了getSplits,因此它的行为类似于NLineInputFormat。我期待着这个,我会得到更多并行运行的东西,但没有效果。此外,我尝试设置参数-s,mapred.tasktracker.map.tasks.maximum=10 --args -jobconf,mapred.map.tasks=10,但没有效果。

如何并行处理线条? hadoop正在运行的方式,它不可扩展,因为无论我分配给集群的实例数是多少,只有两个映射任务最多运行。

更新: 当我使用非压缩文件(zip)作为原点时,它会创建更多的地图任务,大约17个,用于130万行。即便如此,我想知道为什么它不应该更多,为什么在压缩数据时不会创建更多的映射器。

1 个答案:

答案 0 :(得分:0)

更改分割大小以获得更多分割。

Configuration conf= new Cofiguration();
//set the value that increases your number of splits.
conf.set("mapred.max.split.size", "1020");
Job job = new Job(conf, "My job name");