Ubuntu HDFS性能如何测试
小樊
37
2026-01-01 12:08:11
Ubuntu 上 HDFS 性能测试实操指南
一 测试前准备
- 确认集群可用:NameNode、DataNode、ResourceManager、NodeManager 均健康,HDFS 处于 安全模式关闭 状态,目标目录(如 /bench)已创建且权限正确。
- 统一版本与路径:记录 Hadoop 版本 与测试 JAR 路径(不同版本 JAR 名可能不同,常见为 hadoop-mapreduce-client-jobclient-.jar 或 hadoop-mapreduce-examples-.jar)。
- 资源与队列:为基准测试单独配置 YARN 队列/资源,避免与业务争用;必要时设置容器内存与 vcore 上限。
- 清理干扰:测试前清理历史残留数据,避免缓存与副本影响结果。
- 网络与磁盘基线:先用系统工具做 网络带宽/磁盘 I/O 基线,便于后续归因(见下一节 fio 示例)。
二 快速入门 TestDFSIO 吞吐基准
- 写入测试(示例:10 个文件 × 128MB)
- 命令:
- hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-*.jar TestDFSIO -write -nrFiles 10 -fileSize 128MB
- 关键指标:
- Throughput mb/sec(吞吐,MB/s)、Average IO rate mb/sec、IO rate std deviation、Test exec time。
- 清理:
- hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-*.jar TestDFSIO -clean
- 读取测试(基于上一步生成的数据)
- 命令:
- hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-*.jar TestDFSIO -read -nrFiles 10 -fileSize 128MB
- 结果判读要点:
- 写入吞吐通常低于磁盘顺序写,受 网络、磁盘、副本数(默认 3) 影响显著;
- 读取吞吐通常高于写入(可本地读、无需多副本回传);
- 多次运行取中位数,尽量在 非高峰期 执行,避免其他负载干扰。
三 进阶与专项测试工具
- 计算与排序基准(Terasort)
- 生成数据:
- hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar teragen <记录数> /terasort/input
- 执行排序:
- hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar terasort /terasort/input /terasort/output
- 校验结果:
- hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar teravalidate /terasort/output /terasort/validate
- 适用场景:同时压测 HDFS + MapReduce 排序链路,评估端到端能力与稳定性。
- 元数据与 RPC 压力(SliveTest)
- 特点:通过大量 Mapper 发起 ls/create/read/append/delete 等 RPC,检验 NameNode 在混合操作下的性能与稳定性。
- 典型用法:
- hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-test-*.jar SliveTest -maps -ops -baseDir /test/slive
- 工作负载与综合套件(HiBench)
- 适用:多场景 Hadoop/Spark 基准(如 WordCount、Sort、PageRank 等),便于横向对比不同集群/参数。
- 基本流程:配置 hadoop.conf / spark.conf → 选择用例 → 运行脚本(如 run_all.sh)。
- 磁盘与系统基线(fio)
- 目的:在提交 HDFS 测试前,先排除 单机磁盘/IO 调度 瓶颈。
- 示例:
- 顺序读:fio -filename=/tmp/test.log -direct=1 -iodepth=1 -thread -rw=read -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_r
- 顺序写:fio -filename=/tmp/test.log -direct=1 -iodepth=1 -thread -rw=write -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_w
四 结果解读与瓶颈定位
- 写入吞吐低:
- 若接近 磁盘顺序写 能力,瓶颈多在磁盘;若远低于磁盘,检查 网络带宽/副本数/磁盘并发;
- 观察是否有 NameNode RPC 拥塞、磁盘繁忙或数据目录不均衡。
- 读取吞吐异常:
- 读取通常可本地命中,若远低于磁盘/网络能力,检查 副本布局、数据本地性、块大小 与读取并发。
- 与硬件基线的关系:
- 经验上,HDFS 写入吞吐 ≈ 单机磁盘顺序写 × 并发度 ÷ 副本数;
- 读取吞吐 ≈ 单机磁盘顺序读 × 并发度(本地读占比高)。
- 网络与磁盘的快速自检:
- Ubuntu 可用 speedometer 观察网卡收发包速率(如:speedometer -r ens3;speedometer -t ens3);
- 用 fio 得到磁盘顺序/随机 I/O 上限,作为 HDFS 测试的对照。
五 参数与执行建议
- 并发度设置:
- 写入并发 ≈ DataNode 数 × 每节点磁盘数;读取并发可适当放大;
- 也可按 CPU 总核数 - 1 设定并发任务数,避免资源争用。
- 文件与块大小:
- 大文件 + 较大 block size(如 128MB/256MB) 更利于顺序吞吐;小文件多会放大 NameNode 元数据 压力。
- 副本因子:
- 测试环境的 dfs.replication 尽量与生产一致(常见为 3),否则吞吐与稳定性结论不可比。
- 清理与复测:
- 每次测试前后执行 TestDFSIO -clean,避免缓存与历史数据影响;
- 固定 JAR 版本/参数/并发/文件大小,至少 3 次取中位数 作为报告值。