专栏首页王亮的专栏基于腾讯云大数据套件 TBDS 的 flume 异常问题排查过程
原创

基于腾讯云大数据套件 TBDS 的 flume 异常问题排查过程

现象

长期运营中发现部署了flume集群的磁盘满,经过排查发现flume的日志目录导致。

具体问题

具体看flume的大文件日志发现,某个MySQL相关的sink持续抛出异常,打印了大量的日志

分析过程

根据这个异常信息(exception)即:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after statement closed

字面意思为MySQL服务的状态(连接)已经关闭的状态下,仍然有提交事务操作,抛出了异常,但这个异常持续抛出,仍需要深入分析。

配置分析

既然是flume抛出的,且与MySQL有关,那缩小问题范围,查找flume里谁在写MySQL。(flume的配置一般位于/etc/flume/conf/agent/flume.conf

根据配置中唯一一条与MySQL相关的配置逻辑:读取HiveServer的日志,过滤其中的SQL语句(以Metadata collec*过滤),结果存入到sink里配置的MySQL数据表hive_run_sqlinfo。

flumeagent逻辑分析

以上sink里调用了一个com.tencent.tbds.flume.sink.MysqlSinkForMetadata的类,这是一个自定义类,我们在引用路径里找到这个类所在jar并反编译之(decompiler),基本逻辑与注释如下:

Sink初始化阶段

Sink循环执行阶段

Sink关闭阶段

关闭阶段仅仅检查连接是否存在。

可能的原因

从sink的逻辑看,只有在空连接的情况下,sink状态才会是BACKOFF,其他情况下状态都是READY,且在向MySQL提交事务前后,不会检查连接状态,即使在SQL抛出异常的情况下也没有修改sink状态,导致提交抛出异常后,sink循环执行,循环抛出异常。这里就是不断抛出异常的根本。那么连接到底是什么时候关闭的呢?这里的原因猜测有2个:(1)sink长时间与MySQL没有交互,超过连接自动关闭时间;(2)MySQL的异常关闭。

问题确认

是否sink长时间与MySQL无交互

查询MySQL的超时配置如下:

配置为默认配置28800秒即8小时。

查看HiveServer的日志,统计每小时执行SQL的数量如下:

可见,sink与MySQL之间的断开并非二者长期无交互。

是否人为断开服务

查询人为启动MySQL的时间如下:

flume的异常时间如下:(从异常提交的事务本身内容的时间看):

时间吻合。

结论:MySQL服务异常导致flume提交事务时连接中断,且flume没有处理这种异常,引发死循环提交事务,并在这种异常情况下,flume已无法正常工作。

问题重现

根据以上的推论,可进行如下验证这个异常:

HiveServer产生日志

在HUE里执行多次HiveSQL

手动强制关闭MySQL

手动重启flume写入的MySQL实例。

查看flume表现

flume进入无限循环的抛出异常状态,验证成功。

总结

这里的主要原因是MySQL服务异常导致产生的连锁反应。权宜之计可以在sink的代码中提交事务出异常时,修改下sink的状态为BACK.OFF,防止不断打印日志造成机器磁盘满影响其他服务(待验证)。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • HBase跨版本数据迁移总结

    Solr类似画像的数据查出用户标签——通过这些标签在HBase查询详细信息。以上测试功能以及性能。其中HBase的数据量为500G,Solr约5T。数据均需要从...

    王亮
  • 腾讯云大数据套件Hermes-MR索引插件使用总结

    Hermes是多维分析利器,使用步骤分为索引创建和数据分发两个步骤。Hermes目前尚未集成到TBDS套件(3.0版本)中且外部有客户需要在自己部署的集群上使用...

    王亮
  • 存储总量达 20T 的 MySQL 实例,如何完成迁移?

    为保证业务迁移顺利进行,对迁移流程,工具进行了前期的调查研究,并对过程中发现的 4 大问题进行及时解决,本文为实际迁移经验分享。

    王亮
  • mysql 模拟四

    1.如果一个MySQL的版本号没有后缀,表示该版本已经在很多地方运行一段时间了,而且没有非平台特定的错误报告。我们通常称之为___稳定__版。 

    week
  • 3个命令行游戏--乐学乐玩Bash【Linux-Command line】

    学习是艰苦的工作,没有人喜欢工作。这意味着无论学习Bash多么容易,它对你来说仍然像件差事。当然,除非你通过游戏学习。

    QRosie
  • fragment实现隐藏及界面切换效果

    在前文中的效果中(Android如何创建自定义ActionBar),点击屏幕下方的 TextView 以此来实现 5 种 fragment 界面的切换。

    砸漏
  • Android 8款开源游戏引擎

    Angle是一款专为Android平台设计的,敏捷且适合快速开发的2D游戏引擎,基于OpenGLES技术开发。该引擎全部用Java代码编写,并且可以根据自己的需...

    阳光岛主
  • 抽时间更新了

    今天給大家介紹的是一款名叫Dwarf的逆向分析調試工具,該工具基於Pyqt5和Frida實現,專為逆向工程師、安全破解人員和安全分析專家設計。

    吾爱小白
  • Android之 环境搭建

    下载地址:链接:http://pan.baidu.com/s/1gepNRjX  密码: ozdi

    shirayner
  • 在线音乐社区研究报告:跟你分享歌单的都是什么人?

    导读:音乐社区已成趋势,年轻人的心思谁来猜?极光JIGUANG发布《国内在线音乐社区研究报告》,从市场概况、行业分析、音乐社区代表及未来发展等多层面解读音乐社区...

    CDA数据分析师

扫码关注云+社区

领取腾讯云代金券