是否在hadoop中优化了中间键值对流

时间:2013-11-14 15:31:02

标签: java hadoop mapreduce streaming

mapreduce作业中的中间键值对在被移动到将运行reduce任务的tasktracker节点之前写入mapred.local.dir

我知道 HFDS已经过优化来编写大块数据,因此与常规文件系统相比,最大限度地减少了硬盘的查找时间。

现在我很好奇hadoop是否针对本地文件系统流式传输中间kev值对进行了优化?

我问这个是因为我的应用程序输入数据很少,但是有大量的中间数据和中等大小的输出数据。 在我的情况下hadoop是否有益还是我应该考虑一个不同的框架?(请注意,我的软件与WordCount密切相关,但我会发出所有子字符串而不是所有单词)

非常感谢您的帮助!

  编辑:我乍看之下给了我一些问题   中间kv对被发送到HDFS的印象,它们被发送到tasktracker节点的本地文件系统!

2 个答案:

答案 0 :(得分:1)

中间输出存储在本地FS 不在HDFS 上。因此,优化的HDFS有多​​少并不重要。但是,如果要传播磁盘i / o以提高效率,可以使用不同设备上以逗号分隔的目录列表作为 mapred.local.dir 属性的值。这将分散负载,从而提高性能。

您还可以使用合并器来改善目标。

答案 1 :(得分:1)

  

HDFS是否针对中间数据进行了优化?

与@Tariq提到的一样,HDFS不用于中间数据(尽管有些人有successfully explored this idea)。

所以,让我重新提一下你的问题:

  

Hadoop 针对中间数据进行了优化吗?

是的,有一些优化措施(例如,请参阅MAPREDUCE-3289 JIRA)。

即使有了这些优化措施,洗牌工作也会在这个阶段出现瓶颈。调整配置参数(如mapreduce.reduce.shuffle.input.buffer.percent)可以在一定程度上缓解此问题。使用组合器(如@Tariq所建议)也是一个好主意。

  

在我的案例中,hadoop是有益的还是我应该考虑一个不同的框架?

是的,Hadoop在您的情况下仍然有用(假设您没有以单节点模式运行)。您可以更好地编写自己的代码,针对您的特定用例进行优化,但这样做太多了(您必须自己处理失败等等)以证明这样做(在大多数情况下)。