Flink/Hbase - Sink 背压100% 与 hbase.util.RetryCounter.sleepUntilNextRetry 异常分析与排查

简介: Flink-hbase 任务 hbase.util.RetryCounter.sleepUntilNextRetry 堆栈问题分析与排查。

一.引言

Flink 程序内有读取 hbase 的需求,近期任务启动后偶发 sink 端背压 100% 导致无数据写入下游且无明显 exception 报错,重启任务后有较大概率恢复服务,但也有可能继续背压 100% 从而堵塞任务,遂开始排查。

二.问题描述

程序执行一段时间后,查看监控发现 Source + Process + Sink 端 back pressure 背压全部达到 100% ,很明显是数据发生堵塞

image.gif编辑

查看 on-cpu 无堆栈显示因此排除 cpu 问题,需要进一步查看任务执行、IO、网络等问题,随后查看 off-cpu 的 Flame Graph 看到堆栈最终定位在:

org.apache.hadoop.hbase.util.RetryCounter.sleepUntilNextRetry

image.gif

image.gif编辑

三.问题分析

1.堆栈分析

上述任务定位在 hbase 的 retryCounter.sleepUnitlNextRetry ,虽然没有看过 Hbase 的源码,但是根据这个堆栈信息大致可以判断是 hbase 读取时遇到问题导致:

retry 重试 + sleepUntilNextRetry 等待并重试

image.gif编辑

二者结合导致任务卡死从而数据流处理堵塞,再影响后续数据,从而导致背压全部达到 100%。

2.代码定位

off-cpu 的 root 调用为下述语句,非常基本的 hbase get 操作:

Result result = hbaseTable.get(sampleGet);

image.gif

按照堆栈看一下底层源码:

可以看到 Try 内逻辑真正执行的只有 1行,即 checkZk() 随后 getData(),本地测试 Get 没有问题,所以只能定位到 checkZk() 这里。

image.gif编辑

下面看一下 checkZk 主要负责什么事情:

image.gif编辑

checkZk 初始化新的 Zookeeper,如果初始化失败则返回 unable to create Zookeeper Connection,所以上面集群 hbase 无法获取数据基本定位在 Zk 创建失败。

3.问题解决

zookeeper 连接失败导致 Hbase Client 初始化失败从而数据无法获取导致 RetryAndSleep,一般服务器无法创建连接都因为访问过多导致,即服务过载,例如 JedisPool 的 resource,其使用有限制,超过后将无法获取连接从而导致获取数据失败。

查看 hbaes 对应 zk 下的服务器连接情况:

image.gif编辑

看到某个 ip 下存在大量 zk 连接,通过查询 zk server 的配置,查看当前单台客户端允许的最大连接数已全部被该 ip 占用,从而导致我的 Flink 程序无法初始化 zk。所以下面只需要解决这里连接过多的问题,经过排查发现该 ip 下对应 java 任务存在 zookeeper 泄露,即代码逻辑内不断申请 zookerper 连接,从而导致连接数过多,修改后空闲连接数上升,Flink-Hbase 服务也正常运行。

三.总结

1.Flink 问题定位

Flink 发生问题第一步查看 Excpetion,如果没有 Exception 就查看 Flame Graph,根据 on-cpu 和 off-cpu 的堆栈定位是 cpu 的问题还是自身代码的问题。

2.客户端初始化

Flink 初始化客户端的代码在 ProcessFunction 的 open 函数内,该方法可以保证一个 TaskManger 只初始化一个 Hbase Connection,所以很难突破单台机器初始化 zk 的限制,同学们在执行任务时也需要注意初始化无论 Hbase,Jedis 等客户端最后不要频繁初始化以及初始化过多。

image.gif编辑

这里我初始化了 35 个 TaskManager,每个 Manger 上只初始化了一个 connection。

3.重启解决问题

上面有一个现象是我的任务重启后有一定概率恢复正常,通过上面的问题排查我们也可以得到答案,由于某 ip 下占用过多 connection,如果我的任务恰巧提交到该任务对应的机器,则我的任务无法获取连接导致堵塞,而如果任务提交恰好避开该 ip 对应的机器则代码执行无误,所以任务重启会有一定概率修复。

