企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] # 常用的调优参数 ## 资源相关参数 以下参数是在用户自己的mr应用程序中配置就可以生效(mapred-default.xml) | 配置参数 | 参数说明 | | --- | --- | | mapreduce.map.memory.mb | 一个Map Task可使用的资源上限(单位:MB),默认为1024.如果Map Task实际使用的资源量超过该值,则会被强制杀死 | | mapreduce.reduce.memory.mb | 一个Reduce Task可使用的资源上限(单位:MB),默认1024.如果Reduce Task实际使用的资源量超过该值,则会被强制杀死 | | mapreduce.map.cpu.vcores | 每个Map task可使用的最多cpu core数目,默认值:1 | | mapreduce.reduce.cpu.vcores | 每个Reduce Task可使用的最多cpu core数目,默认值:1 | | mapreduce.reduce.shuffle.parallelcopies | 每个Reduce去map中拿数据的并行数,默认值是5 | | mapreduce.reduce.shuffle.merge.percent | buffer中的数据达到多少比例开始写入磁盘.默认值0.66 | | mapreduce.reduce.shuffle.input.buffer.percent | buffer大小占reduce可用内存的比例.默认值0.7 | | mapreduce.reduce.input.buffer.percent | 指定多少比例的内存用来存放buffer中的数据,默认值是0.0 | 在yarn启动之前就配置在服务器的配置文件中才能生效(yarn-default.xml) | 配置参数 | 参数说明 | | --- | --- | | yarn.scheduler.minumum-allocation-mb 1024 | 给应用程序container分配的最小内存 | | yarn.scheduler.maximum-allocation-mb 8192 | 给应用程序container分配的最大内存 | | yarn.scheduler.minimum-allocation-vcores 1 | 每个container申请的最小cpu核数 | | yarn.scheduler.maximum-allocation-vcores 32 | 每个container申请的最大cpu核数 | | yarn.nodemanager.resource.memory-mb 8192 | 给containers分配的最大物理内存 | shuffle性能优化的关键参数,应在yarn启动之前就配置好(mapred-default.xml) | 配置参数 | 参数说明 | | --- | --- | | mapreduce.task.io.sort.mb 100 | shuffle的环形缓冲区大小,默认值100m | | mapreduce.map.sort.spill.percent 0.8 | 环形缓冲区溢出的阈值,默认值80% | ## 容错相关参数(mapreduce性能优化) | 配置参数 | 参数说明 | | --- | --- | | mapreduce.map.maxattempts | 每个Map task最大重试次数,一旦重试参数超过该值,则认为Map task运行失败,默认值:4 | | mapreduce.reduce.maxattempts | 每个Reduce task最大重试次数,一旦重试参数超过该值,则认为Map task运行失败,默认值:4 | | mapreduce.task.timeout | Task超时时间,经常需要设置的一个参数,该参数表达的意思为:如果以个task在一定时间内没有任何进入,即不会读取新的数据,也没有输出数据,则认为该task处于block状态,可能是卡住了,也许是永远卡住了,为了房租因为用户程序永远block住不退出,则强制设置了一个该超时时间(单位毫秒,默认是600000).如果你的程序对每条输入数据的处理时间过长(比如会访问数据库,通过网络拉取数据等),建议将该参数调大,该参数过小常出现错误提示是: "AttemptID:attempt_14267829456721_123456_m_000224_0 Timed out after 300 secsContainer killed by the ApplicationMaster" | # 合理设置reduce端的buffer 默认情况下,数据达到一个阈值的时候,buffer中的数据就会写入磁盘,然后reduce会从磁盘中获得所有的数据. 也就是说buffer和reduce是没有直接关联的,中间多一个写磁盘->读磁盘的过程,既然有这个弊端,那么可以通过参数来配置,使得buffer中有一部分数据可以直接输送到reduce,从而减少IO开销. ~~~ mapred.job.reduce.input.buffer.percent 默认为0 ~~~ 当值大于0的时候,会保留指定比例的内存读buffer中的数据直接拿给reduce使用. 这样一来,设置buffer需要内存,读取数据需要内存,reduce计算也要内存,所以要根据作业的运行情况进行调整 # 网络性能 **linux层面** 每个端口监听队列的最大长度 ~~~ echo net.core.somaxconn=37628>>/etc/sysctl.conf ~~~ **hadoop集群限制** 每个端口监听队列长度 core-site Ipc.server.listen.queue.size控制了服务端socket的监听队列长度,默认值128,这个要和net.core.somaxconn配合使用 ~~~ <property> <name>Ipc.server.listen.queue.size</name> <value>65535</value> </property> ~~~ **datanode数据移动的带宽** 默认是1M,公司集群带宽一般能千M的,所以这个尽量调大 ~~~ <property> <name>dfs.datanode.balance.bandwidthPerSec</name> <value>1048576</value> </property> ~~~ **namenode RPC处理线程数** ~~~ dfs.namenode.handler.count=30(默认10) ~~~ **datanode RPC处理线程数** ~~~ dfs.datanode.handler.count=20(默认10) ~~~ **集群数据传输的并行度** ~~~ Name: Mapreduce.tasktracker.http.threads Value: 40 ~~~ **shuffle阶段reduce拉取数据并行度** ~~~ mpred.reduce.parallelcopys ~~~ 最好设置为cpu的核数 **中间结果压缩** ~~~ Name: Mapreduce.map.output.compress Value: true ~~~ ~~~ Name: Mapreduce.map.output.compress.codec Value: org.apache.hadoop.io.compress.SnappyCodec ~~~ # 提高并行度 datanode允许同时接收或发送任务数量 ~~~ dfs.datanode.max.trasfer.threads=8192 ~~~ # 内存调优 **liunx** swap分区设置为0,优先使用内存 ~~~ echo vm.swappiness=0>>/etc/sysctl.conf ~~~ **namenode** 首先必须调整新生代老年代比例,namenode内存中维护元数据,老年代比例占用较大 垃圾回收机制采用多线程,并发回收 开启永久代回收 ~~~ vim hadoop-env.sh export HADOOP_NAMENODE_OPTS="${HADOOP_NAMENODE_OPTS} -Xms10240m -Xmx10240m -XX:+UseParNewGC 设置年轻代为多线程并行收集 -XX:+UseConcMarkSweepGC 年老代激活CMS收集器(标记算法),可以尽量减少fullGC -XX:+CMSConcurrentMTEnabled 当该标志被启用时,并发的CMS阶段将以多线程执行 -XX:CMSInitiatingOccupancyFraction=70 当年老代空间被占用70%的时候触发CMS垃圾收集 -XX:+CMSClassUnloadingEnaled 设置这个参数表示对永久带进行垃圾回收,CMS默认不对永久代进行垃圾回收 ~~~ **mapreduce** map端的内存 ~~~ Name: mapreduce.map.memory.mb Value: 1280 ~~~ map端jvm堆内存 ~~~ Name: Mapreduce.map.java.opts Value: -Xmx1024m -XX:-UseGCOverheadLimit XX:+UseConcMarkSweepGC ~~~ reduce端内存 ~~~ Name: Mapreduce.reduce.memory.mb Value: 1280 ~~~ reduce端jvm堆内存 ~~~ Name: Mapreduce.reduce.java.opts Value: -Xmx1024m -XX:-UseGCOverheadLimit ~~~ jvm堆内存一定要小于task容器内存,首先调大新生代与老生代内存比例. eden和生长区比例: -XX:SurvivorRatio # yarn 给nodemanager可用的物理内存 ~~~ Name: yarn.nodemanager.resource.memory-mb Value: 8192 ~~~ 单个任务可申请的最少内存 ~~~ Name: Yarn.scheduler.minimum-allocation-mb Value: 1024 ~~~ 单个任务可申请的最大内存 ~~~ Name: yarn.scheduler.maximum-allocation-mb Value: 8192 ~~~ yarn这个节点可使用的虚拟CPU个数,默认是8,但我们通常配置成跟物理CPU个数一样 ~~~ Yarn.nodemanager.resource.cpu-vcores Value:4 ~~~ # 数据缓冲区 **环形缓冲区的阈值** ~~~ Mapreduce.map.sort.spill,percent默认0.8,可以调整为0.6 ~~~ **内部排序缓冲区大小** ~~~ mapreduce.task.io.sort.mb 默认100M,可以适当调大一些 ~~~ IO.file.buffer.size默认值4096(4k),hadoop集群缓冲区大小,hdfs文件读写,mapreduce程序环形缓冲区等.缓冲区大小严重影响执行效率,建议调整到95536-131072