首页 > 其他分享 >HDFS集群压测实践

HDFS集群压测实践

时间:2023-11-07 23:34:12浏览次数:46  
标签:HDFS map 压测 性能 jar hadoop mapreduce 集群

1. 背景

在部署Hadoop集群时,作为集群运维人员,往往需要了解集群性能。即集群能够处理数据的上限,集群的瓶颈等信息。特别是在上线一批尚未使用过的机型、磁盘时,更需要了解这些硬件上的变更是否会对集群整体性能有影响。本文介绍当DataNode挂载juicefs情况下,集群的性能表现;并且和只挂载Disk磁盘时的性能进行对比。

2. HDFS压测工具介绍

  1. Terasort:基于MapReduce的数据排序压测工具,当需要测试集群的计算能力时可以使用该工具进行压测。
  2. SliveTest:HDFS RPC压测工具。
  3. DFSIO:IO吞吐量压测工具。

2.1 Terasort

Terasort包含三个工具,分别是:

  1. teragen:用来生成供排序的随机数据;
  2. terasort:用来将随机数据排序;
  3. teravalidate:校验terasort的排序。

执行命令如下:


# 在/terasort/output下生成100个10G大小的文件,文件的blocksize是128MB
# /tmp/test/terasort/output 事先要删除
hadoop jar hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples.jar teragen -Dmapred.map.tasks=100 -Ddfs.block.size=134217728 10000000000 /tmp/test/terasort/output

# 对生成的文件进行排序
hadoop jar hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples.jar terasort -Dmapred.reduce.tasks=100 /tmp/test/terasort/output /tmp/test/terasort/result

# 对排序结果进行验证
hadoop jar hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples.jar teravalidate  /tmp/test/terasort/result /tmp/test/terasort/validate

Terasort使用场景:

  1. 不同版本Hadoop上运行TeraSort,使用相同的配置参数,来进行正确性和性能对比测试。
  2. 在相同版本Hadoop上运行TeraSort,使用不同的配置参数,进行性能对比测试,发现问题。例如设置不同的map数和block size检测HDFS性能状况。

2.2 SliveTest

SliveTest主要功能是通过大量map制造多种rpc请求,检测Namenode的性能, 位于test包(hadoop-mapreduce-client-jobclient-2.6.0-cdh5.6.0-tests.jar)中。SliveTest 可模拟以下多种RPC 操作(ls, create, append,delete,mkdir,rename,read),可能会造成NN 大量RPC, 生产环境不要运行。

执行命令如下:

# 并发量跟map数量有关
hadoop jar hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.6.0-cdh5.6.0-tests.jar SliveTest -maps 90 -ops 10000 -files 100 -resFile /tmp/slivetest.txt

配置建议:可以设定map数量,每个map发起的rpc请求次数,每一种rpc操作占总操作的百分比,以及读写数据量、block size等配置。

2.3 DFSIO

DFSIO是一个标准的HDFS的Benchmark工具,位于test包(hadoop-mapreduce-client-jobclient-2.6.0-cdh5.6.0-tests.jar)中, 测试的是读和写的性能指标,执行完后会打印IO吞吐率。

由于DFSIO可以直接测试HDFS的读写性能,往往替代Terasort工具。

执行命令如下:

# 写入性能测试(写10个文件,每个文件1GB,会创建一个有10个map的mr任务,每个map分配1C4GB资源)
hadoop jar hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.6.0-cdh5.6.0-tests.jar TestDFSIO -write -nrFiles 10 -size 1GB -resFile /tmp/writeres.txt

# 读文件性能测试
hadoop jar hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.6.0-cdh5.6.0-tests.jar TestDFSIO -read -nrFiles 10 -size 1GB -resFile /tmp/readres.txt

参数配置解释:

read : 读测试。执行该测试之前,需要先做write测试,以便先行在io_data目录下生成供读取的文件。
write :写测试,报告保存在“io_write/part-00000”中。
nfFiles :文件个数,默认为1
fileSize: 文件大小,默认为1MB
resFile:  结果文件名,默认为"TestDFSIO_results.log"
bufferSize: 设置缓存大小,默认为1000000
clean:清理数据
seq :数据是否有序,默认无序

