我是 Hadoop 新手。最近我正在尝试处理(只读)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
数据节点处理程序计数:8
DataNode最大传输线程数:4096
1GBps 以太网。
谢谢。