作者:孙金城

摘要:本文为 Flink 生产环境应用中的疑问剖析,Flink 无法实时写入 MySQL 是初学者常见问题之一,由社区同学罗鹏程提出,Apache Flink PMC 孙金城(金竹)老师分享该问题的解决方案及分析思路。主要分为以下四部分:

  1. 问题描述
  2. 解决思路
  3. 原因剖析
  4. 举一反三

Tips:更多生产环境问题交流及反馈请订阅 Flink 中文邮件列表~

问题描述

Flink 1.10 使用 flink-jdbc 连接器的方式与 MySQL 交互,读数据和写数据都能完成,但是在写数据时,发现 Flink 程序执行完毕之后,才能在 MySQL 中查询到插入的数据。即,虽然是流计算,但却不能实时的输出计算结果?

相关代码片段:

JDBCAppendTableSink.builder().setDrivername("com.mysql.jdbc.Driver").setDBUrl("jdbc:mysql://localhost/flink").setUsername("root").setPassword("123456").setParameterTypes(BasicTypeInfo.INT_TYPE_INFO,BasicTypeInfo.STRING_TYPE_INFO).setQuery("insert into batch_size values(?,?)").build()

如何解决?

Flink 1.10 这个问题是知道一秒钟,不知磨洋工的 Case,在初学时候非常容易遇上,那么真的是 Flink 不能实时写入 MySQL 吗?当然不是,上面代码基础之上简单的加上一行,就解决问题了:

...
.setBatchSize(1) //将写入MySQL的buffer大小为1。
..

原因剖析

那么问题虽然解决了,根本原因是个啥呢?也许你看到这里会说,这问题很明显,就是 Flink 设计 JDBC Sink 的时候出于性能因素考虑,对写入 buffer 做了默认值设置。

没错,这一点你说的很对,在 Flink 1.10 中 JDBC OutputFormat 的基类 AbstractJDBCOutputFormat 里面和这相关的变量 DEFAULT_FLUSH_MAX_SIZE 默认值是 5000,所以在你学习测试时候由于测试数据少(少于 5000),数据一直在 buffer 中,直到数据源数据结束,作业也结束了,才将计算结果刷入 MySQL,所以没有实时的(每条)写入 MySQL。如下:

但这里还有个因素需要注意,那就是时间因素,上面 DEFAULT_FLUSH_INTERVAL_MILLS 默认值是 0,这个相当于没有时间限制,一直等到 buffer 满了或者作业结束才能触发写出动作。

也就是有些初学者,发现问题,即使故意 debug 时候打上断点,不让作业结束,但是等到花儿都谢了,数据也没有写入到 MySQL。

在 Flink 1.10 中 AbstractJDBCOutputFormat 有两个实现类:

分别对应了如下两类 Sink:

所以在 Flink 1.10 中不论是 AppendTableSink 和 UpsertTableSink 都会有同样的问题。不过 UpsertTableSink 时用户可以设置时间,而 AppendTableSink 是连时间设置的入口都木有。

那么,是 Flink 的锅?

就这个问题而言,我个人认为不是用户的问题,是 Flink 1.10 代码设计有进一步改进的空间。在 Flink 1.11 中社区的确重构了,对 JDBCOutputFormat 打了 @Deprecated。感兴趣可以查阅 FLINK-17537 了解变化过程。但是在这个改进中,并没有对 DEFAULT_FLUSH_MAX_SIZE 默认值和 DEFAULT_FLUSH_INTERVAL_MILLS 默认值做变化,社区也在积极的讨论改进方案,想参与社区贡献或者了解最终讨论结果的可以查阅 FLINK-16497。

举一反三

当然在你学习过程中使用任何 Sink 的时候,只要没有实时写入,都可以找找是否有写出 buffer 和写出时间的限制设置。在这一点上,罗鹏程也提到了 Elasticsearch 也有类似问题,需要调用 setBulkFlushMaxActions 进行设置。

大家在学习、使用 Flink 的过程中遇到的问题都可以通过 Flink 中文邮件列表进行反馈,Flink 核心开发者及社区一线用户在线答疑交流!

2 分钟快速订阅 Flink 中文邮件列表

Apache Flink 中文邮件列表订阅流程:

  1. 发送任意邮件到 user-zh-subscribe@flink.apache.org
  2. 收到官方确认邮件
  3. 回复该邮件 confirm 即可订阅

订阅成功后将收到 Flink 官方的中文邮件列表的消息,您可以向 user-zh@flink.apache.org 发邮件提问也可以帮助别人解答问题,动动手测试一下!

以上是对该问题解决方案及思路的分享,希望能对你有所帮助,也期待大家遇到的典型问题能及时反馈至社区邮件列表。