其输出如下为例:

Untitled.png 输出解读:

  • Total MBytes processed:总共需要写入的数据量,也就是总文件数*单个文件的大小,单位MB。
  • Throughput mb/sec:总共需要写入的数据量/每个map任务实际写入数据的执行时间之和,这个值可以看做是hdfs的写入性能。
  • Average IO rate mb/sec:(每个map需要写入的数据量/每个map任务实际写入数据的执行时间)之和/任务数。Throughput mb/se和这个值的区别在于,前者更能反应总体的吞吐量,后者更照顾每个map的状况,并可以通过IO rate std deviation来反映出不同map之间的写入性能的波动。
  • IO rate std deviation:Average IO rate mb/sec的标准差。
  • Test exec time sec:整个job的执行时间。

吞吐量和平均IO速度计算公式如下所示,最终它们的差别不会很大:

Untitled 1.png

3. HDFS集群压测实践

  1. 压测目的:查看HDFS on Juicefs和HDFS on SSD性能差别以及HDFS on Juicefs的性能瓶颈。
  2. 压测方式:
    1. SliveTest压测RPC。
    2. DFSIO压测读写性能。

3.1 RPC性能压测

在1000个maps中,每个map发送各类RPC请求,如下:

# 1000 并发
hadoop jar hadoop2/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.6.0-cdh5.6.0-tests.jar SliveTest -maps 1000 -ops 10000 -files 1000 -resFile /home/hadoop/tmp/slivetest.txt

观察各种rpc耗时,除了fsimage处理,其他rpc均低于10ms,性能正常:

Untitled 2.png

3.2 读写性能压测

正常写性能

方案:分别在Disk和Juicefs中以1000个map并发,每个map写10GB的文件。

默认HDFS存储策略就是写HDFS。如下,直接写文件到/benchmarks/TestDFSIO 目录中:

# 写文件
hadoop jar hadoop2/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.6.0-cdh5.6.0-tests.jar TestDFSIO -write -nrFiles 1000 -size 10GB -resFile /home/hadoop/tmp/writeres.txt

juicefs标注的时SSD类型,将/benchmarks/TestDFSIO 设置为ALL_SSD策略再执行写入:

# 设置DFSIO目录策略为ALL_SSD
hdfs storagepolicies -setStoragePolicy -path /benchmarks/TestDFSIO -policy ALL_SSD

# 查看目录是否是SSD策略
hdfs storagepolicies -getStoragePolicy -path /benchmarks/TestDFSIO
#写文件
hadoop jar hadoop2/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.6.0-cdh5.6.0-tests.jar TestDFSIO -write -nrFiles 1000 -size 10GB -resFile /home/hadoop/tmp/writeres.txt

通过对比,发现写入磁盘吞吐量为24.8mb/s,写入juicefs吞吐量为18.45mb/s,性能降低25%。

Untitled 3.png

正常读性能

# 读文件
hadoop jar /home/hadoop/hadoop2/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.6.0-cdh5.6.0-tests.jar TestDFSIO -read -nrFiles 1000 -size 10GB -resFile /home/hadoop/tmp/readres.txt

通过对比,发现读取磁盘吞吐量为93.98mb/s,写入juicefs吞吐量为80.27mb/s,性能降低14%。

Untitled 4.png

juicefs极限情况下读写性能

5000maps,每个map读写20GB数据。对于写性能,单机带宽打满,S3带宽有空闲。

Untitled 5.png

对于读性能,同样如此:

Untitled 6.png

3.2 总结

写入juicefs相对于写入HDFS,其读写性能下降15%~30%。对于当前测试方案,由于单机带宽和机器数量的限制,未能达到S3带宽上限,无法探测性能上限。对于当前集群,最多能并发处理100TB数据。

方案优化点:

  1. 由于juicefs会经常上传小文件到s3中,因此可以测试op并发上限,这种测试一般由juicefs自身的压测命令执行。
  2. 在压测时,也应该观察HDFS个组件和juicefs性能指标,观察是否发生性能瓶颈。

