前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一次flink任务重试失败的问题分析

一次flink任务重试失败的问题分析

作者头像
陈猿解码
发布于 2023-02-28 07:11:09
发布于 2023-02-28 07:11:09
1.9K00
代码可运行
举报
文章被收录于专栏:陈猿解码陈猿解码
运行总次数:0
代码可运行

【背景】

在研究flink任务失败重试的过程中,遇到了一个问题,具体表现为:在任务重试时,出现与NN连接失败,触发新的一次重试,然后重复此流程,直到达到重试上限后,任务失败退出。

本文就总结下整个问题的分析过程,以及涉及到的相关知识点。

【问题分析过程】

首先查看了任务的日志,发现有如下关键信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INFO org.apache.hadoop.io.retry.RetryInvocationHandler [] - java.io.IOException: org.apache.flink.shaded.hadoop2.com.google.protobuf.ServiceException: java.lang.IllegalStateException: Trying to access closed classloader. Please check if you store classloaders directly or indirectly in static fields. If the stacktrace suggests that the leak occurs in a third party library and cannot be fixed immediately, you can disable this check with the configuration 'classloader.check-leaked-classloader'., while invoking ClientNamenodeProtocolTranslatorPB.getFileInfo over hadoop-namenode-1.hadoop-namenode.dev-env-3.svc.cluster.local/192.168.141.164:9000. Trying to failover immediately.
Caused by: java.lang.IllegalArgumentException: Failed to specify server's Kerberos principal name
  at org.apache.hadoop.security.SaslRpcClient.getServerPrincipal(SaslRpcClient.java:325) ~[flink-shaded-hadoop-2-uber-2.10.1.jar:2.10.1]
  at org.apache.hadoop.security.SaslRpcClient.createSaslClient(SaslRpcClient.java:231) ~[flink-shaded-hadoop-2-uber-2.10.1.jar:2.10.1]
  at org.apache.hadoop.security.SaslRpcClient.selectSaslClient(SaslRpcClient.java:159) ~[flink-shaded-hadoop-2-uber-2.10.1.jar:2.10.1]
  at org.apache.hadoop.security.SaslRpcClient.saslConnect(SaslRpcClient.java:390) ~[flink-shaded-hadoop-2-uber-2.10.1.jar:2.10.1]
  at org.apache.hadoop.ipc.Client$Connection.setupSaslConnection(Client.java:617) ~[flink-shaded-hadoop-2-uber-2.10.1.jar:2.10.1]
  at org.apache.hadoop.ipc.Client$Connection.access$2200(Client.java:423) ~[flink-shaded-hadoop-2-uber-2.10.1.jar:2.10.1]
  at org.apache.hadoop.ipc.Client$Connection$2.run(Client.java:823) ~[flink-shaded-hadoop-2-uber-2.10.1.jar:2.10.1]
  at org.apache.hadoop.ipc.Client$Connection$2.run(Client.java:819) ~[flink-shaded-hadoop-2-uber-2.10.1.jar:2.10.1]
  at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_342]
  at javax.security.auth.Subject.doAs(Subject.java:422) ~[?:1.8.0_342]
  at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:2012) ~[flink-shaded-hadoop-2-uber-2.10.1.jar:2.10.1]
  at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:819) ~[flink-shaded-hadoop-2-uber-2.10.1.jar:2.10.1]
  ... 56 more

从这个日志里,可以发现有两个问题:

1)与nn连接失败是因为抛出了一个异常:无效的服务端principal。

2)存在一个IO异常的日志信息:访问已经关闭的classLoader。

对于第一个问题,根据其堆栈信息,可以快速找到其源码,并推测应该是从configurtaion类对象实例中没有正确获取到服务端的key,从而构造了一个空的principal,导致出现无效参数的异常。

再次复现问题,并进行debug跟踪了下,发现在configuration中,properties中的信息几乎为空,这也就印证了刚才的推测。

结合上图与configuration的代码来看,该configuration对象还是任务重试之前的对象(排除new一个新的没有加载配置文件的情况),且至少调用了一次reloadConfiguration,因为在该函数中会将properties置为NULL,在重新调用get时,触发懒加载,新建一个properties实例对象。

但是,有疑惑的地方是:懒加载时,不管怎样,都会将overlay中的内容重新拷贝到properties中,而实际情况却没有。

所以,问题变成为什么configuration中的properties会清空,并且没有将overlay中的数据拷贝到properties中。这个问题和访问已经关闭的classLoader抛出异常有什么关联?

再次复现问题进行分析,这次发现出现该问题时,configuration中的classLoader(实际上是flink中的SafetyNetWrapperClassLoader)中的inner为NULL。

之所以为空是因为任务失败时,最终会调用classLoader的close方法。对于配置参数"classLoader.check-leaked-classLoader"为true时,会使用一个包装类,该包装类的close方法就是将真正的classLoader置为NULL。

而在加载资源的时候会调用classLoader中的inner去获取资源,inner为NULL导致直接抛异常出去,指导最外层被捕获。这样在configuration中也就不会执行将overlay中的信息拷贝到properties的逻辑了。