mysql 设置默认值_为什么 Flink 无法实时写入 MySQL?相关推荐

  1. flink sink jdbc没有数据_No.2 为什么Flink无法实时写入MySQL?

    抛出疑无路? [Flink 1.10]- 使用flink-jdbc连接器的方式与MySQL交互,读数据和写数据都能完成,但是在写数据时,发现Flink程序执行完毕之后,才能在MySQL中查询到插入的数 ...

  2. c mysql 的默认值_为mysql表字段设置默认值的方法及注意细节

    为mysql表字段设置默认值的方法及注意细节,有需要的朋友可以参考下. 环境:MySQL 5.1 + 命令行工具 问题:MySQL表字段设置默认值 解决方法: 代码如下: --SQL: CREATE ...

  3. mysql datetime 默认值_老大让我整理下公司内部MySQL使用规范,分享给大家

    作者:白程序员的自习室 链接:https://www.studytime.xin/article/mysql-internal-specifications.html 最近涉及数据库相关操作较多,公司 ...

  4. mysql date 默认值_通过Oracle DB了解MySQL

    Oracle数据库是业界的翘楚,各行各业拥有大量的Oracle DB的DBA,本文尝试通过将Oracle与MySQL数据库的架构.安全.模式对象.数据类型及数据存储进行对比,以方便熟悉Oracle数据 ...

  5. mysql怎样设置默认,怎么修改mysql设置默认值

    环境描述: MySQL 5.7.13 问题描述: 建表的时候,users_info表的role_id字段没有默认值,后期发现注册的时候,需要提供给用户一个默认角色,也就是给role_id字段一个默认值 ...

  6. 表单设置默认值_你还不知道表单怎么设计吗?看这里!

    表单是电子商务.社交互动和大多数基于生产力应用类型的网站的关键.尽可能简单,微小的变化都有可能极大的提高用户体验. 一.设计原则 尽量减少痛苦 填写过程尽量简洁.容易. 说明填写完成路径 清晰的告诉人 ...

  7. sqlyog怎么设置默认值_详细讲解如何用SQLyog来分析MySQL数据库

    匿名用户 1级 2013-10-11 回答 SOLyog的下载.安装以及使用很简单.我去了相关网站下载,它只有384K字节大小.它把两个文件(一个可执行文件.exe和一个动态链接库文件.dll)安装到 ...

  8. sybase 设置默认值_[转]SYBASE 数据库操作笔记

    SYBASE 数据库操作笔记(转自MaYong) 数据库表名.列名(执行严格的大小写) 数据库表名.列名识别大小写区分(即表名是大写 查询时小写就错误) 大小写敏感的问题是因为字符集影响的,改为UTF ...

  9. html下拉框设置默认值_如何设置HTML select下拉框的默认值?

    HTML中的select标签用于创建可选择选项的下拉列表:option标签包含选定时将使用的值.那么如何来设置select下拉框里的默认值?下面本篇文章就来给大家介绍一下,希望对大家有所帮助. 我们可 ...

最新文章

  1. js里Date时间格式的常用转换-------(GMT转成yyyy-MM-dd)--------(根据日期获得星期几)...
  2. mysql为什么要编译安装_Mysql编译安装
  3. linux之scp命令
  4. node-media-server win环境安装架测试 踩坑记
  5. 有了优秀的可临摹PSD分层模板|瞬间提升海报质感!
  6. 图论:柯尼斯堡桥问题、艾科西亚游戏
  7. android 去掉顶部状态栏
  8. linux 网络 路由,网络路由的顺序在Linux中是否重要?
  9. Telnet 服务器软件的安装
  10. JavaScript BOM 随笔谈
  11. 【DC-DC开关电源芯片的使用(LM2596)】
  12. 【disordered_zip】BUGKU
  13. 阿里面试——机器学习岗四个面试案例
  14. 企业宣传片解说词的写法指导。
  15. 软件项目管理学习(一)
  16. h3c服务器登录密码修改,H3C交换机配置ssh密码验证登录方式
  17. grpc-go源码剖析二十之grpc客户端帧接收器是如何处理不同的帧的?
  18. 海龟交易法则 | 稳定性并不等于低风险!
  19. 172. 立体推箱子
  20. 视频怎样转换html代码,超简单的视频格式转换方法,你会吗?

热门文章

  1. 使用Python+tkinter编写电脑桌面放大镜程序
  2. 图像直方图原理与Python实现
  3. finereport与finebi差别_Finereport和Finebi的区别
  4. 那些html编辑器有代码片段6,VS Code 折腾记 - (6) 基本配置/快捷键定义/代码片段的录入(snippet)...
  5. php数组循环转为对象,php中循环实现(字符串,对象,或者数组)编码相互转换
  6. python列表的小东西_小谈python里 列表 的几种常用用法
  7. 指数随机变量 泊松过程跳_概率微课:第二章(19) 连续型随机变量函数的分布1...
  8. php自写代码加密,加密解密:教你加密自己写的VBS代码
  9. aj6 stamps storm_曝光! “渣男”Travis Scott的AJ6下周发售,分手后货量大减...
  10. c语言isblank函数怎么用,ISBLANK函数详解_Excel公式教程