标签:HDFS,map,压测,性能,jar,hadoop,mapreduce,集群
From: https://blog.51cto.com/u_15327484/8240333

相关文章

  • python连接redis集群写入数据
    环境;Python:3.6.5 需要安装redis-py-cluster模块 #!/usr/bin/envpython#coding=utf-8fromredisclusterimportRedisClusterstartup_nodes=[{"host":"192.168.1.109","port":7001},{"host":"192.168.1.10......
  • HDFS基于Ranger鉴权原理
    1.背景在HDFS中,默认是通过setacl和getacl命令的方式增加和查询hdfs的acl信息。为了了解acl信息,需要亲自登陆机器执行hdfs命令,对于没有机器权限的业务人员非常不友好;同时,运维人员无法浏览HDFS所有acl信息,对于管理来说也不透明。为了解决该问题,引入了Ranger组件,将acl信息存放到Ran......
  • PySpark判断Hdfs文件路径是否存在
    背景从ScalaSpark代码转PySpark代码,同时实现连续读多个文件,避免因某些路径不存在导致程序终止。在Scala的Spark中可以直接导下面两个模块的包importorg.apache.hadoop.conf.Configurationimportorg.apache.hadoop.fs._然后调用方法就可以实现对hdfs的文件判断了valfs=......
  • kubeasz搭建k8s高可用集群
     kubeasz致力于快速部署高可用k8s集群的工具,同时也努力成为k8s实践、使用的参考书;基于二进制方式部署和ansible-playbook实现自动化;既提供一键安装脚本,可以刻根据安装指南分布执行安装各个组件。 Kubeasz从每一个单独部件组装到完整的集群,提供最灵活的配置能力,几乎可以设置任......
  • 容器化-Docker集群
    笔记课程专题:微服务容器化四、容器化-Docker集群1、Docker集群理解docker集群:多个docker实例组成的集合1、保证docker高可用2、解决项目高性能和高可用docker集群搭建前提docker集群内部概念1、worker工作者运行项目2、manager管理者管理其他docker实例。安......
  • HDFS Balancer存储水位稳定性原理与实践
    1.背景在HDFS分布式系统中,经常会上线新的datanode以环境集群容量不足的问题。但是往往旧datanode水位较高,甚至爆满无法写入,新datanode非常空闲,导致旧机器无法写入数据,集群的流量集中到新datanode中,造成新datanode网络延迟。为了解决上述问题,可以通过Balancer工具定时讲高水位dat......
  • Redis集群之主从模式
    搭建主从架构单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。假设有A、B两个Redis实例,如何让B作为A的slave节点?●在B节点执行命令:slaveofA的IPA的port主从数据同步原理全量同步主从第一次同步是全量同步:master如何判断slave是......
  • Java21对虚拟线程进行http压测使用不同的GC
    JDK21默认GC是G1.JDK21除了G1外,还可以使用ZGC(Java11预览、Java15正式版),Java21在ZGC基础上继续推出了分代ZGC,目前还是试行阶段。开启ZGC:java-XX:+UseZGC-jarmyapp.jar开启ZGC,并试用分代ZGCjava-XX:+UseZGC-XX:+ZGenerational-jarmyapp.jar以下的对一个启用tomcat......
  • springboot第44集:Kafka集群和Lua脚本
    servers:Kafka服务器的地址。这是Kafka集群的地址,生产者将使用它来发送消息。retries:在消息发送失败时,生产者将尝试重新发送消息的次数。这个属性指定了重试次数。batchSize:指定了生产者在发送消息之前累积的消息大小(以字节为单位)。一次性发送多个消息可以提高性能。linger:指定了生......
  • HDFS Distcp数据迁移与优化实践
    1.背景对于HDFS集群而言,不可避免会将一个集群中的数据迁移到另外一个集群中。一般以下几种情况需要进行迁移:hadoop2集群中的项目数据迁移到hadoop3中。hadooprbf的一个子集群block数量在2亿~3亿,需要将大项目迁移到其他空闲子集群。海外项目数据由于历史原因存放到国内集群,根......