前言

  环境: JDK 1.8+Flink 1.6+Hadoop 2.7.3

  文中若有表述不正确,欢迎大伙留言指出,谢谢!

1、现象

  使用yarn-session在yarn上启动flink集群并提交任务后,在Flink Web UI 上发现任务的state个数每十分钟左右会从0到10左右后又重复从0开始,但输出的结果没有问题。

2、分析过程

  2.1 检查checkpoint过程(不是最终原因)

  最开始以为是checkpoint的状态(RockDB方式)未设置好,检查配置未发现问题。使用yarn logs命令查找任务日志,发现没有没有Error,详细分析日志发现:

 INFO:yarn.YarnApplicationMasterRunner:RECEIVER SIGNAL 15: SIGTERM. Shutting down as requested

  操作系统为什么会发送请求kill掉容器了?从日志中没有找到有用信息,在网上查找前辈们的使用经验[1],发现当任务逻辑中有keyBy(key),其key变化时会导致窗口状态无法清理导致物理内存溢出容器被kill,但是我们的checkpoint的状态个数到10左右就又重新从0开始,而且每个state的大小只有几KB,所以可以排除是因为物理内存溢出导致的。

  2.2 虚拟内存溢出(不是最终原因)

  既然从任务日志本身没有发现问题,容器又被kill掉,所以打算从容器的日志出发去分析原因。分析容器本身的日志,就要去查看yarn的对应日志,通过任务日志中获取的容器信息找到集群对应的节点然后再分析对应时间短的容器日志,发现虚拟内存超过了申请,如下:

  虚拟内存一般是申请内存的2.1倍(Hadoop中默认),博主为每个容器申请的内存为1G,所以对应的虚拟内存是2.1G,遇到这种情况最好的解决办法是扩大申请的资源比如2G,扩大资源后发现问题还是存在。为什么会用到这么多虚拟内存了?组里的前辈提示可能是JDK 1.8内存模型的原因,但是申请1G之前是可以测试的,而且我测试仅使用yarn-session在yarn上申请Flink集群,但不提交任务,问题还是存在,所以没有沿着这个方向去分析(后续还是得扩展学习的)。

  在yarn的任务页面查看任务的状态时发现其有多个Attempt ID,其对应web UI和端口都是变化的,具体如下图:

  AM为什么会重启这么多次了?AM的重启的最大次数是由yarn.resourcemanager.am.max-attempts确定,而集群中该参数为2。说明该参数未生效。

  2.3 继续容器日志分析

  继续分析容器日志发现如下:

  容器10min会timeout被干掉,该值是由yarn上yarn.resourcemanager.container.liveness-monitor.interval-ms=600000ms(yarn-default.xml)确定的[2],到此,10min state重启的原因找到了,但是为什么AM重启的次数未被限制住了?在日志中找到信息如下:

  从日志中发现,任务重启次数是统计在10秒钟中任务重启的次数,超过10重启的次数就不会被统计,该值在Flink中是由akka.ask.timeout=10s决定的[3]。到此,AM多次重启的原因也找到了。但是,是什么原因导致的AM失败还是没有找到,后台找到ERROR如下:

  该信息仅显示NodeManager的心跳信息未上报成功,但原因未知。

3、尝试输出yarn对应类的Debug信息

  设置是在浏览器中yarn的ResourceManager active 节点的8088端口后加上logLevel,如:127.0.0.1:8088/logLevel,在页面上指定类名和日志级别,然后在对应节点的ResourceManager日志中就可以找到对应的debug日志。本问题中设置类名为org.apache.hadoop.yarn.server.resourcemanager.mnode,结果没有找到有用信息。

4、解决办法

  在排除问题过程中发现同集群上Spark任务AM的attempt ID已经重启到1600+了,所以到此判断是Yarn的问题导致,但是什么问题还是没有找到。

  解决办法:重启yarn集群即可。

后记:

  哎,真是一顿操作猛如虎啊,到头啥原因还是没有定位出来。不过在这个过程中涉及的思考过程和涉及的参数还是值得记录下来的,所以有了这篇博客,对不住了各位看官,愿勿恼!

Ref:

[1]https://blog.csdn.net/TripleDangClark/article/details/89146895

[2]http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-common/yarn-default.xml

[3]https://ci.apache.org/projects/flink/flink-docs-release-1.6/ops/jobmanager_high_availability.html

