我有很多(高达数十万)小文件,每个10-100 Kb.我的HDFS块大小等于128 MB.我的复制因子等于1.
每个小文件分配HDFS块有什么缺点吗?
我看到了相当矛盾的答案:
我在这个答案中做了一个测试,它证明第二个选项是正确的 - HDFS没有为小文件分配整个块.
但是,批量读取HDFS中的10.000个小文件怎么样?因为10,000块和metadatas会减慢吗?有没有理由在单个块中保留多个小文件?
我只有一个用于小文件的用例,从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);
Run Code Online (Sandbox Code Playgroud)
正如您已经注意到的那样,HDFS文件不会占用超出其需要的空间,但是在HDFS集群中存在小文件还有其他缺点.让我们首先解决问题而不考虑批处理:
现在,如果我们谈论批处理,那么您可以选择的选项很少:HAR,序列文件,Avro架构等.这取决于用例来准确回答您的问题.假设您不想合并文件,在这种情况下,您可能正在使用HAR文件(或任何其他具有高效归档和索引的解决方案).在这种情况下,NN问题得到解决,但Mapper的数量仍将等于分割数.如果将文件合并为大文件是一个选项,您可以使用序列文件,它基本上将小文件聚合成更大的文件,解决了一些问题.在这两种情况下,虽然您无法直接更新/删除信息,就像您可以使用小文件一样,因此管理这些结构需要更复杂的机制.
一般来说,维护许多小文件的主要原因是尝试进行快速读取,我建议看一下像HBase这样的不同系统,这些系统是为快速数据访问而不是批量处理而创建的.
| 归档时间: |
|
| 查看次数: |
1410 次 |
| 最近记录: |