HDFS(序列文件)中的单个大文件或多个小文件?

时间:2017-03-11 13:15:22

标签: hadoop hdfs

目前,我正在使用Sequence File压缩现有的HDFS数据。

现在我有两个选项可以将此Sequence File存储为

  • 单个大文件,表示所有记录都转到此文件。
  • 多个小文件,每个文件的大小与HDFS块大小完全匹配(128MB)

众所周知,HDFS文件存储为块,每个块都转到一个映射器。所以我认为当MR处理该序列文件时没有什么不同。

我知道第二个选项的唯一缺点是namenode需要更多的开销来维护这些文件,而第一个选项只有一个文件。

我对这两个选项很满意,因为我看到太多文章建议

  • 尽可能使您的HDFS文件大小与块大小相匹配。
  • 尽可能将小文件合并到一个大文件中。

有人能指出我这样做的正确方法吗?哪个更好?这两个选项的优点/缺点是什么?谢谢!

1 个答案:

答案 0 :(得分:3)

Quora.com有一个问题(对于旧版本,因为128MB现在是默认的块大小)为什么选择64MB作为默认块大小,虽然问题相对不同但是Ted Dunning的答案也回答了你的问题。 Ted Dunning写道:

Hadoop选择64MB的原因是因为谷歌选择了64MB。谷歌选择64MB的原因是由于Goldilocks的论点。

  1. 具有小得多的块大小会导致搜索开销 增加。
  2. 具有适度小的块大小可以进行地图任务 运行得足够快,以至于调度它们的成本变得可比 运行它们的成本。
  3. 有一个明显更大的块 大小开始减少可用的读取并行度和 最终可能难以安排任务的本地任务。
  4. 所以我认为第2点& 3有你的答案,现在你必须根据你的要求决定将文件存储为一个单独的大文件,或者以128MB的较小块存储(如果你愿意,你可以增加块大小)。