HDFS:如何分发小文件?

Posted

技术标签:

【中文标题】HDFS:如何分发小文件?【英文标题】:HDFS:How to distribute files of small sizes across? 【发布时间】:2013-09-16 12:25:47 【问题描述】:

我有大量的小文件要存储在 HDFS 中。根据文件名,我想将它们存储在不同的数据节点中。这样我可以实现以某些字母开头的文件名以进入特定的数据节点。如何在 Hadoop 中做到这一点?

【问题讨论】:

【参考方案1】:

不是一个很好的选择。原因:

Hadoop 不太擅长处理大量小文件。 在单个节点中存储一个完整的文件违反了 HDFS 的基本原则之一,即分布式存储

我想知道这种方法会给您带来什么好处。


回应您的评论:

HDFS 不像 HBase 那样做任何类型的排序。当您将文件放入 HDFS 时,它首先被分成小块,然后被存储(每个块在不同的节点上)。所以没有什么比将整个文件发送到单个节点更好的了。您的文件(块)驻留在多个节点上。

您可以做的是根据您的需要创建一个目录层次结构并将文件存储在这些目录中(如果您的意图是直接根据它们的位置获取文件)。 例如,

/dirA
/dirA/A.txt
/dirA/B.txt
/dirB
/dirB/P.txt
/dirB/Q.txt
/dirC
/dirC/Y.txt
/dirC/Z.txt

但是,如果您真的想将特定文件的块发送到某些特定节点,那么您需要实施自己的块放置策略,这并不容易。请参阅 this 了解更多详情。

【讨论】:

感谢您的见解。我想将属于多种类型的文件转发到不同的DataNode中,以尽量减少以后的数据传输。 欢迎您,Vinodh。数据传输是在集群内传输还是在集群与外部机器之间传输? 当我第一次按照字母顺序或其他顺序将文件放在集群中时(我的假设是 HDFS 允许像 HBase 一样进行路由)以后我不必在集群中移动任何东西。(数据传输与集群内传输一样)

以上是关于HDFS:如何分发小文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何减少火花中的多个小文件加载时间

解决HDFS上小文件的存储

Hadoop HDFS处理大量的小文件

使用flume sink hdfs小文件优化以及HDFS小文件问题分析和解决

HDFS小文件问题及解决方案

HDFS 实际应用场景合并小文件