这只是性能评估,所以我只用了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。
如果触发此编程映射(hadoop streamming,5个作业,每个作业有20个线程,线程总数仍为100),则吞吐量会降至约45MB/s。(我猜它会被某些簿记过程拖慢)
我想知道HDFS可以提供什么合理的性能。正如您所看到的,与本机代码相比,数据吞吐量仅约为1/7。这是我的配置问题吗?还是HDFS的限制?或Java的限制?对于我的场景,最好的方法是什么?序列文件有帮助(很多)吗?与本机IO读取相比,我们可以期望什么合理的吞吐量?
以下是我的一些配置:
- NameNode堆大小32G。 - Job/Task节点堆大小8G。 - NameNode处理程序计数:128 - DataNode处理程序计数:8 - DataNode最大传输线程数:4096 - 1GBps以太网。
谢谢。