目录
相关文章
|
消息中间件 运维 Kafka
直播预告|Kafka+Flink双引擎实战:手把手带你搭建分布式实时分析平台!
在数字化转型中,企业亟需从海量数据中快速提取价值并转化为业务增长动力。5月15日19:00-21:00,阿里云三位技术专家将讲解Kafka与Flink的强强联合方案,帮助企业零门槛构建分布式实时分析平台。此组合广泛应用于实时风控、用户行为追踪等场景,具备高吞吐、弹性扩缩容及亚秒级响应优势。直播适合初学者、开发者和数据工程师,参与还有机会领取定制好礼!扫描海报二维码或点击链接预约直播:[https://developer.aliyun.com/live/255088](https://developer.aliyun.com/live/255088)
780 35
直播预告|Kafka+Flink双引擎实战:手把手带你搭建分布式实时分析平台!
|
消息中间件 运维 Kafka
直播预告|Kafka+Flink 双引擎实战:手把手带你搭建分布式实时分析平台!
直播预告|Kafka+Flink 双引擎实战:手把手带你搭建分布式实时分析平台!
384 11
|
SQL 消息中间件 分布式计算
大数据-124 - Flink State 01篇 状态原理和原理剖析:状态类型 执行分析
大数据-124 - Flink State 01篇 状态原理和原理剖析:状态类型 执行分析
387 5
|
消息中间件 监控 数据挖掘
基于RabbitMQ与Apache Flink构建实时分析系统
【8月更文第28天】本文将介绍如何利用RabbitMQ作为数据源,结合Apache Flink进行实时数据分析。我们将构建一个简单的实时分析系统,该系统能够接收来自不同来源的数据,对数据进行实时处理,并将结果输出到另一个队列或存储系统中。
1449 2
|
存储 监控 数据处理
flink 向doris 数据库写入数据时出现背压如何排查?
本文介绍了如何确定和解决Flink任务向Doris数据库写入数据时遇到的背压问题。首先通过Flink Web UI和性能指标监控识别背压,然后从Doris数据库性能、网络连接稳定性、Flink任务数据处理逻辑及资源配置等方面排查原因,并通过分析相关日志进一步定位问题。
1295 61
|
SQL 流计算 关系型数据库
基于OpenLake的Flink+Paimon+EMR StarRocks流式湖仓分析
阿里云OpenLake解决方案建立在开放可控的OpenLake湖仓之上,提供大数据搜索与AI一体化服务。通过元数据管理平台DLF管理结构化、半结构化和非结构化数据,提供湖仓数据表和文件的安全访问及IO加速,并支持大数据、搜索和AI多引擎对接。本文为您介绍以Flink作为Openlake方案的核心计算引擎,通过流式数据湖仓Paimon(使用DLF 2.0存储)和EMR StarRocks搭建流式湖仓。
1545 5
基于OpenLake的Flink+Paimon+EMR StarRocks流式湖仓分析
|
运维 数据挖掘 网络安全
场景实践 | 基于Flink+Hologres搭建GitHub实时数据分析
基于Flink和Hologres构建的实时数仓方案在数据开发运维体验、成本与收益等方面均表现出色。同时,该产品还具有与其他产品联动组合的可能性,能够为企业提供更全面、更智能的数据处理和分析解决方案。
|
资源调度 监控 关系型数据库
实时计算 Flink版操作报错合集之处理大量Join时报错空指针异常,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
实时计算 Flink版操作报错合集之处理大量Join时报错空指针异常,是什么原因
|
消息中间件 druid Kafka
从Apache Flink到Kafka再到Druid的实时数据传输,用于分析/决策
从Apache Flink到Kafka再到Druid的实时数据传输,用于分析/决策
545 1
|
消息中间件 监控 Kafka
联通实时计算平台问题之Flink状态后端数据量较大时,问题排查要如何进行
联通实时计算平台问题之Flink状态后端数据量较大时,问题排查要如何进行
270 1