小文件的HDFS性能

时间:2012-12-21 15:50:15

标签: performance hadoop io hdfs

我是Haddoop的新手。最近我正在尝试处理(仅读取)hdfs / hadoop上的许多文件。平均文件大小约为 1 kb ,文件数超过10M。由于某些限制,该程序必须用C ++编写。

这只是一次性能评估,所以我只使用5台机器作为数据节点。每个数据节点都有5个数据磁盘。

我写了一个小的 C ++项目来直接从硬盘读取文件(而不是从HDFS)来构建性能基线。该程序将为每个磁盘创建4个读取线程。性能结果是每个磁盘大约有14MB / s。总吞吐量约为14MB / s * 5 * 5 = 350MB / s(14MB / s * 5个磁盘* 5台机器)。

但是,当这个程序(仍然使用C ++,动态链接到libhdfs.so,创建4 * 5 * 5 = 100个线程)从hdfs 集群中读取文件时,吞吐量大约只有 55MB / s的

如果在mapreduce中触发此编程(hadoop流,5个作业,每个有20个线程,总线程数仍为100),则吞吐量降至约45MB / s。 (我想通过一些记账过程会减慢速度。)

我想知道HDFS可以提供​​什么样的合理性能。如您所见,与本机代码相比,数据吞吐量仅为 1/7 。这是我配置的问题吗?还是HDFS限制?还是Java限制?什么是我的场景的最佳方式?将序列文件帮助(多)?与我们可以预期的本机IO读取相比,合理的吞吐量是多少?

这是我的一些配置:

NameNode堆大小32G。

作业/任务节点堆大小8G。

NameNode处理程序数:128

DataNode处理程序数:8

DataNode最大传输线程数:4096

1GBps以太网。

感谢。

3 个答案:

答案 0 :(得分:7)

HDFS实际上并不适用于许多小文件。

对于您阅读的每个新文件,客户端必须与namenode通信,namenode为其提供文件块的位置,然后客户端从datanode流式传输数据。

现在,在最好的情况下,客户端执行此操作一次,然后发现它 包含数据的计算机,并且可以直接从磁盘读取它。这将很快:与直接磁盘读取相当。

如果机器上没有数据,那么它必须通过网络传输数据。然后你受到网络I / O速度的限制,这应该不会很糟糕,但仍然比直接读取磁盘慢一点。

但是,你遇到了更糟糕的情况 - 与namenode交谈的开销变得很大。只有1KB的文件,您就可以获得与实际数据一样多的元数据。客户端必须进行两次单独的网络交换才能从每个文件中获取数据。除此之外,namenode可能会受到所有这些不同线程的攻击,因此它可能成为瓶颈。

所以回答你的问题,是的,如果你将HDFS用于那些不适合用的东西,它会很慢。合并您的小文件,并使用MapReduce获取数据位置,您将获得更好的性能。事实上,因为你能够更好地利用顺序磁盘读取,所以如果从一个大的HDFS文件中读取更快而不是读取许多小的本地文件,我不会感到惊讶。

答案 1 :(得分:3)

只是添加到Joe所说的内容,HDFS和其他文件系统之间的另一个区别是,与传统的FS相比,通过将数据存储在更大的块(通常为64M或128M)中,它可以尽可能减少磁盘i / o块大小是KB的顺序。因此,他们总是说HDFS擅长处理少量大文件,而不是大型文件。这背后的原因是,尽管最近在cpu,ram等组件方面取得了重大进展,但磁盘i / o仍然是一个我们仍然没有那么大的领域。这是拥有如此巨大的块(与传统FS不同)背后的意图,并尽可能减少磁盘的使用。

此外,如果块大小太小,我们将有更多的块。这意味着更多元数据。这可能会再次降低性能,因为需要将更多信息加载到内存中。对于每个块,其被认为是HDFS中的对象,具有与其相关联的大约200B个元数据。如果你有很多小块,它只会增加元数据,你最终可能会遇到RAM问题。

在Cloudera的博客部分有一篇非常好的文章,讨论了同样的问题。您可以访问here

答案 2 :(得分:1)

让我们试着了解我们的极限,看看我们什么时候打它们 a)我们需要namenode来提供文件所在的信息。我可以假设这个数字大约是每秒数千。更多信息请访问https://issues.apache.org/jira/browse/HADOOP-2149 假设这个数字是10000K,我们应该能够获得1K文件大约10 MB秒的信息。 (不知怎的,你得到更多...)。可以 b)HDFS的开销。这种开销主要是延迟而不是吞吐量。 HDFS可以调整为parralel中的大量文件。 HBase正在这样做,我们可以从HBase调优指南中获取设置。这里的问题实际上是你需要多少Datanodes c)你的局域网。您从网络移动数据,因此您可能会达到1GB以太网吞吐量限制。 (我认为你得到了什么。

我还必须同意Joe - HDFS不是为场景而构建的,你应该使用其他技术(如HBase,如果你喜欢Hadoop堆栈)或压缩文件 - 例如压缩到序列文件。

关于从HDFS读取更大的文件 - 运行DFSIO基准测试,它将是您的号码。
同时 - 单个主机上的SSD也可以成为一个解决方案。