热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

FlinkonYARN常见问题与排查思路

杨弢(搏远),阿里巴巴计算平台事业部技术专家,ApacheHadoopCommitter,目前专注于YARN、Flink、YuniKorn等开源项目的资源调度方向。Flink支持S






杨弢(搏远),阿里巴巴计算平台事业部技术专家,Apache Hadoop Committer,目前专注于 YARN、Flink、YuniKorn 等开源项目的资源调度方向。




Flink 支持 Standalone 独立部署和 YARN、Kubernetes、Mesos 等集群部署模式,其中 YARN 集群部署模式在国内的应用越来越广泛。Flink 社区将推出 Flink on YARN 应用解读系列文章,分为上、下两篇。上篇分享了
基于 FLIP-6 重构后的资源调度模型介绍 Flink on YARN 应用启动全流程
本文将根据社区大群反馈,解答客户端和 Flink Cluster 的常见问题,分享相关问题的排查思路。


客户端常见问题与排查思路



▼ 应用提交控制台异常信息:Could not build the program from JAR file.


这个问题的迷惑性较大,很多时候并非指定运行的 JAR 文件问题,而是提交过程中发生了异常,需要根据日志信息进一步排查。最常见原因是未将依赖的 Hadoop JAR 文件加到 CLASSPATH,找不到依赖类(例如:ClassNotFoundException: org.apache.hadoop.yarn.exceptions.YarnException)导致加载客户端入口类(FlinkYarnSessionCli)失败。



▼ 

Flink on YARN 应用提交时如何关联到指定 YARN 集群?


Flink on YARN 客户端通常需配置 HADOOP_CONF_DIR 和 HADOOP_CLASSPATH 两个环境变量来让客户端能加载到 Hadoop 配置和依赖 JAR 文件。示例(已有环境变量 HADOOP_HOME 指定 Hadoop 部署目录):


export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop

export HADOOP_CLASSPATH=`${HADOOP_HOME}/bin/hadoop classpath`



▼ 

客户端日志在哪里,如何配置?



客户端日志通常在 Flink 部署目录的 log 文件夹下:
${FLINK_HOME}/log/flink-${USER}-client-.log
,使用 log4j 配置:
${FLINK_HOME}/conf/log4j-cli.properties



有的客户端环境比较复杂,难以定位日志位置和配置时,可以通过以下环境变量配置打开 log4j 的 DEBUG 日志,跟踪 log4j 的初始化和详细加载流程:
export JVM_ARGS="-Dlog4j.debug=tru
e"



▼ 

客户端疑难问题排查思路



当客户端日志无法正常定位时,可以修改 log4j 配置文件将日志级别由 INFO 改为 DEBUG 后重新运行,看是否有 DEBUG 日志可以帮助排查问题。对于一些没有日志或日志信息不完整的问题,可能需要开展代码级调试,修改源码重新打包替换的方式太过繁琐,推荐使用 Java 字节码注入工具 Byteman(详细语法说明请参考:
Byteman Document
),使用示例:


(1) 编写调试脚本,例如打印 Flink 实际使用的 Client 类,以下脚本表示在 CliFrontend#getActiveCustomCommandLine 函数退出时打印其返回值;


RULE test

CLASS org.apache.flink.client.cli.CliFrontend

METHOD getActiveCustomCommandLine

AT EXIT

IF TRUE

DO traceln("------->CliFrontend#getActiveCustomCommandLine return: "+$!);

ENDRULE


(2) 设置环境变量,使用 byteman javaagent:


export BYTEMAN_HOME=/path/to/byte-home

export TRACE_SCRIPT=/path/to/script

export JVM_ARGS="-javaagent:${BYTEMAN_HOME}/lib/byteman.jar=script:${TRACE_SCRIPT}"


(3) 运行测试命令 bin/flink run -m yarn-cluster -p 1 ./examples/streaming/WordCount.jar ,控制台将输出内容:


