在Hadoop中具有大量多个输出文件的性能

时间:2012-08-23 14:26:28

标签: performance hadoop mapreduce

我正在使用自定义输出格式,每个键为每个映射器输出一个新的序列文件,所以你最终得到类似的东西..

输入

Key1     Value
Key2     Value
Key1     Value

文件

/path/to/output/Key1/part-00000
/path/to/output/Key2/part-00000

我注意到了一个巨大的性能损失,通常需要大约10分钟来简单地映射输入数据,但是在两个小时之后,映射器甚至还没有完成一半。虽然他们正在输出行。我希望唯一键的数量大约是输入行数的一半,大约是200,000。

有没有人做过这样的事情,或者可以提出任何可能有助于表现的事情?我想把这个密钥分裂过程保持在可能的hadoop中。

谢谢!

2 个答案:

答案 0 :(得分:2)

我相信你应该重新审视你的设计。我不相信HDFS可以很好地扩展10M文件。我建议阅读有关Hadoop,HDFS和Map / Reduce的更多信息。一个好的起点是http://www.cloudera.com/blog/2009/02/the-small-files-problem/

祝你好运!

编辑8/26:根据@David Gruzman的评论,我更深入地研究了这个问题。实际上,存储大量小文件的代价仅限于NameNode。数据节点没有额外的空间损失。我删除了不正确的部分答案。

答案 1 :(得分:1)

听起来像输出一些Key-Value商店可能会有很大帮助。
例如,HBASE可能适合您的需求,因为它针对大量写入进行了优化,您将重用部分hadoop基础结构。 现有输出格式可写入HBase:http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/TableOutputFormat.html