Apache Flink社区很高兴能达到两位数并宣布发布Flink 1.10.0!由于迄今为止社区最大的努力,已实施了1.2k个问题,贡献了200多个贡献者,此版本引入了对Flink作业的整体性能和稳定性的重大改进,原生Kubernetes集成的预览以及Python支持的巨大进步(PyFlink)。(Spark对Python的支持也越来越好😂)
Flink 1.10还标志着Blink集成的完成,强化了流数据SQL并通过可用于生产的Hive集成和TPC-DS覆盖将成熟的批处理引入Flink。这篇博客文章描述了所有主要的新功能和改进,需要注意的重要更改以及预期的发展。
现在可以在Flink网站的更新的“ 下载”页面上找到二进制分发文件和源工件。有关更多详细信息,请查看完整的发行变更日志和更新的文档。我们鼓励您下载发行版,并通过Flink邮件列表或JIRA与社区分享您的反馈。
新功能和改进
改进的内存管理和配置
目前Flink中的TaskExecutor内存配置存在一些缺点,这些缺点使得难以推理或优化资源利用率,例如:
- 流处理和批处理执行中用于内存占用的不同配置模型;
- 流处理执行中堆外状态后端(即RocksDB)的复杂且依赖用户的配置。
为了使内存选项对用户更明确和直观,Flink 1.10对TaskExecutor内存模型和配置逻辑(FLIP-49)进行了重大更改。这些更改使Flink更适合于各种部署环境(例如Kubernetes,Yarn,Mesos),从而使用户可以严格控制其内存消耗。
托管内存扩展
托管内存已经扩展扩展,当然还考虑了RocksDB StateBackend的内存使用情况。虽然批处理作业可以使用堆内(on-heap)或堆外(off-heap)内存,但具有这些功能的流作业RocksDBStateBackend只能使用堆内内存。因此,为了允许用户在流执行和批处理执行之间切换而不必修改群集配置,托管内存现在始终处于堆外状态。
简化RocksDB配置
**
曾经配置像RocksDB这样的off-heap (堆外)state backend涉及大量的手动调整,例如减小JVM堆大小或将Flink设置为使用堆外内存。现在可以通过Flink的现成配置来实现,并且调整RocksDBStateBackend内存预算就像调整内存大小一样简单。
另一个重要的改进是允许Flink绑定RocksDB本地内存使用情况(FLINK-7289),从而防止其超出总内存预算-这在Kubernetes等容器化环境中尤其重要。有关如何启用和调整此功能的详细信息,请参阅Tuning RocksDB。
注意 FLIP-49更改了群集资源配置的过程,这可能需要调整群集以从以前的Flink版本进行升级。有关所引入更改和调整指南的全面概述,请参阅此设置。
提交作业的统一逻辑
在此版本之前,提交作业是执行环境的一部分职责,并且与不同的部署目标(例如,Yarn,Kubernetes,Mesos)紧密相关。这导致关注点分离不佳,并且随着时间的流逝,用户需要单独配置和管理的定制环境越来越多。
在Flink 1.10中,作业提交逻辑被抽象到通用Executor接口(FLIP-73)中。另外ExecutorCLI(FLIP-81)引入了一个统一的方式去指定配置参数对于任何 执行对象。为了完善这项工作,结果检索的过程也与作业提交分离,引入了JobClient(FLINK-74)来负责获取JobExecutionResult。
特别是,这些更改通过为用户提供Flink的统一入口点,使在下游框架(例如Apache Beam或Zeppelin交互式笔记本)中以编程方式使用Flink变得更加容易。对于跨多个目标环境使用Flink的用户,向基于配置的执行过程的过渡还可以显着减少样板代码和可维护性开销。
原生Kubernetes集成(测试版)
对于希望在容器化环境上开始使用Flink的用户,在Kubernetes之上部署和管理独立集群需要有关容器,算子和环境工具kubectl的一些知识。
在Flink 1.10中,我们推出了Active Kubernetes集成(FLINK-9953)的第一阶段,其中,“主动”指 Flink ResourceManager (K8sResMngr) 原生地与 Kubernetes 通信,像 Flink 在 Yarn 和 Mesos 上一样按需申请 pod。用户可以利用 namespace,在多租户环境中以较少的资源开销启动 Flink。这需要用户提前配置好 RBAC 角色和有足够权限的服务账号。
正如刚刚讲到的,Flink 1.10中的所有命令行选项都映射到统一配置。因此,用户可以简单地引用Kubernetes配置选项,然后使用以下命令在CLI中将作业提交到Kubernetes上的现有Flink会话:
1 | ./bin/flink run -d -e kubernetes-session -Dkubernetes.cluster-id=<ClusterId> examples/streaming/WindowJoin.jar |
如果您想尝试使用此预览功能,我们建议您逐步完成本机Kubernetes的安装,试用并与社区分享反馈。
Table API / SQL:生产就绪的Hive集成
Hive集成在Flink 1.9中宣布为预览功能。此预览允许用户使用SQL DDL将Flink-specific元数据(例如Kafka表)保留在Hive Metastore中,调用Hive中定义的UDF并使用Flink读取和写入Hive表。Flink 1.10通过进一步的开发使这项工作更加圆满,这些开发使可立即投入生产的Hive集成到Flink,并具有与大多数Hive版本的完全兼容性。
批处理SQL的本地分区支持
1.10版本以前,仅支持对未分区的Hive表进行写入。在Flink 1.10中,Flink SQL语法已通过INSERT OVERWRITE
和PARTITION
(FLIP-63)进行了扩展,使用户能够在Hive中写入静态和动态分区。
静态分区写入**
1 | INSERT { INTO | OVERWRITE } TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement; |
动态分区编写**
1 | INSERT { INTO | OVERWRITE } TABLE tablename1 select_statement1 FROM from_statement; |
Flink对于分区表的全面支持,允许用户利用读取时的分区修剪功能,通过减少需要扫描的数据量来显着提高这些操作的性能。
进一步优化
除了分区修剪外,Flink 1.10还为Hive集成引入了更多读取优化,例如:
- 投影下推: Flink通过省略表扫描中不必要的字段,利用投影下推来最大程度地减少Flink和Hive表之间的数据传输。这对于具有大量列的表尤其有利。
- LIMIT下推:对于带有
LIMIT
子句的查询,Flink将尽可能限制输出记录的数量,以最大程度地减少通过网络传输的数据量。
- 读取时进行ORC矢量化:为了提高ORC文件的读取性能,Flink现在默认将本机ORC矢量化阅读器用于2.0.0以上的Hive版本以及具有非复杂数据类型的列。
可插拔模块作为Flink系统对象(Beta)
Flink 1.10引入了Flink Table核心中可插拔模块的通用机制,首先关注系统功能(FLIP-68)。使用该模块,用户可以扩展Flink的系统对象,例如,使用行为类似于Flink系统功能的Hive内置函数。该版本附带一个预先实现的HiveModule
,支持多个Hive版本的版本,但用户也可以编写自己的可插拔模块。
Table API / SQL的其他改进
SQL DDL中的水印和计算列
Flink 1.10支持特定于流的语法扩展,以在Flink SQL DDL(FLIP-66)中定义时间属性和水印生成。这允许基于时间的操作(例如加窗),以及在使用DDL语句创建的表上定义水印策略。
1 | CREATE TABLE table_name ( |
此版本还引入了对虚拟计算列(FLIP-70)的支持,该列可基于同一表中的其他列或确定性表达式(即,文字值,UDF和内置函数)派生。在Flink中,计算列可用于在创建表时定义时间属性。
SQL DDL的其他扩展
现在,temporary/persistent 和 system/catalog(FLIP-57)之间有明显的区别。这不仅消除了函数引用中的歧义,而且允许确定性的函数解析顺序(即,在命名冲突的情况下,系统函数将优先于目录函数,而临时函数的优先级高于两个维度的持久性函数)。
遵循FLIP-57的基础知识,我们扩展了SQL DDL语法以支持目录功能,临时功能和临时系统功能(FLIP-79)的创建:
1 | CREATE [TEMPORARY|TEMPORARY SYSTEM] FUNCTION |
有关Flink SQL中DDL支持的当前状态的完整概述,请查看更新的文档。
注意**为了将来能正确处理和保证元对象(表,视图,函数)之间的行为一致,不建议使用Table API中的某些对象声明方法,而应使用更接近标准SQL DDL的方法(FLIP -64)。
TPC-DS的完整覆盖范围可批量处理
TPC-DS是一种广泛使用的行业标准决策支持基准,用于评估和衡量基于SQL的数据处理引擎的性能。在Flink 1.10中,端到端(FLINK-11491)支持所有TPC-DS查询,这反映了它的SQL引擎已准备就绪,可以满足类似现代数据仓库的工作负载的需求。
PyFlink:支持本机用户定义的函数(UDF)
在以前的发行版中引入了PyFlink的预览版,朝着实现Flink中完全Python支持的目标迈进了一步。对于此发行版,重点是使用户能够在表API / SQL(FLIP-58)中注册和使用Python用户定义函数(UDF,已计划UDTF / UDAF )。
如果您对基础实现感兴趣(利用Apache Beam的可移植性框架),请参考FLIP-58的“架构”部分,也请参考FLIP-78。这些数据结构为Pandas支持和PyFlink最终到达DataStream API奠定了必要的基础。
从Flink 1.10开始,用户还可以pip
使用以下方法轻松安装PyFlink :
1 | pip install apache-flink |
有关PyFlink计划进行的其他改进的预览,请查看FLINK-14500并参与有关所需用户功能的讨论。
重要变化
- [ FLINK-10725 ] Flink现在可以编译并在Java 11上运行。
- [ FLINK-15495 ] Blink计划程序现在是SQL Client中的默认设置,因此用户可以从所有最新功能和改进中受益。在下一个版本中,还计划从Table API中的旧计划程序进行切换,因此我们建议用户开始熟悉Blink计划程序。
- [ FLINK-13025 ]有一个新的Elasticsearch接收器连接器,完全支持Elasticsearch 7.x版本。
- [ FLINK-15115 ] Kafka 0.8和0.9的连接器已标记为不推荐使用,将不再得到积极支持。如果您仍在使用这些版本或有任何其他相关问题,请联系@dev邮件列表。
- [ FLINK-14516 ]删除了非基于信用的网络流控制代码以及配置选项
taskmanager.network.credit.model
。展望未来,Flink将始终使用基于信用的流量控制。 - [ FLINK-12122 ] FLIP-6在Flink 1.5.0中推出,并引入了与从中分配插槽方式有关的代码回归
TaskManagers
。要使用更接近FLIP之前行为的调度策略(Flink尝试将工作负载分散到所有当前可用的行为中)TaskManagers
,用户可以cluster.evenly-spread-out-slots: true
在中设置flink-conf.yaml
。 - [ FLINK-11956 ]
s3-hadoop
和s3-presto
文件系统不再使用类重定位,而应通过插件加载,但现在可以与所有凭据提供程序无缝集成。强烈建议将其他文件系统仅用作插件,因为我们将继续删除重定位。 - Flink 1.9带有重构的Web UI,保留了旧版的UI作为备份,以防万一某些功能无法正常工作。到目前为止,尚未报告任何问题,因此社区投票决定在Flink 1.10中删除旧版Web UI。
发行说明
如果您打算将设置升级到Flink 1.10,请仔细查看发行说明,以获取详细的更改和新功能列表。此版本与以前的1.x版本的API兼容,这些版本的API使用@Public注释进行了注释。