------->CliFrontend#getActiveCustomCommandLine return: org.apache.flink.yarn.cli.FlinkYarnSessionCli@25ce9dc4 


Flink Cluster 常见问题与排查思路



▼ 
用户应用和框架 JAR 包版本冲突问题


该问题通常会抛出 NoSuchMethodError/ClassNotFoundException/IncompatibleClassChangeError 等异常,要解决此类问题:



1.首先需要根据异常类定位依赖库
,然后可以在项目中执行 mvn dependency:tree 以树形结构展示全部依赖链,再从中定位冲突的依赖库,也可以增加参数 -Dincludes 指定要显示的包,格式为 [groupId]:[artifactId]:[type]:[version],支持*匹配,多个用逗号分隔,例如:mvn dependency:tree -Dincludes=*power*,*javaassist*;



2.定位冲突包后就要考虑如何排包
,简单的方案是用 exclusion 来排除掉其从他依赖项目中传递过来的依赖,不过有的应用场景需要多版本共存,不同组件依赖不同版本,就要考虑用 Maven Shade 插件来解决,详情请参考
Maven Shade Plugin。





 依赖库有多版本 JAR 包共存时如何确定某类的具体来源?


很多应用运行 CLASSPATH 中存在相同依赖库的多个版本 JAR 包,导致实际使用的版本跟加载顺序有关,排查问题时经常需要确定某个类的来源 JAR,Flink 支持给 JM/TM 进程配置 JVM 参数,因此可以通过下面三个配置项来打印加载类及其来源(输出在 .out 日志),根据具体需要选择其中之一即可:


env.java.opts=-verbose:class //配置JobManager&TaskManager

env.java.opts.jobmanager=-verbose:class //配置JobManager

env.java.opts.taskmanager=-verbose:class //配置TaskManager



▼ 

Flink 应用的完整日志如何查看?


Flink 应用运行中的 JM/TM 日志可以在 WebUI 上查看,但是查问题时通常需要结合完整日志来分析排查,因此就需要了解 YARN 的日志保存机制,YARN 上 Container 日志保存位置跟应用状态有关:



1.如果应用还没有结束
,Container 日志会一直保留在其运行所在的节点上,即使 Container 已经运行完成仍然可以在所在节点的配置目录下找到:
 ${yarn.nodemanager.log-dirs}//
,也可以直接从 WebUI访问:
http:///node/containerlogs//



2.如果应用已结束并且集群启用了日志收集
(yarn.log-aggregation-enable=true),则通常应用结束后(也有配置可以增量上传)NM会将其全部日志上传至分布式存储(通常是 HDFS)并删除本地文件,我们可以通过 yarn 命令 
yarn logs -applicationId -appOwner
 查看应用的全部日志,还可以增加参数项 
-containerId -nodeAddress
 来查看某 container 的日志,也可以直接访问分布式存储目录:
${yarn.nodemanager.remote-app-log-dir}/${user}/${yarn.nodemanager.remote-app-log-dir-suffix}/



▼ 

Flink 应用资源分配问题排查思路


如果 Flink 应用不能正常启动达到 RUNNING 状态,可以按以下步骤进行排查:



1.需要先检查应用当前状态,
根据上述对启动流程的说明,我们知道:





  • 处于 NEW_SAVING 状态
    时正在进行应用信息持久化,如果持续处于这个状态我们需要检查 RM 状态存储服务(通常是 ZooKeeper 集群)是否正常;





  • 如果处于 SUBMITTED 状态
    ,可能是 RM 内部发生一些 hold 读写锁的耗时操作导致事件堆积,需要根据 YARN 集群日志进一步定位;





  • 如果处于 ACCEPTED 状态
    ,需要先检查 AM 是否正常,跳转到步骤2;





  • 如果已经是 RUNNING 状态
    ,但是资源没有全部拿到导致 JOB 无法正常运行,跳转到步骤 3;





