【发布时间】:2013-03-25 16:14:14
【问题描述】:
我正在尝试使用 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 reduce子堆进程。
测试文件集:约40万个小文件,总大小320GB。存储在 160 个序列文件中,每个 seq 文件大小约为 2GB。我尝试将所有文件存储在许多不同大小的 seq 文件中(1GB、512MB、256MB、128MB),但性能没有太大变化。
我不期望整个系统可以有 100% 的 IO 吞吐量(2500MB/s),但我认为 40% (1000MB/s) 或更多应该是合理的。谁能提供一些性能调整指南?
【问题讨论】:
-
我发现附件的截图在调整大小后不够清晰,所以我将截图发布在 imagesHack 上。磁盘:imageshack.us/photo/my-images/201/diskz.jpg CPU:imageshack.us/photo/my-images/28/cpuzo.jpg
标签: performance hadoop hdfs sequencefile