我正在尝试使用Hadoop处理许多存储在序列文件中的小文件。我的程序高度IO绑定所以我想确保IO吞吐量足够高。
我编写了一个MR程序,它从序列文件中读取小样本文件,并将这些文件写入 ram disk (/ dev / shm / test /)。还有另一个独立的程序,它将删除写入ram磁盘的文件而无需任何计算。所以测试应该几乎纯IO绑定。但是,IO吞吐量不如我预期的那么好。
我有5个datanode,每个datanode有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磁盘和用于HDFS的5个数据磁盘。所以你可以在上面的截图中看到6个磁盘。
Hadoop设置:块大小为128MB;数据节点处理程序计数为8;每个任务跟踪器15个映射; 2GB Map减少子堆进程。
测试文件集:大约400,000个小文件,总大小为320GB。存储在160个序列文件中,每个seq文件的大小约为2GB。我试图将所有文件存储在许多不同大小的seq文件中(1GB,512MB,256MB,128MB),但性能没有太大变化。
我不希望整个系统可以有100%的IO吞吐量(2500MB / s),但我认为 40%(1000MB / s)或更多应该是合理的。任何人都可以提供一些性能调优指南吗?
答案 0 :(得分:1)
解决方案:将“mapred.job.reuse.jvm.num.tasks”的值从1修改为-1,这表示JVM将无限制地重复使用。