2.检查 AM 是否正常
,可以从 YARN 应用展示界面(
http:///cluster/app/
)或 YARN 应用 REST API(
http:///ws/v1/cluster/apps/
)查看 diagnostics 信息,根据关键字信息明确问题原因与解决方案:





  • Queue's AM resource limit exceeded
    . 原因是达到了队列 AM 可用资源上限,即队列的 AM 已使用资源和 AM 新申请资源之和超出了队列的 AM 资源上限,可以适当调整队列 AM 可用资源百分比的配置项:
    yarn.scheduler.capacity..maximum-am-resource-percent






  • User's AM resource limit exceeded
    . 原因是达到了应用所属用户在该队列的 AM 可用资源上限,即应用所属用户在该队列的 AM 已使用资源和 AM 新申请资源之和超出了应用所属用户在该队列的 AM 资源上限,可以适当提高用户可用 AM 资源比例来解决该问题,相关配置项:

    yarn.scheduler.capacity..user-limit-factor
     与 
    yarn.scheduler.capacity..minimum-user-limit-percent





  • AM container is launched, waiting for AM container to Register with RM. 
    大致原因是 AM 已启动,但内部初始化未完成,可能有 ZK 连接超时等问题,具体原因需排查 AM 日志,根据具体问题来解决。





  • Application is Activated, waiting for resources to be assigned for AM
    . 该信息表示应用 AM 检查已经通过,正在等待调度器分配,此时需要进行调度器层面的资源检查,跳转到步骤 4。





3.确认应用确实有 YARN 未能满足的资源请求
:从应用列表页点击问题应用 ID 进入应用页面,再点击下方列表的应用实例 ID 进入应用实例页面,看 Total Outstanding Resource Requests 列表中是否有 Pending 资源,如果没有,说明 YARN 已分配完毕,退出该检查流程,转去检查 AM;如果有,说明调度器未能完成分配,跳转到步骤4;



4.调度器分配问题排查

YARN-9050
支持在 WebUI 上或通过 REST API 自动诊断应用问题,将在 Hadoop3.3.0 发布,之前的版本仍需进行人工排查:





  • 检查集群或 queue 资源,scheduler 页面树状图叶子队列展开查看资源信息:
    Effective Max Resource、Used Resources:(1)检查集群资源或所在队列资源或其父队列资源是否已用完;(2)检查叶子队列某维度资源是否接近或达到上限;





  • 检查是否存在资源碎片:
    (1)检查集群 Used 资源和 Reserved 资源之和占总资源的比例,当集群资源接近用满时(例如 90% 以上),可能存在资源碎片的情况,应用的分配速度就会受影响变慢,因为大部分机器都没有资源了,机器可用资源不足会被 reserve,reserved 资源达到一定规模后可能导致大部分机器资源被锁定,后续分配可能就会变慢;(2)检查 NM 可用资源分布情况,即使集群资源使用率不高,也有可能是因为各维度资源分布不同造成,例如 1/2 节点上的内存资源接近用满 CPU 资源剩余较多,1/2 节点上的 CPU 资源接近用满内存资源剩余较多,申请资源中某一维度资源值配置过大也可能造成无法申请到资源;





  • 检查是否有高优先级的问题应用频繁申请并立即释放资源的问题
    ,这种情况会造成调度器忙于满足这一个应用的资源请求而无暇顾及其他应用;





  • 检查是否存在 Container 启动失败或刚启动就自动退出的情况
    ,可以查看 Container 日志(包括 localize 日志、launch 日志等)、YARN NM 日志或 YARN RM 日志进行排查。





▼ 


TaskManager 启动异常:



org.apache.hadoop.yarn.exceptions.YarnException: Unauthorized request to start container. This token is expired. current time is ... found ...


