K8s HA发布了DataStream API中具有批处理执行模式的Apache Flink 1.12

2020-12-11 07:36:28

Apache Flink社区很高兴宣布Flink 1.12.0的发布!近300个贡献者在1000个线程上进行了工作,以显着提高可用性以及新功能,这些功能简化了(并统一了)整个API堆栈的Flink处理。

社区增​​加了对DataStream API中有效批处理执行的支持。这是实现批处理和流处理的真正统一运行时的下一个重要里程碑。

基于Kubernetes的高可用性(HA)被实现为ZooKeeper的替代产品,以实现高可用性的生产设置。

Kafka SQL连接器已扩展为可以在upsert模式下工作,并且能够处理SQL DDL中的连接器元数据。现在,临时表联接也可以用SQL完全表示,而不再依赖于Table API。

PyFlink中对DataStream API的支持将其用法扩展到需要对状态和时间进行细粒度控制的更复杂的场景,现在可以在Kubernetes上本地部署PyFlink作业。

这篇博客文章描述了所有主要的新功能和改进,需要注意的重要更改以及预期的发展。

现在,可以在Flink网站的更新的“下载”页面上找到二进制分发和源工件,并且可以在PyPI上获得最新的PyFlink分发。请仔细阅读发行说明,并查看完整的发行变更日志和更新的文档以获取更多详细信息。

我们鼓励您下载发行版,并通过Flink邮件列表或JIRA与社区分享您的反馈。

Flink的核心API在该项目的整个生命周期中都得到了有机开发,并且最初是针对特定的用例进行设计的。尽管Table API / SQL已经具有统一的运算符,但使用较低级别的抽象仍然需要您在批处理(DataSet API)和流技术(DataStream API)的两个语义上不同的API之间进行选择。由于批处理是无限制流的子集,因此将它们合并到单个API中有一些明显的优势:

可重用性:在同一API下进行有效的批处理和流处理将使您可以轻松地在两种执行模式之间切换,而无需重写任何代码。因此,可以轻松地重用作业来处理实时和历史数据。

操作简便:提供统一的API将意味着使用一组连接器,维护单个代码库并能够轻松实现混合执行流水线,例如适用于回填之类的用例。

考虑到这些优点,社区已朝着统一DataStream API迈出了第一步:支持有效的批处理执行(FLIP-134)。从长远来看,这意味着DataSet API将被DataStream API和Table API / SQL(FLIP-131)取代并包含在内。有关统一工作的概述,请参考最近的Flink Forward演讲。

您已经可以使用DataStream API来处理受限制的流(例如文件),其限制是运行时不“知道”作业是受限制的。为了优化有界输入的运行时,新的BATCH模式执行使用基于排序的混洗(具有纯内存聚合)和改进的调度策略(请参见流水线区域调度)。结果,DataStream API中的BATCH模式执行已经非常接近Flink 1.12中DataSet API的性能。有关性能基准的更多详细信息,请查看原始建议(FLIP-140)。

在Flink 1.12中,默认执行模式为STREAMING。要将作业配置为以批处理模式运行,可以在提交作业时设置配置:

确保连接器可以同时在两种执行模式下工作,以前的版本已经在数据源中进行了介绍,因此在Flink 1.12中,社区着重于实现统一的Data Sink API(FLIP-143)。新的抽象引入了写/提交协议和一个更加模块化的接口,其中各个组件透明地暴露给框架。

Sink实现者将必须提供内容和方式:SinkWriter,用于写入数据并输出需要提交的内容(即,提交表);以及封装了如何处理提交表的Committer和GlobalCommitter。该框架负责何时何地:在什么时间,在什么机器或进程上提交。

这种更模块化的抽象允许为BATCH和STREAMING执行模式支持不同的运行时实现,这些运行时实现了预期的目的,但仅使用一种统一的接收器实现。在Flink 1.12中,FileSink连接器是StreamingFileSink(FLINK-19758)的统一嵌入式替代。其余的连接器将在将来的版本中移植到新接口。

Kubernetes提供了Flink可用于JobManager故障转移的内置功能,而不是依赖ZooKeeper。为了启用“ ZooKeeperless” HA设置,社区在Flink 1.12(FLIP-144)中实现了Kubernetes HA服务。该服务与ZooKeeper实施基于相同的基本接口构建,并使用Kubernetes的ConfigMap对象处理从JobManager故障中恢复所需的所有元数据。有关如何配置高可用性Kubernetes集群的更多详细信息和示例,请查看文档。

