Flink Weekly | 每周社区动态更新
大家好,本文为 Flink Weekly 的第二十三期,由蒋晓峰、李本超共同整理及 Review。本期主要内容包括:近期社区开发进展、邮件问题答疑、Flink 最新社区动态及技术文章推荐等。
Flink 开发进展
Flink 社区近期开发最新动态将从 Release、DEV、FLIP、Discuss、Others 五部分跟大家分享。
RELEASE
■ 1.11.1 版本的投票已经通过,即将发布。该版本涵盖了比较多重要的 Bugfix,建议尝试 1.11.0 版本的用户都直接切换到这个版本。
DEV
■ Chenqin 发起了支持 Thrift Format 的讨论,目前看该特性还是比较受欢迎的,而且确实有些场景是需要的。之前也有一个相关的 PR[3],社区希望可以基于这个 PR 来继续推进一下这个工作。
[2]http://apache-flink-mailing-list-archive.1008284.n3.nabble.com/thrift-support-tp43257.html
[3] https://github.com/apache/flink/pull/8067
FLIP
■ [FLIP-128] 伍翀发起 Refactor Descriptor API to register connectors in Table API 的提案,改进 Table API 中的“Connect API”,即用户用来在环境中描述/注册表的 API。
自 1.5.0 起 Flink 引入 Descriptor API 来配置和无效化 TableSources/TableSinks,即 TableEnvironment#connect API。当前的 Descriptor API 有诸多问题包括社区关注最新版本中的新 SQL DDL 功能。SQL DDL 经过精心设计具有许多丰富的功能,但是 Descriptor API 缺少许多关键功能例如计算列、主键、分区键等;当前连接器必须实现相应的描述符(例如 new Kafka())才能使用 “connect” API,希望在没有相应描述符的情况下注册连接器,简化连接器的开发并且替代 registerTableSource/Sink;Descriptor API 和 SQL DDL 的基础实现不同,维护两个不同的代码路径非常昂贵。
提案建议删除现有方法 TableEnvironment#connect(在 1.11 中弃用)和一些相关的接口/类,为表 API 引入一组新的 Descriptor API :TableEnvironment#createTemporaryTable()。
更多信息参考:
■ [FLIP-129] 陈水强发起支持 Python DataStream API (Stateless part) 的提案,与 Python Table API 类似方式引入 Python DataStream API,建议最初只支持无状态的用户定义功能。
当前 PyFlink 支持 SQL 和 Table API 为熟悉 Python 编程语言的用户提供便利,但是用户可能要求进行更复杂的处理操作譬如可能需要访问状态和计时器等。引入 DataStream API 支持 Python DataStream 从外部存储(连接器)读取/写入数据,支持配置任务和作业配置(获取/设置资源、并行性、链接策略等),支持无状态数据转换,包括 map、flatmap、keyby 等。
更多信息参考:
[7]https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=158866298
Discuss
■ [releases] 伍翀发起在 Flink 1.11.0 之后不久发布 Flink 1.11.1的讨论,以提供完整的 CDC 功能和解决大多数在 Table API / SQL 生态系统发现的重要错误问题,提议不要等待太久收集/修复错误否则再次延迟功能交付,建议于下周一创建第一个 RC,以梳理清楚 Thomas 之前报告的性能下降。
更多信息参考:
■ [announce] Stephan Ewen 宣布 Piotr Nowojski 成为 Apache Flink PMC,Piotr 擅长数据处理运行时和网络堆栈领域,以及邮件列表或者版本发布管理者的工作。恭喜 Piotr Nowojski 老师!
更多信息参考:
■ [FLINK-18419] [1.11.0] 用户无法使用 Jar 文件的代码创建一个 Catalog,例如通过 sql-client 上传的 Jar 包,将在 1.11.1 版本修复。
[10]https://issues.apache.org/jira/browse/FLINK-18419
■ [FLINK-18583] [1.11.0] ElasticSearch Sink 索引中设置不正确的 _id 字段,将在 1.11.1 版本修复。
[11]https://issues.apache.org/jira/browse/FLINK-18583
■ [FLINK-18583] [1.11.1] InfluxDB metrics reporter 不能作为插件使用,将在 1.11.1 版本修复。
[12]https://issues.apache.org/jira/browse/FLINK-18573
■ [FLINK-18434 [1.10.0] 在使用 JDBC Catalog 时候无法 Select 字段,将在 1.11.1 版本修复。
[13]https://issues.apache.org/jira/browse/FLINK-18434
■ [FLINK-18461] [1.11.0] 当前不支持往 upsert sink 中写 ChangeLog 流(例如,Elastic 或者 JDBC),将在 1.11.1 版本修复。
[14]https://issues.apache.org/jira/browse/FLINK-18461
邮件问题答疑
■ [SQL] Dongwon Kim 提问 Flink SQL 是否支持 PARTITION BY 的时候用嵌套字段。
现在应该是不支持的。但是可以用计算列来绕过去这个问题,当前的 Filesystem Connector 对于计算列的支持有个 Bug[FLINK-18665],详情了解:
■ [SQL] Kelly Smith 提问如何把 Filesystem 当做维表使用。
当前有几个问题,首先普通的 Join 语法不允许数据中有时间属性,这个接下来可以在 Planner 层做一个优化 [FLINK-18651],自动在这种情况下将时间属性物化为普通的时间字段;其次当前的 Filesystem 还不支持维表访问,这个未来也可以支持[FLINK-17397]。
■ [SQL] sunfulin 提问如何在 1.11 中使用 DML Sink 和 toDataStream 之后 addSink 保持在同一个 job 中。
Godfrey 进行了回答,在 1.11 中重构了 TableEnvironment 的接口,目前没有办法可以做到统一这两个方式到同一个 job 中,只能形成两个不同的 job。
[17]http://apache-flink.147419.n8.nabble.com/flink-1-11-td5064.html
■ [SQL] 曹武 提问使用 debezium-json 做数据同步时会有 Delete 数据被丢弃的问题。
这里有两个问题,一个是如果用了聚合算子,它的 Delete 数据如果没有对应的 Insert 数据,应该会被当做脏数据丢弃;第二个问题是一个已知的 Bug[FLINK-18461],这个会在 1.11.1 中修复。
[18]http://apache-flink.147419.n8.nabble.com/flink-1-11-checkpoint-td5059.html
■ [SQL] claylink 提问如何用 Flink SQL 解析最外层为 Array 的数据,并且添加计算列。
李本超进行了回答,当前还不能做到这一点,不过 FLINK-18590 正在跟进解决这个问题。
[19]http://apache-flink.147419.n8.nabble.com/sql-josn-td5120.html
■ [SQL] wanglei2 提问 Flink SQL 是如何加载到某个具体的 connector/format 的。
godfrey、Leonard、云邪等进行了回答。首先是通过 SPI 机制找到所有实现了特定接口的工厂类,然后通过每个 connector/format 工厂给出来的参数来筛选符合条件的,最终定位到具体的实现代码。
[20]http://apache-flink.147419.n8.nabble.com/FlinkSQL-Java-td5024.html
■ [SQL] Dream-底限 提问如何在用 Flink SQL 解析 json 失败的时候,把这些脏数据发送到某个特定的 topic。
云邪回答了该问题,这种需求比较特殊,从 Flink 侧来直接支持不是很容易,因为要抽象一层存储对接到各种存储系统上,而不是单纯的假设一定是 Kafka。当前建议是可以由 Flink 来输出这个脏数据到日志,然后用户自己定义一些 Log Appender 来收集这些数据。
[21]http://apache-flink.147419.n8.nabble.com/flink-kafka-json-td5209.html
■ [sql-client] wldd 提问:Flink 1.11.0 读取 MySQL 数据 DECIMAL 类型强转成 DECIMAL(38,18) 问题:通过 SQL Client 读取 MySQL 数据时 DECIMAL 类型强转成 DECIMAL(38,18),Streaming 模式下出现:
For final plan, using rel#3045:LogicalProject.NONE.any.None: 0.[NONE].[NONE](input=HepRelVertex#3044,exprs=[CAST($0):DECIMAL(38, 18)])
徐榜江回答:SQL Client 读取 MySQL 相当于一个 Connector 只支持 DECIMAL(38,18) 的,所有 DECIMAL(p,s) 都会转到这个类型,因为 SQL Client 用的是 Legacy 数据类型。Stream 模式有这个问题,Batch 没有,原因是:
CollectStreamTableSink 实现的是 TupleTypeInfo<Tuple2<Boolean, Row>> getOutputType()CollectBatchTableSink 实现的是 DataType getConsumedDataType()
社区有 Issue [22] 彻底解决这个问题,贺小令提 Pull Request 把此两个 CollectSink 都去掉,使用 TableResult#collect() 来收集数据。
更多信息参考:
[22]https://issues.apache.org/jira/browse/FLINK-18550[23]http://apache-flink.147419.n8.nabble.com/flink1-11-0-mysql-decimal-decimal-38-18-td4925.html
■ [SQL] Peihui He 提问:Flink 1.10 SQL Kafka Format JSON 定制 Schema 时, 字段数据能否定义为 JSON Object?
李本超回答:社区有 Issue[24] 正在解决此问题,指定任意一个 JsonNode 为 VARCHAR 类型。
此 Feature不能解决所有问题,比如有一个字段内容不太确定而且也不需要额外处理,主要是想保留这个字段,下游输出 JSON 时仍然还是此字段。沿着用 FLINK-18002 的思路输出到下游的时候,把这部分数据整体作为 JSON 字符串,从结果上来看未能完全做到原封不动的输出到下游。有两个思路解决此问题:
用 RAW 类型,此时需要 JSON Node 类型对于 Flink 来讲都是可以序列化的。用 BINARY 类型,因为现在已经有对 BINARY 类型的处理,所以需要额外加一个选项来指定对于 BINARY 类型的处理模式,把任意 JsonNode 转成 JSON 字符串表达形式,再转成 byte[] 进行中间的传输和处理;序列化时再直接通过此 byte[] 数据构造 JsonNode,保证跟原来的 JsonNode 一模一样。
更多信息参考:
[24]https://issues.apache.org/jira/browse/FLINK-18002[25]http://apache-flink.147419.n8.nabble.com/flink-1-10-sql-kafka-format-json-schema-json-object-td4665.html
■ [Sink] xueaohui 问:Flink 多 Sink 数据一致性保证即通过把作业加入多个 Sink,这种场景当 HBase 写入失败的时候不影响 Kafka 的写入。期望 HBase 写入失败,Kafka 也不发送消息,如何保证 HBase 和 Kafka 的写入为原子性呢?
高赟回答:多个 Sink 的情况下数据保证写入仍然发生在数据写入后的 Checkpoint 完成,如果写入 HBase 失败的时候触发 Failover 的话,按二阶段提交的逻辑这种情况下 Kafka 的事务被 Abort 掉,数据不会真正写入。多个 Sink 如果按照 TwoPhaseCommitSinkFunction 来做的话是能够实现多 Sink 一致性的,只要有一个 Sink 出错整个作业都会 Failover,其它 Sink 当前的事务也会跟着 Abort 掉,然后整个作业回退到上一次 Checkpoint 开始执行。
社区正在加 Exactly-Once JDBC Sink 实现[26]。如果要实现两阶段提交的 Sink 的话,总是需要有能跨 Session 的 Transaction 机制,即在作业挂了之后下次起来的时候此事务能够 Abort 掉或者继续提交(取决于是否已经 Snapshot),例如 JDBC 必须要用 XA 事务,用单纯的 JDBC 事务应该是有问题的,因为即使在 Snapshot 的时候 Precommit 过,如果作业挂掉连接中断此事务仍然会被 Abort 掉。
更多信息参考:
[26]https://issues.apache.org/jira/browse/FLINK-15578[27]http://apache-flink.147419.n8.nabble.com/Flink-Sink-td4052.html
活动 / 博客文章 / 其他
■ 2020 Apache Flink 首场线下 Meetup 正式启动,阵容十分可观,详情了解:
[28]https://www.huodongxing.com/go/7554937279200
■ 任务部署的原理以及新引入的 Application Mode 介绍
[29]https://flink.apache.org/news/2020/07/14/application-mode.html
■ 字节跳动基于 Flink 的 MQ-Hive 实时数据集成
[30]https://mp.weixin.qq.com/s/SDkgYqBZrejObpJ_2bpURw
■ 网易云音乐实时数仓建设实践
[31]https://mp.weixin.qq.com/s/n4RUxDu3PuGBNl6QXNlp4Q
■ Alexander Fedulov 介绍有关 Apache Flink 的介绍性视频系列以及 YouTube 上的流处理。
更多信息参考:
[32]https://www.ververica.com/blog/presenting-our-streaming-concepts-introduction-to-flink-video-series
[33]https://www.youtube.com/watch?v=ZU1r7uEAO7o
2 分钟快速订阅 Flink 中文邮件列表
Apache Flink 中文邮件列表订阅流程:
发送任意邮件到 user-zh-subscribe@flink.apache.org
收到官方确认邮件
回复该邮件 confirm 即可订阅
订阅成功后将收到 Flink 官方的中文邮件列表的消息,您可以向 user-zh@flink.apache.org 发邮件提问也可以帮助别人解答问题,动动手测试一下!
Flink Weekly 周报计划每周更新一期,内容涵盖邮件列表中用户问题的解答、社区开发和提议的进展、社区新闻以及其他活动、博客文章等,欢迎持续关注。
评论