我想处理多行 CSV 文件,为此我编写了一个自定义 CSVInputFormat。
我希望在每个 hadoop 节点上有大约 40 个线程处理 CSV 行。但是,当我在 Amazon EMR 上创建一个包含 5 台机器(1 个主设备和 4 个核心)的集群时,我可以看到我只运行了 2 个映射任务,即使有 6 个可用的映射槽:
我在 inputFormat 中实现了 getSplits,因此它的行为类似于 NLineInputFormat。我期待这样我会得到更多并行运行的东西,但没有任何效果。另外,我尝试设置 arguments -s,mapred.tasktracker.map.tasks.maximum=10 --args -jobconf,mapred.map.tasks=10
,但没有效果。
我该怎么做才能并行处理行?hadoop 的运行方式,它不可扩展,因为无论我分配给集群多少实例,最多只能运行两个 map 任务。
更新:当我使用非压缩文件 (zip) 作为源时,它会创建更多的地图任务,大约 17 个用于 130 万行。即便如此,我想知道为什么它不应该更多以及为什么在压缩数据时没有创建更多的映射器。