作者:孙金城
摘要:本文为 Flink 生产环境利用中的疑难分析,Flink 无奈实时写入 MySQL 是初学者常见问题之一,由社区同学罗鹏程提出,Apache Flink PMC 孙金城(金竹)老师分享该问题的解决方案及剖析思路。次要分为以下四局部:
- 问题形容
- 解决思路
- 起因分析
- 触类旁通
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 中文邮件列表订阅流程:
- 发送任意邮件到 user-zh-subscribe@flink.apache.org
- 收到官网确认邮件
- 回复该邮件 confirm 即可订阅
订阅胜利后将收到 Flink 官网的中文邮件列表的音讯,您能够向 user-zh@flink.apache.org 发邮件发问也能够帮忙他人解答问题,动动手测试一下!
以上是对该问题解决方案及思路的分享,心愿能对你有所帮忙,也期待大家遇到的典型问题能及时反馈至社区邮件列表。