我正在尝试使用 Hadoop 处理大量存储在序列文件中的小文件。我的程序是高度 IO 绑定的,所以我想确保 IO 吞吐量足够高。
我编写了一个 MR 程序,它从序列文件中读取小样本文件并将这些文件写入ram 磁盘(/dev/shm/test/)。还有另一个独立程序可以删除写入 ram 磁盘的文件而无需任何计算。所以测试应该几乎是纯 IO 绑定的。但是,IO 吞吐量并没有我想象的那么好。
我有 5 个数据节点,每个数据节点有 5 个数据磁盘。每个磁盘可以提供大约 100MB/s 的吞吐量。理论上这个集群应该能够提供 100MB/s * 5(磁盘)* 5(机器)= 2500MB/s。但是,我只能得到大约 600MB/s。我在5台机器上运行“iostat -d -x 1”,发现IO负载不均衡。通常只有少数磁盘具有 100% 的利用率,一些磁盘的利用率非常低(10% 或更少)。有些机器有时甚至没有 IO 加载。这是屏幕截图。(当然每个磁盘/机器的负载变化很快)
这是另一个屏幕截图,显示了“top -cd1”命令的 CPU 使用情况:
这是关于我的案例的一些更详细的配置:
Hadoop 集群硬件:5 台 Dell R620 机器,配备 128GB 内存和 32 核 CPU(实际上是 2 台 Xeon E5-2650)。2 HDD 由一个用于 CentOS 的 RAID 1 磁盘和 5 个用于 HDFS 的数据磁盘组成。所以你可以在上面的截图中看到 6 个磁盘。
Hadoop设置:块大小128MB;数据节点处理程序计数为 8;每个任务跟踪器 15 个地图;2GB Map减少子堆进程。
测试文件集:约40万个小文件,总大小320GB。存储在 160 个序列文件中,每个 seq 文件大小约为 2GB。我尝试将所有文件存储在许多不同大小的 seq 文件中(1GB、512MB、256MB、128MB),但性能并没有太大变化。
我不会期望整个系统可以有 100% 的 IO 吞吐量(2500MB/s),但我认为40%(1000MB/s)或更多应该是合理的。谁能提供一些性能调整指南?