尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Hadoop YARN 任务失败排查指南:从定位到解决

Hadoop YARN 任务失败排查指南:从定位到解决 任务类型MapReduce、Spark、Hive on MR、Spark‑SQL运行在 YARN 上。核心思路先看任务状态 → 看 YARN 日志 → 看具体异常栈 → 区分资源问题 / 代码逻辑 / 集群底层问题。一、第一步YARN WebUI 初步定位最优先访问 ResourceManager WebUI查看失败任务Failed 状态。查看Application ID记录application_xxxx。查看最终状态FINISHED正常结束。FAILED任务自身代码异常。KILLED被人为杀死或资源抢占、超时、内存超了被 NM 杀掉。SUBMITTED还没分配资源。ACCEPTED已经接收等待资源。查看失败原因摘要UI 上会展示简单 message。区分Application 失败整个作业挂掉。Application 成功但部分 Task 失败map task / reduce task / spark task 失败任务会重试重试耗尽后作业失败。二、区分是 Application 被 KILL还是 FAILED1状态为 KILLED常见原因人为执行yarn application -kill appId。AMApplicationMaster内存溢出 OOMNodeManager 把容器杀掉。资源抢占队列资源不足YARN 抢占容器。AM 超时失联AM 长时间没有向 RM 心跳超时被 kill。磁盘超出阈值NodeManager 本地磁盘使用率过高杀掉容器。2状态为 FAILED业务代码、数据、逻辑、Shuffle 异常看日志里的 Exception 堆栈。三、获取日志关键操作方式 1命令行抓取日志生产最常用# 获取整个 application 全部日志 yarn logs -applicationId application_xxxxxx app.log 只看 AM 日志优先看 AMAM 是作业管理者 yarn logs -applicationId application_xxxxxx -am am.logAM 日志作业的入口能看到作业的整体报错、配置、初始化异常。如果只是个别 task 失败需要看具体 Container 日志。方式 2WebUI 点击 logs 链接直接浏览器查看容器日志注意容器完成后日志聚合开启才可以看没有开启日志聚合容器销毁日志就丢失。配置yarn.log‑aggregation‑enabletrue四、分层排查按顺序第一层AM 日志ApplicationMaster先看 AM判断是作业初始化失败还是 task 运行阶段失败。如果 AM 直接报错退出作业还没开始跑 task 就失败。常见jar 包缺失、类冲突、参数错误、权限、队列不存在。AM 正常运行是部分 Container Task 失败需要看对应 Container 日志。第二层ContainerMap/Reduce/Spark Task日志一个 Container 对应一个 taskstdout、stderr 日志。重点看stderr异常堆栈打印在这里。常见异常分类① 内存相关最高频1. Container is running beyond memory limitsContainer 超出分配的内存上限被 NodeManager 直接杀死。两种内存物理内存、虚拟内存。常见原因数据倾斜导致单个 task 处理的数据量过大内存参数设置过小代码中存在大对象。处理方式调大 map/reduce/spark executor 内存排查数据倾斜优化代码。2. java.lang.OutOfMemoryErrorOOM 堆内存溢出需要区分是 AM OOM 还是 task OOM。AM OOM是 ApplicationMaster 进程内存溢出。AM 是整个作业的调度进程一个 job 只有一个 AM一旦发生 OOM整个 job 会直接失败。这种情况大多是 task 数量过多AM 需要维护大量任务元数据最终撑爆堆内存。处理调大 AM 容器内存与 JVM 堆优先合并小文件以减少 task 总数不能只单纯加大内存。yarn.app.mapreduce.am.resource.mb4096 yarn.app.mapreduce.am.java.opts-Xmx3072mTask OOM是 Map 或 Reduce 计算任务发生 OOM负责实际的数据计算。一般是个别 task 报错会自动重试多次失败后才会导致 job 失败。常见原因是单任务数据量大、数据倾斜。处理调大对应 map/reduce 内存检查是否存在数据倾斜增加 reduce 并行度、对热点 key 打散合并小文件。详解Map Task OOM、Reduce Task OOM1Map Task OOM原因单个分片数据过大读取数据时加载了大量对象小文件合并不到位。处理调大 map 内存mapreduce.map.memory.mb同时调大-Xmx。合并小文件控制每个 map 处理的数据量避免单个 map 处理超大文件。2Reduce Task OOM尤其数据倾斜最常见的是数据倾斜某一个 reduce key 的数据量巨大全部加载进内存聚合直接导致 OOM。处理步骤调大 reduce 容器内存和堆mapreduce.reduce.memory.mb8192 mapreduce.reduce.java.opts-Xmx6144m排查数据倾斜查看 Counter计数器观察每个 reduce 处理的数据量定位热点 key。解决方案开启 MapReduce 数据倾斜优化对热点 key 加盐打散进行二次聚合调大 reduce 并行度增加 reduce 数量以分摊数据。shuffle 阶段溢写参数优化调大溢写阈值减少内存压力。Task OOM 应优先排查数据倾斜不要一上来就无脑堆内存。② 数据 / 业务逻辑异常NullPointerExceptionNPE 空指针属于业务代码 bug。ArrayIndexOutOfBounds数组越界。数据格式异常Hive 读取脏数据、类型转换异常、字符串转数字失败。序列化异常序列化 / 反序列化报错。③ Shuffle 相关失败MR、Spark拉取 shuffle 数据失败Failed to fetch map output。原因DataNode 挂掉、网络抖动、磁盘 IO 过高、shuffle 数据磁盘满。Shuffle 文件损坏。大量 fetch 失败任务重试达到上限作业失败。④ HDFS 读写异常FileNotFound文件不存在输入路径被删除路径写错。权限异常Permission denied用户没有读 / 写 HDFS 目录权限。HDFS 集群异常DN 宕机块损坏磁盘满。⑤ 本地磁盘NodeManager 本地目录问题YARN 容器会写本地磁盘nm‑local‑dirsshuffle 中间数据写这里报错No space left on deviceNodeManager 本地磁盘满task 写 shuffle 失败。注意不是 HDFS 磁盘是 YARN 节点机器本地磁盘。⑥ 资源队列问题队列容量已满拿不到资源任务一直 ACCEPTED最后超时失败。用户没有该队列提交权限。最大并发任务数限制。五、辅助排查命令# 查看 yarn 队列资源 yarn queue -status 队列名 # 查看集群节点状态是否有节点 UNHEALTHY 不健康 yarn node -list -all # 查看 HDFS 状态是否有损坏块 hdfs fsck / # 查看 NodeManager 健康状态UNHEALTHY 代表本地磁盘满/故障该节点不再分配容器 yarn node -list -allNodeManager 状态变成unhealthy本机多块本地磁盘故障 / 磁盘满该节点不接收新容器。六、高频现象总结任务一直 ACCEPTED不运行队列资源耗尽没有可用资源NodeManager 全部不健康标签资源不匹配。部分 task 失败大部分 task 成功重试几次后作业失败优先怀疑数据倾斜、单 task 数据量过大 OOM、脏数据、shuffle 读取失败。一提交直接失败没有任何 map/reduce task 运行看 AM 日志检查 jar 包、类不存在、参数错误、路径错误、权限。Container killed by NodeManager绝大多数是内存超限其次是 NM 本地磁盘满节点不健康。七、精简版YARN 上任务失败排查步骤访问 RM WebUI拿到 applicationId观察作业状态是 FAILED 还是 KILLED。优先查看 AM 日志判断是作业初始化阶段失败还是 Task 运行阶段失败。如果是 Task 失败查看对应 Container stderr 日志抓取异常堆栈。归类问题容器被 KILL内存超限制 OOM、NM 本地磁盘满、资源抢占、AM 心跳超时。FAILED业务代码 bug、脏数据、序列化异常。Shuffle 报错网络、磁盘 IO、节点故障。HDFS 报错路径、权限、块损坏、磁盘满。辅助检查 YARN 节点健康状态、队列资源、HDFS 集群状态。补充踩坑点日志聚合没开启容器销毁后日志丢失无法排查生产必须开启日志聚合。区分两套磁盘HDFS 磁盘DataNode 存储业务数据。YARN‑NM 本地磁盘存放容器临时文件、shuffle 中间结果。NM 本地磁盘满会直接导致 task 失败和 HDFS 磁盘无关任务会自动重试个别 task 失败会重试重试次数耗尽整个作业才标记失败。
返回列表