该异常在 Flink AM 向 YARN NM 申请启动 token 已超时的 Container 时抛出,通常原因是 Flink AM 从 YARN RM 收到这个 Container 很久之后(超过了 Container有效时间,默认 10 分钟,该 Container 已经被释放)才去启动它,进一步原因是 Flink 内部在收到 YARN RM 返回的 Container 资源后串行启动。



当待启动的 Container 数量较多且分布式文件存储如 HDFS 性能较慢(启动前需上传 TaskManager 配置)时 Container 启动请求容易堆积在内部,
FLINK-13184
对这个问题进行了优化,一是在启动前增加了有效性检查,避免了无意义的配置上传流程,二是进行了异步多线程优化,加快启动速度。





▼ 

Failover 异常 1:



java.util.concurrent.TimeoutException: Slot allocation request timed out for ...


异常原因是申请的 TaskManager 资源无法正常分配,可以按 Flink 应用资源分配问题排查思路的步骤4排查问题。



▼ 


Failover 异常 2:



java.util.concurrent.TimeoutException: Heartbeat of TaskManager with id timed out.


异常直接原因是 TaskManager 心跳超时,进一步原因可能有:





  • 进程已退出
    ,可能自身发生错误,或者受到 YARN RM 或 NM 上抢占机制影响,需要进一步追查 TaskManager 日志或 YARN RM/NM 日志;





  • 进程仍在运行
    ,集群网络问题造成失联,连接超时会自行退出,JobManager 在该异常后会 Failover 自行恢复(重新申请资源并启动新的 TaskManager);





  • 进程 GC 时间过长
    ,可能是内存泄露或内存资源配置不合理造成,需根据日志或分析内存进一步定位具体原因。





▼ 


Failover 异常 3:



java.lang.Exception: Container released on a lost node


异常原因是 Container 运行所在节点在 YARN 集群中被标记为 LOST,该节点上的所有 Container 都将被 YARN RM 主动释放并通知 AM,JobManager 收到此异常后会 Failover 自行恢复(重新申请资源并启动新的 TaskManager),遗留的 TaskManager 进程可在超时后自行退出。



▼ 
Flink Cluster 疑难问题排查思路



首先根据 JobManager/TaskManager 日志分析定位问题,完整日志请参考“Flink 应用的完整日志如何查看”,如果想获取 DEBUG 信息,需修改 JobManager/TaskManager 的 log4j 配置(${FLINK_HOME}/conf/log4j.properties)后重新提交运行,对于仍在运行的进程,推荐使用 Java 字节码注入工具 Byteman 来一窥进程内部的相关状态,详细说明请参考:
How Do I Install  The Agent Into A Running Program?


参考资料



文中
绿色字体
部分均有跳转,详细参考资料请见下方链接:




  • Byteman Documents




https://byteman.jboss.org/docs.html




  • Maven Shade Plugin




http://maven.apache.org/plugins/maven-shade-plugin/




  • YARN-9050




https://issues.apache.org/jira/browse/YARN-9050




  • FLINK-13184




https://issues.apache.org/jira/browse/FLINK-13184




  • How Do I Install  The Agent Into A Running Program?





https://developer.jboss.org/wiki/ABytemanTutorial#how_do_i_run_a_program_using_byteman



Flink on YARN
上、下两篇文章对 Flink on YARN 应用启动全流程
进行梳理,并对客户端和 Flink Cluster 的常见问题提供了排查思路, 供大家参考
,希望在应用实践中能够对大家有所帮助。





关注我






公众号
(

zhisheng

)
里回复

 
面经、
ES、 Flink、


 
Spring、
Java、
Kafka、 监控 





等关键字
可以查看更多关键字对应的文章


朕已阅 





推荐阅读
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
    本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
  • 其实之前也有下载过完整的android源码,但是从来没有对这个做过一些总结,在加上最近需要经常去看,索性就在从新下载,编译一下,其实这些东西官网上面都有。http:sou ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
author-avatar
烟熏装-_265
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有