Skip to content

HDFS—集群压测

在企业中非常关心每天从Java后台拉取过来的数据,需要多久能上传到集群?消费者关心多久能从HDFS上拉取需要的数据?
为了搞清楚HDFS的读写性能,生产环境上非常需要对集群进行压测。

1. 获取上传下载网速

HDFS的读写性能主要受网络和磁盘影响比较大。为了方便测试,需要提前得到当前HDFS所在集群的真实网速。 可以使用python内置的文件服务器功能, 将当前/opt/software目录共享, 进行下载测速。

sh
[jack@hadoop103 software]$ python -m SimpleHTTPServer

在hadoop102主机里进行下载文件:

sh
jack@hadoop102 tmp]$ wget http://hadoop103:8000/hadoop-3.3.6.tar.gz
--2024-01-23 14:33:24--  http://hadoop103:8000/hadoop-3.3.6.tar.gz
正在解析主机 hadoop103 (hadoop103)... 192.168.101.103
正在连接 hadoop103 (hadoop103)|192.168.101.103|:8000... 已连接。
已发出 HTTP 请求,正在等待回应... 
200 OK
长度:730107476 (696M) [application/octet-stream]
正在保存至: "hadoop-3.3.6.tar.gz"

100%[=====================================================================================>] 730,107,476  109MB/s 用时 6.6s   

2024-01-23 14:34:36 (105 MB/s) - 已保存 "hadoop-3.3.6.tar.gz" [730107476/730107476])

