【问题标题】:How to increase hadoop map tasks by implementing getSplits如何通过实现 getSplits 增加 hadoop map 任务
【发布时间】:2013-01-28 23:17:41
【问题描述】:

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

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

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

我可以做些什么来并行处理行? hadoop 的运行方式,它不可扩展,因为无论我分配给集群多少实例,最多只能运行两个 map 任务。

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

【问题讨论】:

  • 您要处理多少数据?是否足以养活更多的映射器?
  • 130 万行,比 1 Gb 多一点。我想是的...我所做的是开始使用多线程映射器并提高了性能,但问题仍然存在...如果我理解正确,hadoop 应该创建更多映射任务,即使数据被压缩。
  • 这取决于压缩的类型。 Zip 不是一种好的格式,因为您必须在解压缩之前拥有整个文件。

标签: csv hadoop amazon-emr hadoop-partitioning


【解决方案1】:

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

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

【讨论】:

  • 会试一试,让你知道结果。感谢您提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 2017-12-03
  • 1970-01-01
  • 1970-01-01
  • 2015-12-11
  • 2011-08-06
  • 1970-01-01
相关资源
最近更新 更多