【发布时间】:2012-12-21 15:50:15
【问题描述】:
我是 Hadoop 新手。最近我正在尝试处理(只读)hdfs/hadoop 上的许多 small 文件。平均文件大小约为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/秒。
如果在 mapreduce 中触发这种编程(hadoop 流式处理,5 个作业,每个有 20 个线程,线程总数仍然是 100),吞吐量下降到大约 45MB/s。 (我猜它会因一些记账过程而减慢)。
我想知道 HDFS 可以提供的合理性能是多少。可以看到,与原生代码相比,数据吞吐量只有1/7左右。是我配置的问题吗?还是 HDFS 限制?还是Java限制?我的方案的最佳方式是什么?序列文件有帮助(很多)吗?与我们可以预期的原生 IO 读取相比,合理的吞吐量是多少?
这是我的一些配置:
NameNode 堆大小 32G。
作业/任务节点堆大小 8G。
NameNode 处理程序计数:128
DataNode 处理程序计数:8
DataNode最大传输线程数:4096
1GBps 以太网。
谢谢。
【问题讨论】:
-
补充:程序从标准输入读取一个文件列表,其中包含数百万个文件路径。
-
我总是忘记“为什么”和“如何”,但请尝试使您的输入文件至少与块大小一样大(默认为 64 MB),然后重新运行您的分析。合并文件的方式取决于它们的格式;如果它们只是文本,你可以将它们连接起来。
-
我知道将文件合并成更大的文件可以显着提高性能,但这不是我们的首选。顺便说一句,直接从磁盘读取文件也会有很大的改进。我真的很想知道与本机访问相比,HDFS 可以提供的合理吞吐量是多少。 1/7 似乎不太好。
标签: performance hadoop io hdfs