至此,问题的原因已经基本清楚:就是因为任务失败,classLoader被置为空,在加载资源时直接抛异常,引起无法正确获取的服务的key并成功构建principal,导致任务失败。

那么,classLoader什么时候会被置为NULL,以及configuration又是什么时候触发调用的reloadConfiguration导致properties被清空的呢?

在刚才的问题复现过程中,其实发现了这么一个堆栈信息:

结合对应的代码来分析,发现构造YarnConfiguration时,触发了类加载的静态方法调用,以至于调用了reloadConfiguration,将properties清空。

【问题解决】

问题原因都已经分析清楚后,接下来自然而然就是如何解决或规避问题。

一种简单的处理方式是:在flink中,将配置项"classLoader.check-leaked-classLoader"置为false,这样就不会使用到包装类SafetyNetWrapperClassLoader。虽然任务失败时还是会调用classLoader的方法,但在任务重试时,在缓存文件系统对象中的conf的cloassLoader不会被清空,并且还可以继续使用,自然而然也就不会出现问题。

另外,在分析过程中发现,客户端使用的HDFS文件系统句柄是有缓存的,具体以资源名、资源的认证方式以及当前用户名构成唯一key。缓存是没有大小限制的,在没有对句柄主动调用close方法时,都会一直存在缓存中。

因此,如果业务进程是短时间使用一般不会有太大问题。而如果是常驻服务,并且是提供代理功能,那么就可能因为缓存,而出现内存泄露问题。

当然,可以通过将配置项"fs.hdfs.impl.disable.cache"设置为true,来禁用缓存。

【问题引申】

该问题为什么在配套之前的hadoop版本(2.8.5)没有出现,而到了2.10.1之后就出现了?

仔细对比了两个版本相关代码之间的区别后,发现两个版本的Master类的实现确实有所不同。老的版本不会触发加载YarnConfiguration类。因此也就不会有问题。老版本的代码如下所示(新版本的可以见前面的图)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static String getMasterPrincipal(Configuration conf) 
    throws IOException {
    String masterHostname = getMasterAddress(conf).getHostName();
    // get kerberos principal for use as delegation token renewer
    return SecurityUtil.getServerPrincipal(getMasterUserName(conf), masterHostname);
}

【总结】

