测试上传数据到集群和拉取数据的时间。HDFS的读写性能主要受网络和磁盘影响比较大。为了方便测试,将hadoop102、hadoop103、hadoop104虚拟机网络的带宽都设置为100Mbps。100Mbps/8=12.5M/s。
1 测试HDFS写性能
写测试原理:
向磁盘写测试文件,然后通过MapTask读文件写到HDFS,写的过程中会记录每个Map向HDFS写的总时间和平均速度,然后把值汇总到ReduceTask,汇总之后再由ReduceTask计算吞吐量:
Average IO rate=所有的map平均速度之和/文件总数
Througput=所有数据量累加/所有map总时间之和
测试文件个数=集群cpu总核数-1(如3台服务器,每台服务器cpu核数为1,则测试文件个数=3*1-1=2)用来保证每个MapTask在每个节点上都有启动。
向HDFS写2个128M的文件。
hadoop jar/opt/module/hadoop-3.3.1/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.3.1-tests.jarTestDFSIO -write -nrFiles 2 -fileSize 128MB
如果测试中出现异常,会提示内存大于虚拟内存。
原因:
虚拟内存检测中,设置的物理内存为2G,虚拟内存为物理内存的2.1倍,即虚拟内存为4.2G,但由于centos7和Java8兼容不是特别好,Linux会给程序预留大量内存,导致实际得到的虚拟内存小于物理内存,导致虚拟内存经常溢出,所以只开启物理内存。
解决:
在yarn-site.xml中设置虚拟内存检测为false,然后分发文件并重启yarn。
<!--是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true-->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
返回参数解释:
Number of files:生成MapTask数量,一般是集群中CPU核数-1,测试虚拟机就按照实际的物理内存-1分配即可。
Total MBytes processed:单个map处理的文件大小。
Throughput mb/sec:单个mapTak的吞吐量
Througput=所有数据量累加/所有map总时间之和
集群整体吞吐量:生成mapTask数量x单个mapTak的吞吐量。
Average IO rate mb/sec:平均mapTak的吞吐量
Average IO rate=所有的map平均速度之和/文件总数
单个map平均速度=单个MapTask处理文件大小/单个MapTask写数据的时间
IO rate std deviation:方差,反映各个mapTask处理的差值,越小越均衡。
结果分析:
副本1在本地,所以不参与测试,参与测试的文件数量=2个文件x2个副本=4个。
压测后的速度=1.67
实测速度=1.67M/s x 4个文件 = 6.68M/s
三台服务器带宽总和=12.5+12.5+12.5=37.5M/s
实测速度远小于网络,并且实测速度不能满足工作需求,可以使用固态硬盘或者增加磁盘个数。
2 测试HDFS读性能
读取HDFS集群2个128M的文件。
hadoop jar/opt/module/hadoop-3.3.1/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.3.1-tests.jarTestDFSIO -read -nrFiles 2 -fileSize 128MB
文件读取速度大于带宽原因:
数据读取使用就近原则,此时只有3台服务器、3个副本,读取时相当于读取的时本地磁盘的数据,没有经过网络。