先前版本引入了新的数据源API(FLIP-27),允许实现既可以作为有界(批处理)源也可以作为无界(流式)源使用的连接器。在Flink 1.12中,社区开始从FileSystem连接器(FLINK-19161)开始将现有的源连接器移植到新接口。

Flink的调度程序在很大程度上是为分别处理批处理和流式处理工作负载而设计的。此版本引入了统一的调度策略,该策略可识别阻塞的数据交换以将执行图分解为流水线区域。这样就可以仅在有数据执行工作时安排每个区域的时间,并且仅在所有必需资源都可用时才部署它;以及独立重启失败的区域。特别是对于批处理作业,新策略可提高资源利用率,并消除死锁。

为了提高大规模批处理作业的稳定性,性能和资源利用率,社区引入了sort-merge shuffle,以替代Flink已经使用的原始shuffle实现。这种方法可以显着减少改组时间,并使用较少的文件句柄和文件写入缓冲区(这对于大规模作业是有问题的)。即将发布的版本(FLINK-19614)中将实现进一步的优化。

作为对Flink WebUI的一系列改进的延续,该社区开始致力于在WebUI(FLIP-104)上公开JobManager的内存相关指标和配置参数。 TaskManager的指标页面也已更新,以反映对Flink 1.10(FLIP-102)中引入的TaskManager内存模型的更改,并为托管内存,网络内存和元空间添加了新的指标。

某些来源(和格式)将其他字段公开为元数据,这些字段对于用户与记录数据一起处理很有价值。一个常见的例子是Kafka,您可能想在其中在新版本中,Flink SQL支持元数据列以读取和写入连接器和格式的特定字段,以便访问偏移量,分区或主题信息,读取或写入记录键或使用嵌入式元数据时间戳进行基于时间的操作。一张桌子(FLIP-107)。这些列在CREATE TABLE语句中使用METADATA(保留)关键字声明。

