配置

ResourceManager

  1. yarn.scheduler.minimum-allocation-vcores
  2. yarn.scheduler.maximum-allocation-vcores #单Container最大最小虚拟CPU个数
  3. yarn.scheduler.minimum-allocation-mb
  4. yarn.scheduler.maximum-allocation-mb #单任务申请最大最小内存数
  5. yarn.resourcemanager.max-completed-applicaitons 应用完成列表默认10000
  6. yarn.resourcemanager.rm.container-allocation.expiry-interval-ms 默认60000,超时AM没有使用容器则强制回收。
  7. yarn.resourcemanager.scheduler.monitor.enable true 开启抢占模式,默认false
  8. yarn.resourcemanager.scheduler.monitor.policies 抢占策略
  9. yarn.scheduler.capacity.resource-calculator 可以设置资源比较器
  10. yarn.resourcemanager.scheduler.address #默认8030
  11. yarn.resourcemanager.address #默认8032

NodeManager

配置前缀yarn.nodemanager

  1. yarn.nodemanager.resource.cpu-vcores #目前推荐将该值设值为与物理CPU核数数目相同。
  2. yarn.nodemanager.vmem-pmem-ratio #默认2.1虚拟内存比例。如果运行时内存超过申请内存*2.1。
  3. #NM就会kill掉这个Container,任务执行过程就会出现异常。
  4. yarn.nodemanager.resource.memory-mb #物理内存总量,Yarn如果不开硬件检测,默认8192mb。
  5. yarn.nodemanager.resource.detect-hardware-capabilities 硬件检测默认false
  6. local-dirs #本地可用目录列表,通常存储应用中间结果
  7. log-dirs #存放日志目录列表

健康检查

  1. yarn.nodemanager.health-checker. #自定义脚本健康检查
  2. script.path #脚本绝对路径,如果脚本为空则不启动检查线程。
  3. interval-ms #默认600 000毫秒 10分钟。脚本执行频率。
  4. script.timeout-ms #如果脚本默认1200 000毫秒(20分钟)没响应,则为不健康。
  5. script.opts #传入脚本参数,多参数用逗号隔开。
  6. yarn.nodemamanger.disk-health-checker #磁盘健康检查
  7. enable #默认开启,磁盘检查。
  8. min-healthy-disks #默认0.25,低于这个比例则认为不健康。

事例脚本

  1. #!/bin/bash
  2. MEMORY_RATIO=0.1
  3. free_mem=`grep MemFree /proc/meminfo | awk '{print $2}'`
  4. total_mem=`grep MemTotal /proc/meminfo | awk '{print $2}'`
  5. limit_mem=`echo | awk '{print int("'${total_mem}'"*"'${MEMORY_RATIO}'")}'`
  6. if [[ ${free_mem} -lt ${limit_mem} ]]; then
  7. echo "ERROR, total_mem=${total_mem}, free_mem=${free_mem}, limit_mem=${limit_mem}"
  8. else
  9. echo "OK, total_mem=${total_mem}, free_mem=${free_mem}, limit_mem=${limit_mem}"
  10. fi

日志

输出应用日志
yarn logs -applicationId application_1561533776511_4716 > log.txt

  1. #配置多久后聚合后的日志文件被删除, 配置成 -1 或者一个负值就不会删除聚合日志.
  2. yarn.log-aggregation.retain-seconds: 86400
  3. yarn.nodemanager.remote-app-log-dir: /tmp/logs
  4. yarn.nodemanager.remote-app-log-dir-suffix: logs

权限

yarn.admin.acl设置集群管理员

命令

开启history服务器,收集聚合日志。

  1. hadoop/sbin/mr-jobhistory-daemon.sh start historyserver
  1. yarn application -kill application_1436784252938_0013

调试

开启远程调试模式

配置环境变量在启动

  1. export YARN_NODEMANAGER_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8788,
  2. server=y,suspend=y"

开启Debug日志模式

0x01 使用 Hadoop Shell 命令

  1. bin/hadoop daemonlog -getlevel ${nodemanager-host}:8042 \
  2. org.apache.hadoop.yarn.server.nodemanager.NodeManager
  3. bin/hadoop daemonlog -setlevel ${nodemanager-host}:8042 \
  4. org.apache.hadoop.yarn.server.nodemanager.NodeManager DEBUG

其 中,nodemanager-host 为 NodeManager 服 务 所 在 的 host,8042 是 NodeManager 的 HTTP 端口口号。

0x02 Web后台设置

RM、NM、JobHistory设置地址如下。

  1. http://${rm_host}:8042/logLevel
  2. http://${nm_host}:8042/logLevel
  3. http://${jhs_host}:19888/logLevel

设置方法如下图,输入类全路径名和日志等级。

image.png

0x03 修改 log4j.properties 文件

其他两种方式重启会重置,这种可以永久修改。

  1. log4j.logger.org.apache.hadoop.yarn.server.nodemanager.NodeManager=DEBUG

有时为了专门调试一个 Java 文件,可以把该文件日志输出到一个文件中,可在 log4j.properties 中添加以下内容:

  1. # 定义输出方式为自定义的 TTOUT
  2. log4j.logger.org.apache.hadoop.yarn.server.nodemanager.NodeManager=DEBUG,TTOUT
  3. # 设置 TTOUT 的输出方式为输出
  4. log4j.appender.TTOUT =org.apache.log4j.FileAppender
  5. # 设置文件路径
  6. log4j.appender.TTOUT.File=${hadoop.log.dir}/NodeManager.log
  7. # 设置文件的布局
  8. log4j.appender.TTOUT.layout=org.apache.log4j.PatternLayout
  9. # 设置文件的格式
  10. log4j.appender.TTOUT.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n

这样配置会把NodeManager.java的Debug日志输出到NodeManager.log中。

自己在代码里注入日志

  1. //类里注入下面这行代码
  2. public static final Log LOG = LogFactory.getLog(NodeManager.class);
  3. //想打日志的地方写上
  4. LOG.debug("Start to lauch NodeManager...");

硬盘使用超过90%,NodeManager会失效。无法在接收任务。硬盘扩容后会自动恢复。

java.net.BindException: Problem binding to [h3:8031]

和HDFS的NameNode在一台机器上运行start-yarn.sh。会报RM的8031被占用,可以换个节点启动RM。

org.apache.hadoop.yarn.server.resourcemanager.ResourceManager: Error starting ResourceManager
java.lang.NoClassDefFoundError:org/apache/hadoop/yarn/server/timelineservice/collector/TimelineCollectorManager

复制 “hadoop-yarn-server-timelineservice-2.8.3.jar” 从 ~\hadoop-2.8.3\share\hadoop\yarn\timelineservice 到~\hadoop-2.8.3\share\hadoop\yarn 目录.

stop-yarn.sh要在RM的节点上才行。要不RM不会Stop。

内存不够问题

出现以下日志

  1. doesn't satisfy minimum allocations,

说明这个选项太大了,机器资源无法满足。RM会发送SHUTDOWN信号杀死NM。

  1. yarn.nodemanager.resource.memory-mb
  2. yarn.nodemanager.resource.cpu-vcores

备忘

目前要想修改NM可用资源量要重启NM,未来可能会加入动态修改可用资源(YARN-291)。

参考资料

yarn-maximum-attempt
http://johnjianfang.blogspot.com/2015/04/the-number-of-maximum-attempts-of-yarn.html