如何通过实现getsplits来增加hadoopMap任务

7y4bm7vi  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(239)

我想处理多行csv文件,为此我编写了一个自定义csvinputformat。
我想有大约40个线程在每个hadoop节点上处理csv行。但是,当我在amazon emr上创建一个包含5台机器(1台主机和4个内核)的集群时,我可以看到只有2个Map任务正在运行,即使有6个可用的Map槽:

我在inputformat中实现了getsplits,因此它的行为类似于nlineinputformat。我本以为这样我会得到更多的东西并行运行,但没有效果。另外,我还试着设置参数 -s,mapred.tasktracker.map.tasks.maximum=10 --args -jobconf,mapred.map.tasks=10 ,但没有效果。
我能做些什么来并行处理行?按照hadoop的运行方式,它是不可伸缩的,因为不管我给集群分配多少示例,最多只能运行两个map任务。
更新:当我使用一个非压缩文件(zip)作为源文件时,它会创建更多的Map任务,大约为130万行创建17个。即便如此,我还是想知道为什么压缩数据时不应该创建更多的Map器,为什么不创建更多的Map器。

qxgroojn

qxgroojn1#

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

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");

相关问题