【发布时间】:2017-05-08 14:06:48
【问题描述】:
我有很多(多达数十万个)小文件,每个 10-100 Kb。我的 HDFS 块大小等于 128 MB。我的复制因子等于 1。
为每个小文件分配 HDFS 块有什么缺点吗?
我看到了相当矛盾的答案:
- Answer which said the smallest file takes the whole block
- Answer which said that HDFS is clever enough, and small file will take small_file_size + 300 bytes of metadata
我做了一个类似this answer 的测试,它证明了第二个选项是正确的——HDFS 不会为小文件分配整个块。
但是,从 HDFS 批量读取 10.000 个小文件怎么样?它会因为 10.000 个块和元数据而变慢吗?是否有任何理由将多个小文件保存在一个块中?
更新:我的用例
我只有一个小文件用例,从 1.000 到 500.000。我计算这些文件一次,存储它,然后一次读取它们。
1) 据我了解,NameNode 空间问题对我来说不是问题。 500.000 是绝对最大值,我永远不会有更多。如果每个小文件在 NN 上占用 150 字节,那么我的绝对最大值是 - 71.52 MB,这是可以接受的。
2) Apache Spark 是否消除了 MapReduce 问题?序列文件或 HAR 会帮助我解决问题吗? 据我了解,Spark 不应该依赖 Hadoop MR,但它仍然太慢。读取 490 个文件需要 38 秒,读取 3420 个文件 - 266 秒。
sparkSession
.read()
.parquet(pathsToSmallFilesCollection)
.as(Encoders.kryo(SmallFileWrapper.class))
.coalesce(numPartitions);
【问题讨论】:
-
请说明批量读取的含义(序列文件?HAR?任何其他聚合?)。在您提供有关第一个问题的更多详细信息后,我将回答您的其余问题。
-
@Serhiy 假设我有 10k 个小文件,需要一次将它们全部读入内存。