为什么(hadoop基准测试中)HDFS写入速度如此之慢?
在我的认识里,传统硬盘的写速度应该能够到120M/s的样子,网络传输速度也能够达到10M/s至少,在使用千兆交换机的前提下,甚至能够达到100M/s机器配置如下:机器数量:7DataNode:7内存:64G硬盘:12T 5400转 磁盘网络情况:公司内部局域网写测试:往HDFS上写100个128M的文件:使用命令 :TestDFSIO writeTest对应一个MapReduce job,每个文件
在我的认识里,传统硬盘的写速度应该能够到120M/s的样子,网络传输速度也能够达到10M/s至少,在使用千兆交换机的前提下,甚至能够达到100M/s
PS:附上测试的环境参数:
机器配置如下:
机器数量:7
DataNode:7
内存:64G
硬盘:12T 5400转 磁盘
网络情况:公司内部局域网
写测试:
往HDFS上写100个128M的文件:
使用命令 :
bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.2.2-tests.jar TestDFSIO
-read -nrFiles 100 -size 128MB -resFile ./TestDFSIOwrite.log
测试结果为:
看了大佬的分析:
-
TestDFSIO writeTest对应一个MapReduce job,每个文件对应一个map task,也就是说,TestDFSIO write文件个数(nrFile)就是map任务个数。
-
Throughput mb/sec和Average IO rate mb/sec是两个最重要的性能衡量指标。Throughput mb/sec衡量每个map task的平均吞吐量,Average IO rate mb/sec 衡量每个文件的平均IO速度。举个例子,你让TestDFSIO创造1000个文件,但你的集群中只有200个
map slots。这意味着需要大约5波 MapReduce(1000/200 = 5)才能写完全部的测试数据。所以集群的并发吞吐量为 {Throughput mb/sec} * 200,并发IO速度则为{Average IO rate mb/sec}*200。 -
集群中机器较少时,带宽/disk io会成为瓶颈。举个例子,对于千兆网络,四台机器总共只能提供128M x 4 = 512M带宽,所以多个文件同时写的时候,单个文件的写速度会下降(平摊后)。写文件的数量越接近map slots的数量,Average IO rate mb/sec就越接近饱和的IO使用率。
-
HDFS复制因子(
HDFS replication factor)的作用也很明显,复制因子的值越小,吞吐量和平均IO速度就会越高。 -
最后一个关键点是标准差(
IO rate std deviation)。高标准差表示数据散布在一个大的值域中,这可能意味着群集中某个节点存在性能相关的问题,这可能和硬件或软件有关。 -
References:
作者:taiwo
链接:https://www.zhihu.com/question/21588815/answer/31027187
引出一个问题:slot是什么?
首先,slot不是CPU的Core,也不是memory chip,它是一个逻辑概念,一个节点的slot的数量用来表示某个节点的资源的容量或者说是能力的大小,因而slot是 Hadoop的资源单位。
Hadoop利用slots来管理分配节点的资源。每个Job申请资源以slots为单位,每个节点会确定自己的计算能力以及memory确定自己包含的slots总量。
当某个Job要开始执行时,先向JobTracker申请slots,JobTracker分配空闲的slots,Job再占用slots,Job结束后,归还slots。每个TaskTracker定期(例如淘宝Hadoop心跳周期是5s)通过心跳(hearbeat)与Jobtracker通信,一方面汇报自己当前工作状态,JobTracker得够某个TaskTracker是否Alive;同时汇报自身空闲slots数量。
JobTracker利用某个调度规则,如Hadoop默认调度器FIFO或者Capacity Scheduler、FairScheduler等。(注:淘宝Hadoop使用云梯调度器YuntiScheuler,它是基于Fair Scheduler进行修改的)
Hadoop里有 两种slots, map slots和reduce slots,map task使用map slots,reduce task使用reduce slots
reducer slots总数的计算公式如下:
Map slots总数=集群节点数×mapred.tasktracker.map.tasks.maximum
Reducer slots总数=集群节点数×mapred.tasktracker.reduce.tasks.maximum
References:
原文链接:https://blog.csdn.net/suibianshen2012/article/details/48272891
下面说下mapred.tasktracker.map.tasks.maximum
mapred.tasktracker.map.tasks.maximum这个应该是hadoop2.x的用法,我在hadoop3.x的官网上看到它已经改名为mapreduce.tasktracker.map.tasks.maximum
| 参数 | default |
|---|---|
| mapreduce.tasktracker.map.tasks.maximum | 默认:2 . / describe:The maximum number of map tasks that will be run simultaneously by a task tracker. |
| mapreduce.tasktracker.reduce.tasks.maximum | 默认:2 . / describe:The maximum number of reduce tasks that will be run simultaneously by a task tracker. |
mapred.tasktracker.map.tasks.maximum设置为节点的cpu cores数目或者数目减1比较合适
#mapred-site.xml
<property>
<name>mapred.tasktracker.map.tasks.maximum</name>
<value>8</value>
<description>The maximum number of map tasks that will be run
simultaneously by a task tracker.
</description>
</property>
更多推荐
所有评论(0)