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客户端上传和下载文件测试:


可以知道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:
- 运行参数说明:
其中nrFiles n
为生成mapTask的数量,生产环境一般可通过hadoop103:8088查看CPU核数,设置为(CPU核数 - 1) - 返回测试结果说明:
- 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处理的差值,越小越均衡
- 测试结果分析
由于其中一个副本就在本地,所以该副本不参与测试
一共参与测试的文件: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:
- 删除测试生成数据
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
- 测试结果分析 为什么读取文件速度大于网络带宽? 由于目前只有三台服务器,且有三个副本,数据读取就近原则,相当于都是读取的本地磁盘数据,没有走网络。