本文对flink任务失败重试,classLoader关闭后引发的问题进行了分析定位,同时也简单梳理了涉及到的hadoop配置类、文件系统句柄缓存、以及flink自身涉及的参数等内容。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-11-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 陈猿解码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[1133]flink问题集锦
原因:flink1.8版本之后已弃用该参数,ResourceManager将自动启动所需的尽可能多的容器,以满足作业请求的并行性。解决方法:去掉即可
周小董
2022/04/28
4.4K0
[1133]flink问题集锦
flink-sql 流计算可视化 UI 平台
朋友多年自主研发的flink-sql 流计算可视化 UI 平台,细细品味一番确实很好用,做到真正的MSP(混合云场景)多数据多复用的情况实现,下面是这个产品的使用说明看看大家有没有使用场景。
怀朔
2022/05/29
2.3K0
flink-sql 流计算可视化 UI 平台
Caused by: java.net.ConnectException: Call From master/192.168.199.130 to master:9000 failed on conn
别先生
2018/01/02
1.5K0
Sqoop导入数据时异常java.net.ConnectException: Connection refused
java.net.ConnectException: Call From node4/192.168.179.143 to node4:8032 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
时间静止不是简史
2020/07/24
1.9K0
【Hadoop学起来】分布式Hadoop的搭建(Ubuntu 17.04)
正文之前 作为一个以后肯定要做大数据的人,至今还没玩过Java 和 Hadoop 会不会被老师打死?所以就想着,在我的国外的云主机上搭建个Hadoop ,以后在 dell 电脑的ubuntu系统下也搭
用户1687088
2018/05/07
7780
【Hadoop学起来】分布式Hadoop的搭建(Ubuntu 17.04)
2.X版本的一个通病问题
对于配置了HA模式的RM或者NN,客户端如果向standby的节点发送请求,会因为不可连接或standby拒绝提供服务导致请求失败,转而向Active的节点发送请求,这个转换是hadoop客户端内部自动完成的,无须上层业务感知(本质上是向其中一个节点发送请求,如果失败则继续向另外一个节点发送请求)。
陈猿解码
2023/02/28
7800
2.X版本的一个通病问题
hbase_异常_05_End of File Exception between local host is: "rayner/127.0.1.1"; destination host is: "l
ERROR master.HMasterCommandLine: Master not running
shirayner
2018/08/10
2.1K0
一文讲透hdfs的delegation token
前一段时间总结了hadoop中的token认证、yarn任务运行中的token,其中也都提到了delegation token。而最近也遇到了一个问题,问题现象是:flink任务运行超过七天后,由于宿主机异常导致任务失败,继而触发任务的重试,但接连重试几次都是失败的,并且任务的日志也没有聚合,导致无法分析问题失败的原因。最后发现是和delegation token有关,本文就来总结下相关的原理。
陈猿解码
2023/02/28
2.1K3
一文讲透hdfs的delegation token
学习Spark——那些让你精疲力尽的坑
这一个月我都干了些什么…… 工作上,还是一如既往的写bug并不亦乐乎的修bug。学习上,最近看了一些非专业书籍,时常在公众号(JackieZheng)上写点小感悟,我刚稍稍瞄了下,最近五篇居然都跟技术无关,看来我与本行业已经是渐行渐远了。 所以,趁着这篇博客,重拾自己,认清自己,要时刻谨记我是一名码农。不过,摸着良心说,最近的技术方面也是有所感悟和积累的,比如如何写好设计文档,如何使用延时队列,如何使用防刷技术等等。当然了,今天我们还是沿着“学习Spark”这条路继续走下去。 上篇主要介绍了在Mac下如
JackieZheng
2018/01/16
2.3K0
学习Spark——那些让你精疲力尽的坑
超详细步骤!整合Apache Hudi + Flink + CDH
使用Idea打开Hudi项目,更改packging/hudi-flink-bundle的pom.xml文件,修改flink-bundle-shade-hive2 profile下的hive-version为chd6.3.0的版本
ApacheHudi
2021/11/19
3.7K0
超详细步骤!整合Apache Hudi + Flink + CDH
Flink在大规模状态数据集下的checkpoint调优
众所周知,Flink内部为了实现它的高可用性,实现了一套强大的checkpoint机制,还能保证作用的Exactly Once的快速恢复。对此,围绕checkpoint过程本身做了很多的工作。在官方文档中,也为用户解释了checkpoint的部分原理以及checkpoint在实际生产中(尤其是大规模状态集下)的checkpoint调优参数。笔者结合官方文档,给大家做个总结,也算是对Flink checkpoint机理的一个学习。
王知无-import_bigdata
2019/08/01
4.3K3
Flink在大规模状态数据集下的checkpoint调优
Hive 终于等来了 Flink
其实比较也没啥意义,不同社区发展的目标总是会有差异,而且 Flink 在真正的实时流计算方面投入的精力很多。不过笔者想表达的是,Apache Hive 已经成为数据仓库生态系统的焦点,它不仅是一个用于大数据分析和 ETL 的 SQL 引擎,也是一个数据管理平台,所以无论是 Spark,还是 Flink,或是 Impala、Presto 等,都会积极地支持集成 Hive 的功能。
Fayson
2020/02/10
2.6K0
Hive 终于等来了 Flink
Flink * 转
Flink on yarn 常见错误 1 Retrying connect to server 2 Unable to get ClusterClient status from Application Client 3 Cannot instantiate user function 4 Could not resolve substitution to a value: ${akka.stream.materializer} 5 java.lang.NoClassDefFoundError: org/
stys35
2019/03/05
3.4K0
hbase_异常_03_java.io.EOFException: Premature EOF: no length prefix available
更改了hadoop的配置文件:core-site.xml  和   mapred-site.xml  之后,重启hadoop 和 hbase 之后,发现hbase日志中抛出了如下异常:
shirayner
2018/08/10
4K0
如何通过Cloudera Manager配置Spark1和Spark2的运行环境
大部分用户在使用CDH集群做Spark开发的时候,由于开发环境的JDK版本比CDH集群默认使用的JDK1.7.0_67-cloudera版本新,可能会出现Spark代码依赖的Java API不兼容问题,解决这个问题方法有两个:一是升级CDH集群的JDK版本;二是指定Spark运行环境JDK版本。本文章主要讲述如何通过Cloudera Manager来指定Spark1和Spark2的运行环境(包含JDK环境、Spark Local Dir等的配置)。
Fayson
2018/03/29
3.2K0
如何通过Cloudera Manager配置Spark1和Spark2的运行环境
添加kerberos后,Flink任务的运行认证及各组件的认证
https://www.psvmc.cn/article/2022-11-08-bigdata-kerberos-centos.html
码客说
2023/08/11
1.6K0
第三篇:Centos7 Flink 1.12.2 on yarn 部署
http://192.168.123.156:8088/cluster/scheduler
文末丶
2021/12/27
9190
Flink问题汇总
将hadoop 3.2.1中自带的guava-27.0-jre.jar拷贝到flink的lib目录下即可。
从大数据到人工智能
2022/01/18
1K0
Flink问题汇总
Flink Yarn Cluster & HA
在一个企业中,为了最大化的利用集群资源,一般都会在一个集群中同时运行多种类型的 Workload。因此 Flink 也支持在 Yarn 上面运行。首先,让我们了解下 Yarn 和 Flink 的关系。
编程那点事
2023/02/25
9810
Flink Yarn Cluster & HA
【已解决】Flink连接JDBC报错 org.apache.flink.runtime.client.JobExecutionException: Job execution failed.
Flink1.13.6 MySQL5.7.27 JDK8 Hadoop3.1.4 集成环境Idea2020
火之高兴
2024/07/25
6010
【已解决】Flink连接JDBC报错 org.apache.flink.runtime.client.JobExecutionException: Job execution failed.
推荐阅读
相关推荐
[1133]flink问题集锦
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验