我正在使用自定义输出格式,每个键为每个映射器输出一个新的序列文件,所以你最终得到类似的东西..
输入
Key1 Value
Key2 Value
Key1 Value
文件
/path/to/output/Key1/part-00000
/path/to/output/Key2/part-00000
我注意到了一个巨大的性能损失,通常需要大约10分钟来简单地映射输入数据,但是在两个小时之后,映射器甚至还没有完成一半。虽然他们正在输出行。我希望唯一键的数量大约是输入行数的一半,大约是200,000。
有没有人做过这样的事情,或者可以提出任何可能有助于表现的事情?我想把这个密钥分裂过程保持在可能的hadoop中。
谢谢!
答案 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