hdfs序列文件性能调优

fzwojiic  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(590)

我正在尝试使用hadoop来处理许多存储在序列文件中的小文件。我的程序是高度io限制的,所以我想确保io吞吐量足够高。
我编写了一个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-x1”,发现io负载不平衡。通常只有少数磁盘的利用率为100%,有些磁盘的利用率非常低(10%或更低)。有些机器有时甚至没有io加载。这是截图(当然,每个磁盘/机器的负载变化很快)

下面是另一个通过“top-cd1”命令显示cpu使用情况的屏幕截图:

关于我的案子,这里有一些更详细的配置:
hadoop群集硬件:5台dell r620机器,配备128gb ram和32核cpu(实际上是2台xeon e5-2650)。2个硬盘驱动器包括一个用于centos的raid 1磁盘和5个用于hdfs的数据磁盘。所以uou可以在上面的截图中看到6个磁盘。
hadoop设置:块大小128mb;数据节点处理程序计数为8;每个任务跟踪器15张Map;2gbMap减少子堆进程。
测试文件集:约40万个小文件,总大小320gb。存储在160个序列文件中,每个seq文件的大小约为2gb。我尝试将所有文件存储在许多不同大小的seq文件(1gb、512mb、256mb、128mb)中,但性能变化不大。
我不希望整个系统能有100%的io吞吐量(2500mb/s),但我认为40%(1000mb/s)或更高应该是合理的。有人能为性能调优提供一些指导吗?

sy5wg1nm

sy5wg1nm1#

我自己解决了这个问题。提示:cpu使用率高。cpu使用率如此之高是非常不正常的,因为它几乎是纯io作业。根本原因是每个任务节点得到大约500个map,而每个map只使用一个jvm。默认情况下,hadoop map reduce配置为为为新Map创建新jvm。
解决方案:将“mapred.job.reuse.jvm.num.tasks”的值从1修改为-1,表示jvm将不受限制地被重用。

相关问题