[jack@hadoop102 tmp]$
最大带宽=max(上传速度, 下载速度), 可以知道局域网hadoop集群最大带宽为110MB/s左右
也可以使用sftp客户端上传和下载文件测试:
![Alt text](images/imagezzzzzz.png)
![Alt text](images/imagegggggg.png)
可以知道hadoop集群到提交作业机器之间最大带宽为10MB/s
## 2. 测试HDFS写性能
测试内容:向HDFS集群写10个128M的文件  
```sh
[jack@hadoop102 hadoop]$ hadoop jar /opt/module/hadoop-3.3.6/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.3.6-tests.jar TestDFSIO -write -nrFiles 10 -fileSize 128MB
2024-01-23 14:01:01,447 INFO fs.TestDFSIO: TestDFSIO.1.8
2024-01-23 14:01:01,461 INFO fs.TestDFSIO: nrFiles = 10
2024-01-23 14:01:01,462 INFO fs.TestDFSIO: nrBytes (MB) = 128.0
2024-01-23 14:01:01,462 INFO fs.TestDFSIO: bufferSize = 1000000
2024-01-23 14:01:01,462 INFO fs.TestDFSIO: baseDir = /benchmarks/TestDFSIO
2024-01-23 14:01:03,053 INFO fs.TestDFSIO: creating control file: 134217728 bytes, 10 files
2024-01-23 14:01:05,862 INFO fs.TestDFSIO: created control files for: 10 files
......
2024-01-23 14:03:12,451 INFO fs.TestDFSIO: ----- TestDFSIO ----- : write
2024-01-23 14:03:12,452 INFO fs.TestDFSIO:             Date & time: Tue Jan 23 14:03:12 CST 2024
2024-01-23 14:03:12,452 INFO fs.TestDFSIO:         Number of files: 10
2024-01-23 14:03:12,452 INFO fs.TestDFSIO:  Total MBytes processed: 1280
2024-01-23 14:03:12,452 INFO fs.TestDFSIO:       Throughput mb/sec: 4.81
2024-01-23 14:03:12,452 INFO fs.TestDFSIO:  Average IO rate mb/sec: 4.86
2024-01-23 14:03:12,452 INFO fs.TestDFSIO:   IO rate std deviation: 0.49
2024-01-23 14:03:12,452 INFO fs.TestDFSIO:      Test exec time sec: 126.44
2024-01-23 14:03:12,452 INFO fs.TestDFSIO:
  1. 运行参数说明:
    其中nrFiles n为生成mapTask的数量,生产环境一般可通过hadoop103:8088查看CPU核数,设置为(CPU核数 - 1)
  2. 返回测试结果说明:
    • Number of files: 生成mapTask数量,一般是集群中(CPU核数-1),我们测试虚拟机就按照实际的物理内存-1分配即可
    • Total MBytes processed: 单个map处理的文件大小
    • Throughput mb/sec: 单个mapTak的吞吐量。
      计算方式:处理的总文件大小/每一个mapTask写数据的时间累加; 集群整体吞吐量:生成mapTask数量*单个mapTak的吞吐量
    • Average IO rate mb/sec: 平均mapTak的吞吐量。
      计算方式:每个mapTask处理文件大小/每一个mapTask写数据的时间,全部相加除以task数量
    • IO rate std deviation: 方差、反映各个mapTask处理的差值,越小越均衡
  3. 测试结果分析
    由于其中一个副本就在本地,所以该副本不参与测试
    一共参与测试的文件:10个文件 * 2个副本 = 20个 压测后的速度:4.81 实测速度:4.81M/s * 20个文件 ≈ 96M/s 三台服务器的带宽:96 + 96 + 96 ≈ 300M/s 所有网络资源都已经用满。

提示

如果实测速度远远小于网络,并且实测速度不能满足工作需求,可以考虑采用固态硬盘或者增加磁盘个数。

3. 测试HDFS读性能

测试内容:读取HDFS集群10个128M的文件

sh
[jack@hadoop102 tmp]$ hadoop jar /opt/module/hadoop-3.3.6/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.3.6-tests.jar TestDFSIO -read -nrFiles 10 -fileSize 128MB
2024-01-23 15:09:09,313 INFO fs.TestDFSIO: TestDFSIO.1.8
2024-01-23 15:09:09,329 INFO fs.TestDFSIO: nrFiles = 10
2024-01-23 15:09:09,329 INFO fs.TestDFSIO: nrBytes (MB) = 128.0
2024-01-23 15:09:09,329 INFO fs.TestDFSIO: bufferSize = 1000000
2024-01-23 15:09:09,329 INFO fs.TestDFSIO: baseDir = /benchmarks/TestDFSIO
2024-01-23 15:09:10,907 INFO fs.TestDFSIO: creating control file: 134217728 bytes, 10 files
2024-01-23 15:09:11,968 INFO fs.TestDFSIO: created control files for: 10 files
......
2024-01-23 15:10:44,831 INFO fs.TestDFSIO: ----- TestDFSIO ----- : read
2024-01-23 15:10:44,831 INFO fs.TestDFSIO:             Date & time: Tue Jan 23 15:10:44 CST 2024
2024-01-23 15:10:44,831 INFO fs.TestDFSIO:         Number of files: 10
2024-01-23 15:10:44,831 INFO fs.TestDFSIO:  Total MBytes processed: 1280
2024-01-23 15:10:44,831 INFO fs.TestDFSIO:       Throughput mb/sec: 18.41
2024-01-23 15:10:44,831 INFO fs.TestDFSIO:  Average IO rate mb/sec: 25.06
2024-01-23 15:10:44,831 INFO fs.TestDFSIO:   IO rate std deviation: 18.89
2024-01-23 15:10:44,832 INFO fs.TestDFSIO:      Test exec time sec: 92.79
2024-01-23 15:10:44,832 INFO fs.TestDFSIO:
  1. 删除测试生成数据
sh
[jack@hadoop102 tmp]$ hadoop jar /opt/module/hadoop-3.3.6/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.3.6-tests.jar TestDFSIO -clean
  1. 测试结果分析 为什么读取文件速度大于网络带宽? 由于目前只有三台服务器,且有三个副本,数据读取就近原则,相当于都是读取的本地磁盘数据,没有走网络。