Flink使用(三)——记一次Flink Session任务反复重启的更多相关文章

  1. Flink(三)Flink开发IDEA环境搭建与测试

    一.IDEA开发环境 1.pom文件设置 <properties> <maven.compiler.source>1.8</maven.compiler.source&g ...

  2. flink笔记(三) flink架构及运行方式

    架构图 Job Managers, Task Managers, Clients JobManager(Master) 用于协调分布式执行.它们用来调度task,协调检查点,协调失败时恢复等. Fli ...

  3. Flink 的Window 操作(基于flink 1.3描述)

    Window是无限数据流处理的核心,Window将一个无限的stream拆分成有限大小的”buckets”桶,我们可以在这些桶上做计算操作.本文主要聚焦于在Flink中如何进行窗口操作,以及程序员如何 ...

  4. Flink 从0到1学习—— Flink 不可以连续 Split(分流)?

    前言 今天上午被 Flink 的一个算子困惑了下,具体问题是什么呢? 我有这么个需求:有不同种类型的告警数据流(包含恢复数据),然后我要将这些数据流做一个拆分,拆分后的话,每种告警里面的数据又想将告警 ...

  5. Flink 源码解析 —— 深度解析 Flink 是如何管理好内存的?

    前言 如今,许多用于分析大型数据集的开源系统都是用 Java 或者是基于 JVM 的编程语言实现的.最着名的例子是 Apache Hadoop,还有较新的框架,如 Apache Spark.Apach ...

  6. Flink 从0到1学习 —— Flink 中如何管理配置?

    前言 如果你了解 Apache Flink 的话,那么你应该熟悉该如何像 Flink 发送数据或者如何从 Flink 获取数据.但是在某些情况下,我们需要将配置数据发送到 Flink 集群并从中接收一 ...

  7. Flink 源码解析 —— 深度解析 Flink 序列化机制

    Flink 序列化机制 https://t.zsxq.com/JaQfeMf 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac 上搭 ...

  8. Flink 从 0 到 1 学习 —— Flink 配置文件详解

    前面文章我们已经知道 Flink 是什么东西了,安装好 Flink 后,我们再来看下安装路径下的配置文件吧. 安装目录下主要有 flink-conf.yaml 配置.日志的配置文件.zk 配置.Fli ...

  9. Flink 从 0 到 1 学习 —— Flink Data transformation(转换)

    toc: true title: Flink 从 0 到 1 学习 -- Flink Data transformation(转换) date: 2018-11-04 tags: Flink 大数据 ...

随机推荐

  1. full text search

    definition https://www.techopedia.com/definition/17113/full-text-search A full-text search is a comp ...

  2. matlab学习笔记13_3创建函数句柄

    一起来学matlab-matlab学习笔记13函数 13_3 创建函数句柄 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 https://ww2.mathworks.cn/help ...

  3. 简单工厂(二)——coding

    public abstract class Video { public abstract void produce(); } public class JavaVideo extends Video ...

  4. 打包工具Gradle

    Gradle Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具.它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML.当前其支持的语言 ...

  5. 【Python】解决使用pyinstaller打包Tkinker程序报错问题

    问题描述 使用pyinstaller打包使用Tkinter编写的控制台程序,出现报错 15793 INFO: Adding Microsoft.Windows.Common-Controls to d ...

  6. kafka高可用性集群

    kafka集群并测试其高可用性 介绍 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站 ...

  7. Maven中dependencyManagement作用说明

    https://blog.csdn.net/helllochun/article/details/81564921 在Maven多模块的时候,管理依赖关系是非常重要的,各种依赖包冲突,查询问题起来非常 ...

  8. Java开发笔记(一百五十一)Druid连接池的用法

    C3P0连接池自诞生以来在Java Web领域反响甚好,业已成为hibenate框架推荐的连接池.谁知人红是非多,C3P0在大型应用场合中暴露了越来越多的局限性,包括但不限于下列几点:1.C3P0管理 ...

  9. c++11多线程记录6:条件变量(condition variables)

    https://www.youtube.com/watch?v=13dFggo4t_I视频地址 实例1 考虑这样一个场景:存在一个全局队列deque,线程A向deque中推入数据(写),线程B从deq ...

  10. Jupyter notebook 安装

    一.建议从官网下载最新版anaconda https://www.anaconda.com/ 进入网址找到下载位置,并找到对应的版本,下载python3.7,根据电脑系统自行选择32/64位进行下载, ...