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