作者:徐榜江(雪尽)@ 阿里云
Apache Flink PMC(项目管理委员)很快乐地发表公布 Apache Flink 1.17.0。Apache Flink 是当先的流解决规范,流批对立的数据处理概念在越来越多的公司中失去认可。得益于咱们杰出的社区和优良的贡献者,Apache Flink 在 Apache 社区中始终放弃着快速增长,并且是最沉闷的社区之一。Flink 1.17 有 172 位贡献者激情参加,实现了 7 个 FLIP 和 600 多个 issue,为社区带来了许多令人兴奋的新性能和改良。
迈向 Streaming Warehouse
为了在 流式数仓 畛域实现更高效的解决,Flink 1.17 对批处理和流解决的性能和语义都进行了实质性的改良。这些加强措施代表了朝着创立一个更高效、更简化的数据仓库,可能实时处理大量数据的指标迈进了一大步。
针对批处理,此次公布蕴含了下述几项新个性和改良。
- Streaming Warehouse API: FLIP-282 在 Flink SQL 中引入了新的 Delete 和 Update API,它们能够在 Batch 模式下工作。在此基础上,内部存储系统比方 Flink Table Store 能够通过这些新的 API 实现行级删除和更新。同时对 ALTER TABLE 语法进行了加强,包含 ADD/MODIFY/DROP 列、主键和 watermark 的能力,这些加强使得用户更容易保护元数据。
- Batch 性能优化: 在 Flink 1.17 中,批处理作业的执行在性能、稳定性和可用性方面都失去了显着改良。就性能而言,通过策略优化和算子优化,如新的 join-reorder 算法和自适应的本地哈希聚合优化、Hive 聚合函数改良以及混合 shuffle 模式优化,这些改良带来了 26% 的 TPC-DS 性能晋升。就稳定性而言,Flink 1.17 预测执行能够反对所有算子,自适应的批处理调度能够更好的应答数据歪斜场景。就可用性而言,批处理作业所需的调优工作曾经大大减少。自适应的批处理调度曾经默认开启,混合 shuffle 模式当初能够兼容预测执行和自适应批处理调度,同时所需的各种配置都进行了简化。
- SQL Client/Gateway: Apache Flink 1.17 反对了 SQL Client 的 gateway 模式,容许用户将 SQL 提交给远端的 SQL Gateway。同时,用户能够在 SQL Client 中应用 SQL 语句来治理作业,包含查问作业信息和进行正在运行的作业等。这示意 SQL Client/Gateway 曾经演进为一个作业管理、提交工具。
针对流解决,Flink 1.17 实现了以下性能和改良:
- Streaming SQL 语义加强: 非确定性操作可能会导致不正确的后果或异样,这在 Streaming SQL 中是一个极具挑战性的话题。Flink 1.17 修复了不正确的优化打算和性能问题,并且引入了试验性功能 PLAN_ADVICE,PLAN_ADVICE 能够为 SQL 用户提供潜在的正确性危险提醒和 SQL 优化倡议。
- Checkpoint 改良: 通用增量 Checkpoint(GIC)加强了 Checkpoint 的速度和稳定性,Unaligned Checkpoint (UC) 在作业反压时的稳定性也在 Flink 1.17 中进步至生产可用级别。此外,该版本新引入一个 REST API 使得用户能够触发自定义 Checkpoint 类型的 Checkpoint。
- Watermark 对齐欠缺 : 高效的 watermark 解决间接影响 event time 作业的执行效率,在 Flink 1.17 中,FLIP-217 通过对 Source 算子外部的 split 进行数据对齐发射,欠缺了 watermark 对齐性能。这一改良使得 Source 中 watermark 进度更加协调,从而加重了上游算子的缓存过多数据,加强了流作业执行的整体效率。
- StateBackend 降级: 此次公布将 FRocksDB 的版本升级到了 6.20.3-ververica-2.0,对 RocksDBStateBackend 带来了许多改良。同时,例如在插槽之间共享内存,并且当初反对 Apple Silicon 芯片组,如 Mac M1。Flink 1.17 版本还提供了参数扩充 TaskManager 的 slot 之间共享内存的范畴,晋升了 TaskManager 中 slot 内存应用不均是的效率。
批处理
作为的流批一体的计算引擎,Apache Flink 在流解决畛域继续当先,为了进一步加强其批处理能力,Flink 社区贡献者在 Flink 1.17 版本的批处理的性能优化和生态欠缺方面付出了诸多致力。这让用户能够更轻松地基于 Flink 构建 Streaming Warehouse。
预测执行
在此次公布中,预测执行反对了 Sink 算子。在之前的版本中,为了防止不稳定性或不正确的后果,预测执行不会产生在 Sink 算子上。Flink 1.17 丰盛了 Sink 的上下文信息,使得 新版 Sink 和 OutputFormat Sink 都能获取到以后执行实例的序号 (attempt number),依据这个序号,Sink 算子能够将同一子工作的多个不同实例生成的数据进行隔离,即便这些实例在同时运行。FinalizeOnMaster 接口也进行了改良,以便 OutputFormat Sink 能够晓得哪些序号的实例胜利产出了数据,从而正确地提交后果数据。当 Sink 的开发者确定该 Sink 能够正确的反对多个并发实例同时运行,就能够使其实现装饰性接口 SupportsConcurrentExecutionAttempts,从而容许其进行预测执行。一些内置 Sink 曾经反对了预测执行,包含 DiscardingSink、PrintSinkFunction、PrintSink、FileSink、FileSystemOutputFormat 和 HiveTableSink。
此外,预测执行的慢工作的检测也取得了改良。在之前,在决定哪些工作是慢工作时只思考了工作的执行工夫。当初,慢工作检测器还会思考了工作的输出数据量。执行工夫较长的工作,如果生产了更多的数据,不肯定会被视为慢工作。这一改良有助于打消数据歪斜对慢工作检测的负面影响。
自适应批处理调度器
在此次公布中,自适应批处理调度器成为了批作业的默认调度器。该调度器能够依据每个 job vertex 解决的数据量,主动为其设置适合的并行度。这也是惟一一个反对预测执行的调度器。
自适应批调度器的配置失去了改良,以进步其易用性。用户不再须要显式将全局默认并行度设置为 -1 来开启主动推导并行度性能。当初,如果设置了全局默认并行度,其会被用做主动推导并行度的上界。一些配置项的名称也进行了改良,以便于用户了解。
此外,自适应批处理调度器的能力也失去了加强。当初它能够依据细粒度的数据分布信息,将数据更平均的调配给上游工作。主动推导的并行度当初也不再被限度为 2 的幂。
混合 Shuffle 模式
此次公布中,混合 Shuffle 模式带来了多个重要改良:
- 混合 Shuffle 模式当初反对自适应批调度器和预测执行。
- 混合 Shuffle 模式当初反对重用两头数据,这带来了显着的性能改良。
- 进步了稳定性,防止了在大规模生产环境中呈现的稳定性问题。
更多详细信息能够在 混合 Shuffle 局部找到。
TPC-DS
从 Flink 1.16 开始,Flink 社区继续优化批处理引擎的性能。在 Flink 1.16 中,引入了动静分区裁剪优化,但并非所有的 TPC-DS 查问都能够被优化。Flink 1.17 对该优化的算法进行了改良,使得大部分 TPC-DS 查问都能够被优化。此外,Flink 1.17 中引入了动静布局 join-reorder 算法,与之前版本的算法相比,该算法成果更好,但搜寻空间更大。优化器能够依据查问中 join 个数主动抉择适合的 join-reorder 算法,用户无需关怀 join-reorder 算法的细节(留神:join-reorder 默认未开启,在运行 TPC-DS 时须要显式启用)。在算子层面,Flink 1.17 引入了动静 local hash aggregation 策略,能够依据数据的散布动静确定是否须要在本地进行聚合操作以进步性能。在运行时层面上,此次公布移除了一些不必要的虚构函数调用,以放慢执行速度。从整体测试后果上看,相比 Flink 1.16,对于分区表在 10T 数据集下 Flink 1.17 有 26% 的性能晋升。
SQL Client/Gateway
Apache Flink 1.17 引入了一个名为 ”gateway 模式 ” 的新性能,容许用户将 SQL 查问提交到近程的 SQL Gateway 从而像 embedded 模式一样来应用 Gateway 的各种性能。这种新模式为用户在应用 SQL Gateway 时提供了更多的便当。
此外,SQL Client/SQL Gateway 当初反对通过 SQL 语句来治理作业生命周期。用户能够应用 SQL 语句显示存储在 JobManager 中的所有作业信息,能够应用作业的惟一作业 ID 来进行运行中的作业。借助这个新性能,SQL Client/SQL Gateway 当初简直领有了与 Flink CLI 雷同的性能,成为治理 Flink 作业的另一个更弱小的工具。
SQL API
在古代大数据工作流中,SQL 引擎的行级删除和更新能力变得越来越重要。利用场景包含为了合乎监管要求而删除特定一组数据、为了进行数据勘误而更新一行数据等。许多风行的计算引擎比方 Trino、Hive 等曾经提供了这类反对。Flink 1.17 为 Batch 模式引入了新的 Delete 和 Update API,并将其裸露给连接器,这样内部存储系统便能够基于这个 API 实现行级更新和删除。此外,此次公布还扩大了 ALTER TABLE 语法,包含 ADD/MODIFY/DROP 列、主键和 Watermark 的能力。这些性能加强晋升了用户按需保护元数据的灵活性。
Apache Flink 1.17 反对了 SQL Client 的 gateway 模式,容许用户将 SQL 查问提交给 SQL Gateway 来应用 Gateway 的各种性能。用户能够应用 SQL 语句来治理作业的生命周期,包含显示作业信息和进行正在运行的作业,这为治理 Flink 作业提供了一个弱小的工具。
Hive 兼容
Apache Flink 1.17 对 Hive connector 进行了一系列改良,使其更加生产可用。在之前的版本中,对于 Hive 的写入,只反对在流模式下主动地进行文件合并,而不反对批模式。从 Flink 1.17 开始,在批模式下也能主动地进行文件合并,这个个性能够大大减少小文件的数量。同时,对于通过加载 HiveModule 来应用 Hive 内置函数的场景,此次公布引入了一些原生的 Hive 聚合函数如 SUM/COUNT/AVG/MIN/MAX 进 HiveModule 中,这些函数能够在基于哈希的聚合算子上执行,从而带来显著的性能晋升。
流解决
Flink 1.17 解决了一些辣手的 Streaming SQL 语义和正确性问题,优化了 Checkpoint 性能,欠缺了 watermark 对齐机制,扩大了 Streaming FileSink,降级了 Calcite 和 FRocksDB 到更新的版本。这些晋升进一步坚固了 Flink 在流解决畛域的领先地位。
Streaming SQL 语义欠缺
为了解决正确性问题并欠缺 Streaming SQL 语义,Flink 1.17 引入了一个试验性功能叫 PLAN_ADVICE,该性能能够检测用户 SQL 潜在的正确性危险,并提供优化倡议。例如,如果用户通过 EXPLAIN PLAN_ADVICE 命令发现查问存在 NDU(非确定性更新) 问题,优化器会在物理打算输入的开端追加倡议,倡议会标记到对应操作节点上,并提醒用户更新查问和配置。通过提供这些具体的倡议,优化器能够帮忙用户进步查问后果的准确性。
== Optimized Physical Plan With Advice ==
...
advice[1]: [WARNING] The column(s): day(generated by non-deterministic function: CURRENT_TIMESTAMP) can not satisfy the determinism requirement for correctly processing update message('UB'/'UA'/'D' in changelogMode, not 'I' only), this usually happens when input node has no upsertKey(upsertKeys=[{}]) or current node outputs non-deterministic update messages. Please consider removing these non-deterministic columns or making them deterministic by using deterministic functions.
PLAN_ADVICE 性能还能够帮忙用户进步查问的性能和效率。例如,如果检测到聚合操作能够优化为更高效的 local-global 聚合操作,优化器会提供相应的优化倡议。通过利用这些具体的倡议,优化器能够帮用户进步其查问的性能和效率。
== Optimized Physical Plan With Advice ==
...
advice[1]: [ADVICE] You might want to enable local-global two-phase optimization by configuring ('table.optimizer.agg-phase-strategy' to 'AUTO').
此外 Flink 1.17 还修复了多个可能影响数据正确性的 plan 优化问题,如:FLINK-29849 , FLINK-30006 , 和 FLINK-30841 等。
Watermark 对齐加强
在晚期版本中,FLIP-182 提出了一种称为 watermark 对齐的解决方案,以解决 event time 作业中的源数据歪斜问题。然而,该计划存在一个限度,即 Source 并行度必须和分区数匹配。这是因为具备多个分区的 Source 算子中,如果一个分区比另一个分区更快地收回数据,此时须要缓存大量数据。为了解决这个限度,Flink 1.17 引入了 FLIP-217,它加强了 watermark 对齐思考 watermark 边界的状况下对 Source 算子内的多个分区进行数据发射对齐。这个加强性能确保了 Source 中的 Watermark 后退更加协调,防止了上游算子缓存过多的数据,从而进步了流作业的执行效率。
Streaming FileSink 扩大
在增加 ABFS 反对之后,Streaming FileSink 当初能够反对五种不同的文件系统:HDFS、S3、OSS、ABFS 和 Local。这个扩大无效地笼罩了支流文件系统,为用户提供了更多的抉择和更高的灵活性。
Checkpoint 改良
通用增量 Checkpoint(Generic Incremental Checkpont,简称 GIC)旨在进步 Checkpoint 过程的速度和稳定性。WordCount 案例中的一些试验后果如下所示。请参考这篇 性能测评文章 获取更多详细信息,该文联合实践剖析和实际后果展现了 GIC 的收益和老本。
<p><center> 表格 -1: 在 WordCount 中开启 GIC 后的收益 </center></p>
<p><center> 表格 -2: 在 WordCount 中开启 GIC 后的开销 </center></p>
Unaligned Checkpoint (UC) 能够大大提高反压下 Checkpoint 的完成率。之前版本的 UC 会写入过多的小文件,进一步可能会导致 HDFS 的 namenode 负载过高。社区在 1.17 版本中解决了该问题,使 UC 在生产环境中更加可用。
Flink 1.17 版本提供了一个 REST API,用户基于该 API 能够在作业运行时手动触发具备自定义 Checkpoint 类型的 Checkpoint。例如,对于应用增量 Checkpoint 运行的作业,用户能够定期或手动触发全量 Checkpoint 来去除多个增量 Checkpoint 之间的关联关系,从而防止援用很久以前的文件。
RocksDBStateBackend 降级
Flink 1.17 版本将 FRocksDB 的版本升级到 6.20.3-ververica-2.0,为 RocksDBStateBackend 带来了一些改良:
- 反对在 Apple 芯片上构建 FRocksDB Java
- 通过防止低廉的 ToString() 操作进步 Compaction Filter 的性能
- 降级 FRocksDB 的 ZLIB 版本,防止 Memory Corruption
- 为 RocksJava 增加 periodic_compaction_seconds 选项
能够参考 FLINK-30836 理解更多详细信息。
Flink 1.17 版本还提供了参数扩充 TaskManager 的 slot 之间共享内存的范畴,这种形式能够在 TaskManager 中 slot 内存应用不平均时进步内存效率。基于此在调整参数后能够以资源隔离为代价来升高整体内存耗费。请参考 state.backend.rocksdb.memory.fixed-per-tm 理解更多相干信息。
Calcite 降级
Flink 1.17 将 Calcite 版本升级到 1.29.0 以进步 Flink SQL 零碎的性能和效率。Flink 1.16 应用的是 Calcite 1.26.0 版本,该版本存在 SEARCH 操作符引发的 RexNode 简化等重大问题,这些问题会导致查问优化后产生谬误的数据,如 CALCITE-4325 和 CALCITE-4352 所报告的案例。通过降级到该版本的 Calcite,Flink 能够在 Flink SQL 中利用其性能改良和新个性。这不仅修复了多个 bug,同时放慢了查询处理速度。
其余
PyFlink
在 Flink 1.17 中,PyFlink 也实现了若干性能,PyFlink 是 Apache Flink 的 Python 语言接口。PyFlink 中,一些比拟重要的改良包含反对 Python 3.10、反对在 Mac M1 和 M2 电脑上运行 PyFlink 等。此外,在该版本中还实现了一些小的性能优化,比方改良了 Java 和 Python 过程之间的跨过程通信的稳定性、反对以字符串的形式申明 Python UDF 的后果类型、反对在 Python UDF 中拜访作业参数等。总体来说,该版本次要专一于改良 PyFlink 的易用性,而不是引入一些新的性能,冀望通过这些易用性改良,改善用户的应用体验,使得用户能够更高效地进行数据处理。
性能监控 Benchmark
这个版本周期中,咱们也在 Slack 频道(#flink-dev-benchmarks)中退出了性能日常监控汇报来帮忙开发者疾速发现性能回退问题,这对代码质量保证十分有意义。通过 Slack 频道或 Speed Center 发现性能回退后,开发者能够依照 Benchmark’s wiki 中形式解决它。
Task 级别火焰图
从 Flink 1.17 版本开始,Flame Graph 性能提供了针对 task 级别的可视化反对,使得用户能够更具体地理解各个 task 的性能。该性能是相比于之前版本的 Flame Graph 的重大改良,因为它能够让用户抉择感兴趣的 subtask 并查看相应的火焰图。通过这种形式,用户能够确定工作可能呈现性能问题的具体区域,而后采取措施加以解决。这能够显著进步用户数据处理管道的整体效率。
通用的令牌机制
在 Flink 1.17 之前,Flink 只反对 Kerberos 认证和基于 Hadoop 的令牌。随着 FLIP-272 的实现,Flink 的委托令牌框架更加通用,使其认证协定不再局限于 Hadoop。这将容许贡献者在将来能够增加对非 Hadoop 框架的反对,这些框架的认证协定能够不必基于 Kerberos。此外,FLIP-211 改良了 Flink 与 Kerberos 的交互,缩小了在 Flink 中替换委托令牌所需的申请数量。
降级阐明
Apache Flink 社区致力确保降级过程尽可能安稳, 然而降级到 1.17 版本可能须要用户对现有应用程序做出一些调整。请参考 Release Notes 获取更多的降级时须要的改变与可能的问题列表细节。
贡献者列表
Apache Flink 社区感激对此版本做出奉献的每一位贡献者:
Ahmed Hamdy, Aitozi, Aleksandr Pilipenko, Alexander Fedulov, Alexander Preuß, Anton Kalashnikov, Arvid Heise, Bo Cui, Brayno, Carlos Castro, ChangZhuo Chen (陳昌倬), Chen Qin, Chesnay Schepler, Clemens, ConradJam, Danny Cranmer, Dawid Wysakowicz, Dian Fu, Dong Lin, Dongjoon Hyun, Elphas Toringepi, Eric Xiao, Fabian Paul, Ferenc Csaky, Gabor Somogyi, Gen Luo, Gunnar Morling, Gyula Fora, Hangxiang Yu, Hong Liang Teoh, HuangXingBo, Jacky Lau, Jane Chan, Jark Wu, Jiale, Jin, Jing Ge, Jinzhong Li, Joao Boto, John Roesler, Jun He, JunRuiLee, Junrui Lee, Juntao Hu, Krzysztof Chmielewski, Leonard Xu, Licho, Lijie Wang, Mark Canlas, Martijn Visser, MartijnVisser, Martin Liu, Marton Balassi, Mason Chen, Matt, Matthias Pohl, Maximilian Michels, Mingliang Liu, Mulavar, Nico Kruber, Noah, Paul Lin, Peter Huang, Piotr Nowojski, Qing Lim, QingWei, Qingsheng Ren, Rakesh, Ran Tao, Robert Metzger, Roc Marshal, Roman Khachatryan, Ron, Rui Fan, Ryan Skraba, Salva Alcántara, Samrat, Samrat Deb, Samrat002, Sebastian Mattheis, Sergey Nuyanzin, Seth Saperstein, Shengkai, Shuiqiang Chen, Smirnov Alexander, Sriram Ganesh, Steven van Rossum, Tartarus0zm, Timo Walther, Venkata krishnan Sowrirajan, Wei Zhong, Weihua Hu, Weijie Guo, Xianxun Ye, Xintong Song, Yash Mayya, YasuoStudyJava, Yu Chen, Yubin Li, Yufan Sheng, Yun Gao, Yun Tang, Yuxin Tan, Zakelly, Zhanghao Chen, Zhenqiu Huang, Zhu Zhu, ZmmBigdata, bzhaoopenstack, chengshuo.cs, chenxujun, chenyuzhi, chenyuzhi459, chenzihao, dependabot[bot], fanrui, fengli, frankeshi, fredia, godfreyhe, gongzhongqiang, harker2015, hehuiyuan, hiscat, huangxingbo, hunter-cloud09, ifndef-SleePy, jeremyber-aws, jiangjiguang, jingge, kevin.cyj, kristoffSC, kurt, laughingman7743, libowen, lincoln lee, lincoln.lil, liujiangang, liujingmao, liuyongvs, liuzhuang2017, luoyuxia, mas-chen, moqimoqidea, muggleChen, noelo, ouyangwulin, ramkrish86, saikikun, sammieliu, shihong90, shuiqiangchen, snuyanzin, sunxia, sxnan, tison, todd5167, tonyzhu918, wangfeifan, wenbingshen, xuyang, yiksanchan, yunfengzhou-hub, yunhong, yuxia Luo, yuzelin, zhangjingcun, zhangmang, zhengyunhong.zyh, zhouli, zoucao, 沈嘉琦
点击查看更多技术内容
更多内容
流动举荐
阿里云基于 Apache Flink 构建的企业级产品 - 实时计算 Flink 版现开启流动:
99 元试用 实时计算 Flink 版(包年包月、10CU)即有机会取得 Flink 独家定制卫衣;另包 3 个月及以上还有 85 折优惠!
理解流动详情:https://www.aliyun.com/product/bigdata/sc