创建表kafka_table(id BIGINT,名称STRING,event_time TIMESTAMP(3)来自&timestamp'的METADATA,-访问Kafka&timestamp'元数据标头MAP< STRING,BYTES> METADATA- -使用(&connector' =' kafka',' topic' =' test-topic&#)访问Kafka&#headers'元数据) 39;,' format' =' avro');

在Flink 1.12中,公开了Kafka和Kinesis连接器的元数据,并且已经计划在FileSystem连接器上进行工作(FLINK-19903)。由于Kafka记录的结构更为复杂,因此还专门为Kafka连接器实现了新属性,以控制如何处理键/值对。有关Flink SQL中元数据支持的完整概述,请查看每个连接器的文档以及原始建议中的激励用例。

对于某些用例,例如解释紧凑的主题或写出(更新)汇总结果,有必要将Kafka记录键作为真正的主键来处理,以确定可以插入,删除或更新的内容。为此,社区创建了一个专用的upsert连接器(upsert-kafka),该连接器将基本实现扩展为可以在upsert模式(FLIP-149)中工作。

新的upsert-kafka连接器可用于源和接收器,并提供与现有Kafka连接器相同的基本功能和持久性保证,因为它在引擎盖下重用了大部分代码。要使用upsert-kafka连接器,必须在创建表时定义主键约束,并为键(key.format)和值(value.format)指定(反)序列化格式。

现在,您无需创建临时表函数来在某个特定时间点查询表,而只需使用标准SQL子句FOR SYSTEM_TIME AS OF(SQL:2011)来表达临时表联接。此外,现在支持对具有时间属性和主键的任何类型的表进行时态联接,而不仅仅是仅追加表。这可以解锁一组新的用例,例如直接针对Kafka压缩的主题或数据库变更日志(例如来自Debezium)执行临时联接。

-由Kafka主题支持的表CREATE TABLE订单(order_id STRING,货币STRING,金额INT,order_time TIMESTAMP(3),WATERMARK FOR order_time AS order_time-INTERVAL' 30' SECOND)WITH(&'连接器' =' kafka',...); -由Kafka压缩主题支持的表CREATE TABLE Latest_rates(currency STRING,currency_rate DECIMAL(38,10),currency_time TIMESTAMP(3),WATERMARK FOR currency_time AS currency_time-INTERVAL' 5' SECOND,PRIMARY KEY(货币)未强制执行)与(' connector' =' upsert-kafka',...); -事件时间时态表联接SELECT o。 order_id,o。 order_time,o。数量* r。 currency_rate AS金额,r。订单AS o中的货币,o的最新价格为FOR SYSTEM_TIME。 order_time r ON o。货币= r。货币;

前面的示例还显示了如何在时态表连接的上下文中利用新的upsert-kafka连接器。

您还可以通过自动读取最新的表分区作为时态表(FLINK-19644)或整个表作为在执行时跟踪最新版本的有界流来对Hive表执行时态表联接。有关在临时表联接中使用Hive表的示例,请参考文档。

从Flink 1.12开始,Table API / SQL本身也支持将Amazon Kinesis Data Streams(KDS)作为源/接收器。新的Kinesis SQL连接器随附对增强的扇出(EFO)和接收器分区的支持。有关支持的功能,配置选项和公开的元数据的完整概述,请查看更新的文档。

当写为大文件时,许多批量格式(例如Parquet)是最有效的。当启用频繁检查点时,这是一个挑战,因为创建了太多的小文件(需要在检查点上滚动)。在Flink 1.12中,文件接收器支持文件压缩,从而允许作业保留较小的检查点间隔,而无需生成大量文件。要启用文件压缩,可以按照文档中的说明在FileSystem连接器的属性中设置auto-compaction = true。

为了确保从Kafka消费时的正确性,通常最好在每个分区的基础上生成水印,因为分区内的乱序通常比所有分区中的乱序性低。 Flink现在将降低水印策略,以从Kafka用户内部发出分区的水印。源的输出水印将由其读取的分区上的最小水印确定,从而产生更好的(即更接近实时)水印。水印下推还使您可以配置每个分区的空闲检测,以防止空闲分区阻碍整个应用程序的事件时间进度。

为了消除不必要的序列化和数据溢出并提高批处理和流表API / SQL作业的性能,默认计划程序现在利用最新版本(FLIP-92)中引入的N元流运算符来实现运算符的“链接”通过前缘连接。

此版本结束了Flink 1.9中针对Table API的新数据类型系统上开始的工作,并将聚合函数(UDAF)暴露给了新类型系统。从Flink 1.12开始,UDAF的行为类似于标量和表函数,并支持所有数据类型。

为了扩展PyFlink的可用性,此版本引入了Python DataStream API(FLIP-130)的第一个版本,该版本支持无状态操作(例如Map,FlatMap,Filter,KeyBy)。

从pyflink.common.typeinfo导入从pyflink.datastream导入的类型MapFunction,StreamExecutionEnvironment类MyMapFunction(MapFunction):def map(self,value):返回值+ 1 env = StreamExecutionEnvironment。 get_execution_environment()data_stream = env。 from_collection([1、2、3、4、5],type_info =类型。INT())mapping_stream = data_stream。 map(MyMapFunction(),output_type = Types。INT())mapping_stream。 print()环境。执行(" datastream作业")

要尝试使用Python DataStream API,您可以安装PyFlink并查看本指南,该指南将指导您构建一个简单的流应用程序。

除了独立部署和YARN部署外,PyFlink作业现在还可以本地部署在Kubernetes上。部署文档详细说明了如何在Kubernetes上启动会话或应用程序集群。

在Flink 1.12中,您可以在PyFlink(FLIP-139)中定义和注册UDAF。普通的UDF不处理状态,一次只能处理一行,而UDAF具有状态,可用于计算多个输入行上的自定义聚合。要从矢量化中受益,您还可以使用Pandas UDAF(FLIP-137)(最快10倍)。

[FLINK-19319]默认流时间特征已更改为EventTime,因此您不再需要调用StreamExecutionEnvironment.setStreamTimeCharacteristic()来启用事件时间支持。

[FLINK-19278] Flink现在依赖Scala宏2.1.1,因此Scala版本<不再支持2.11.11。

[FLINK-19152]此版本中已删除了Kafka 0.10.x和0.11.x连接器。如果您仍在使用这些版本,请参阅文档以了解如何升级到通用Kafka连接器。

[FLINK-18738]为了与FLIP-53保持一致,托管内存现在也是Python worker的默认内存。 python.fn-execution.buffer.memory.size和python.fn-execution.framework.memory.size的配置已删除,将不再生效。

如果您打算将安装程序升级到Flink 1.11,请仔细查看发行说明,以获取详细的更改和新功能列表。此版本与以前的1.x版本的API兼容,这些版本的API使用@Public注释进行了注释。

Apache Flink社区要感谢使该版本成为可能的300位贡献者中的每一位:

Abhijit Shandilya,Aditya Agarwal,Alan Su,Alexander Alexandrov,Alexander Fedulov,Alexey Trenikhin,Aljoscha Krettek,Allen Madsen,Andrei Bulgakov,Andrey Zagrebin,Arvid Heise,Authuir,Bairos,Bartosz Krasinski,Benchao Li,Brandon,Brian Zhou,C080郑Canbin,Cedric Chen,Chesnay Schepler,Chris Nix,邱从贤,DG-Wangtao,Da(Dash)Shen,Dan Hill,Daniel Magyar,丹麦Amjad,Danny Chan,Danny Cranmer,David Anderson,Dawid Wysakowicz,Devin Thomson,Diann Fu,王东旭,Dylan Forciea,Echo Lee,Etienne Chauchot,Fabian Paul,Felipe Lolas,Fin-Chan,Fin-chan,Flavio Pompermaier,Flora Tao,Fokko Driesprong,Gao Yun,Gary Yao,Ghildiyal,GitHub,Grebennikov Roman,马国伟,久拉·福拉,郑合群,赫尔曼,洪定,黄小,黄兴波,曾赫斯基,李贤se,罗瑞,伊凡,刘杰,吴克,贾斯卡兰·宾德拉,杨杰夫,张杰夫,张江杰(Becket)秦,陶佳涛,廖佳怡,廖佳怡,G. Jimmy.Zhou,Jindrich Vimr,李劲松,李劲松,Joey E cheverria,Juha Mynttinen,Jun Qin,JörnKottmann,Karim Mansour,Kevin Bohinski,Kezhu Wang,Konstantin Knauf,Kostas Kloudas,Kurt Young,Lee Do-Kyeong,Leonard Xu,Lijie Wang,刘建刚,Lorenzo Nicora,LululuAlu,Luxios22, Marta Paes Moreira,Mateusz Sabat,Matthias Pohl,Maximilian Michels,Miklos Gergely,Milan Nikl,Nico Kruber,Niel Hu,Niels Basjes,Oleksandr Nitavskyi,Paul Lam,Peng,PengFei Li,PengchengLiu,Peter Huang,Piotr Nowohandakski,PoojaC任,钟启尚,理查德·杜瓦德,理查德·穆德黑德,罗伯特·梅茨格,洛克·马歇尔,罗伊·谢托夫,罗马,罗马·哈恰崔安,荣蓉,李瑞,赛斯·维斯曼,肖恩·黄,肖恩·高盛,盛凯,陈水强,硕成,尼古拉斯,斯蒂芬·埃文(Stephan Ewen),史蒂夫·惠兰(Steve Whelan),史蒂夫·惠兰(Steve Whelan),吴彦祖(Steven Wu),Tartarus0zm,特里·王(Terry Wang),分享,托马斯·韦斯(Thomas Weise),蒂尔·罗尔曼(Till Rohrmann),蒂莫·沃尔瑟(Timo Walther),TsReper,慈济(Gordon)泰,乌弗克·西里缇(V1ncentzzZ),弗拉基米尔·科托夫斯(Vladimirs Kotovs),魏忠,周小刚,孙晓光,崔星灿,宋新彤,宣南,刘杨,郭阳泽,杨一超,江一k,于莉,袁梅,李玉斌,云高,云棠,王云,杨振华,杨志江,朱竹,乙酰丁胺,acqua.csq,奥斯汀,大数据-ny,billyrrr,caozhen,caozhen1937,chaojianok,chenkai,chris,cpugputpu,dalong01.liu,darionyaphet,dijie,diohabara,dufeng1010,fangliang,felixzheng,gkrishna,gm7y8,godrey hehe,godfreyhe,hsralex1,gsralex1。 hequn8128,侯茂正,黄晓,黄兴博,呼则康,jPrest,jasonlee,jinfeng,jinhai,johnm,jxeditor,kecheng,kevin.cyj,kevinzwx,klion26,leiqiang,libenchao,lijiewang.wljy,liufangliang,lijangliang,lijangliang lzy3261944,mans2singh,molsionmo,openopen2,pengweibo,rinkako,[email protected],secondChoice,seunjjs,shaokan.cao,shizhengchao,shizk233,shouweikun,spurthishunkex,sujun,sunjintox,sujun,sunjintor,sunjintor ,wangsong2,wangtong,wangxiyuan,wangxlong,wangyang0918,wangzzu,weizheng92,whlwanghailong,wineandc heeze,wooplevip,wtog,wudi28,wxp,xcomp,xiaoHoly,xiaolong.wang,yangyichao-mango,yingshin,yushengnan,yushujun,yuzhao.cyz,zhangap,zhangmang,zh​​angzhanchum,zhangzhanchun,zhangzhanhua,zhangzhan,zhangzhan zhuxiaoshang,zlzhang0122,zodo,zoudan,zouzhiye