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

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 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 对应的机器则代码执行无误,所以任务重启会有一定概率修复。

相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1月前
|
SQL Java Serverless
实时计算 Flink版操作报错合集之在写入SLS(Serverless Log Service)时出现报错,该如何排查
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
2天前
|
资源调度 监控 关系型数据库
实时计算 Flink版操作报错合集之处理大量Join时报错空指针异常,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
实时计算 Flink版操作报错合集之处理大量Join时报错空指针异常,是什么原因
|
3天前
|
分布式计算 大数据 分布式数据库
"揭秘HBase MapReduce高效数据处理秘诀:四步实战攻略,让你轻松玩转大数据分析!"
【8月更文挑战第17天】大数据时代,HBase以高性能、可扩展性成为关键的数据存储解决方案。结合MapReduce分布式计算框架,能高效处理HBase中的大规模数据。本文通过实例展示如何配置HBase集群、编写Map和Reduce函数,以及运行MapReduce作业来计算HBase某列的平均值。此过程不仅限于简单的统计分析,还可扩展至更复杂的数据处理任务,为企业提供强有力的大数据技术支持。
11 1
|
1天前
|
Kubernetes Java 数据库连接
实时计算 Flink版产品使用问题之部署到 Kubernetes 集群时,任务过一会儿自动被取消,该如何排查
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
1月前
|
存储 JSON Kubernetes
实时计算 Flink版操作报错合集之 写入hudi时报错,该如何排查
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
1月前
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版操作报错合集之运行mysql to doris pipeline时报错,该如何排查
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
1月前
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版操作报错合集之整库同步mysql到starRock提交任务异常,该如何处理
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
1月前
|
SQL 分布式计算 Hadoop
实时计算 Flink版产品使用问题之建了一张upsert-kafka的flink表,但是数据为空,该如何排查
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
1月前
|
Prometheus Cloud Native 关系型数据库
实时计算 Flink版操作报错合集之实时计算 Flink版操作报错合集之当从保存点恢复并添加新的表时,出现了org.apache.flink.util.FlinkRuntimeException异常,该怎么办
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
2月前
|
Oracle 关系型数据库 数据处理
实时计算 Flink版产品使用问题之如何进行Oracle到HBase的同步
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。