2013-03-25 64 views
1

我正在尝试使用Hadoop处理大量存储在序列文件中的小文件。我的程序是高IO限制所以我想确保IO吞吐量足够高。HDFS序列文件性能调优

我写了一个MR程序,从序列文件中读取小样本文件,并将这些文件写入RAM磁盘(/ 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负载。这是截图。 (当然,对于每个磁盘/机加载迅速变化)

Disk utilization

这里是另一张截图通过“顶-cd1”命令显示CPU使用率: CPU usage

我这里还有一些更关于我的情况的详细配置:

Hadoop集群硬件:配备128GB RAM和32核心CPU(实际上是2个Xeon E5-2650)的5台戴尔R620机器。 2 HDD包含一个用于CentOS的RAID 1磁盘和5个用于HDFS的数据磁盘。所以你可以在上面的截图中看到6个磁盘。

Hadoop设置:块大小128MB;数据节点处理程序计数是8;每个任务跟踪器有15​​张地图; 2GB地图减少孩子堆进程。

测试文件集:大约400,000个小文件,总大小为320GB。存储在160个序列文件中,每个seq文件的大小约为2GB。我尝试将所有文​​件存储在许多不同大小的seq文件(1GB,512MB,256MB,128MB)中,但性能没有太大变化。我不希望整个系统可以有100%的IO吞吐量(2500MB/s),但我认为40%(1000MB/s)以上应该是合理的。任何人都可以提供一些性能调整指南吗?

+0

我发现附加的屏幕截图在调整大小后不够清晰,所以我在imagesHack上发布了屏幕截图。 Disk:http://imageshack.us/photo/my-images/201/diskz.jpg/ CPU:http://imageshack.us/photo/my-images/28/cpuzo.jpg/ – avhacker 2013-03-25 16:15:58

回答

1

我自己解决了这个问题。提示:高CPU使用率。 CPU使用率非常高,因为它几乎是纯粹的IO作业。 根本原因是每个任务节点都会获得大约500张地图,每个地图只使用一个JVM。默认情况下,hadoop map reduce被配置为为新地图创建新的JVM。

解决方案:将“mapred.job.reuse.jvm.num.tasks”的值从1修改为-1,表示JVM将被无限制地重用。