Flink 1.10 同时还标志着对 Blink[1] 的整合宣告完成,随着对 Hive 的生产级别集成及对 TPC-DS 的全面覆盖,Flink 在加强流式 SQL 处理能力的同时也具有了成熟的批处理能力。本篇博客将对这次版本升级中的主要新特性及优化、值得注意的重要变化以及使用新版本的预期效果逐一进行介绍。html
<p style="text-align:center"> 官网下载连接 sql
<p style="text-align:center">https://flink.apache.org/down...</p></p>express
新版本的二进制发布包和源码包已经能够在最新的 Flink 官网下载页面[2]找到。更多细节请参考完整的版本更新日志[3]以及最新的用户文档[4]。欢迎您下载试用此版本,并将您的反馈意见经过 Flink 邮件列表[5]或 JIRA[6] 与社区分享。apache
Flink 目前的 TaskExecutor 内存模型存在着一些缺陷,致使优化资源利用率比较困难,例如:编程
为了让内存配置变的对于用户更加清晰、直观,Flink 1.10 对 TaskExecutor 的内存模型和配置逻辑进行了较大的改动 (FLIP-49 [7])。这些改动使得 Flink 可以更好地适配全部部署环境(例如 Kubernetes, Yarn, Mesos),让用户可以更加严格的控制其内存开销。网络
■ Managed 内存扩展session
Managed 内存的范围有所扩展,还涵盖了 RocksDB state backend 使用的内存。尽管批处理做业既可使用堆内内存也可使用堆外内存,使用 RocksDB state backend 的流处理做业却只能利用堆外内存。所以为了让用户执行流和批处理做业时无需更改集群的配置,咱们规定从如今起 managed 内存只能在堆外。数据结构
■ 简化 RocksDB 配置框架
此前,配置像 RocksDB 这样的堆外 state backend 须要进行大量的手动调试,例如减少 JVM 堆空间、设置 Flink 使用堆外内存等。如今,Flink 的开箱配置便可支持这一切,且只须要简单地改变 managed 内存的大小便可调整 RocksDB state backend 的内存预算。 less
另外一个重要的优化是,Flink 如今能够限制 RocksDB 的 native 内存占用(FLINK-7289 [8]),以免超过总的内存预算——这对于 Kubernetes 等容器化部署环境尤其重要。关于如何开启、调试该特性,请参考 RocksDB 调试[9]。
注:FLIP-49 改变了集群的资源配置过程,所以从之前的 Flink 版本升级时可能须要对集群配置进行调整。详细的变动日志及调试指南请参考文档[10]。
在此以前,提交做业是由执行环境负责的,且与不一样的部署目标(例如 Yarn, Kubernetes, Mesos)紧密相关。这致使用户须要针对不一样环境保留多套配置,增长了管理的成本。
在 Flink 1.10 中,做业提交逻辑被抽象到了通用的 Executor 接口(FLIP-73 [11])。新增长的 ExecutorCLI (FLIP-81 [12])引入了为任意执行目标[13]指定配置参数的统一方法。此外,随着引入 JobClient(FLINK-74 [14])负责获取 JobExecutionResult,获取做业执行结果的逻辑也得以与做业提交解耦。
上述改变向用户提供了统一的 Flink 入口,使得在 Apache Beam 或 Zeppelin notebooks 等下游框架中以编程方式使用 Flink 变的更加容易。对于须要在多种不一样环境使用 Flink 的用户而言,新的基于配置的执行过程一样显著下降了冗余代码量以及维护开销。
对于想要在容器化环境中尝试 Flink 的用户来讲,想要在 Kubernetes 上部署和管理一个 Flink standalone 集群,首先须要对容器、算子及像 kubectl 这样的环境工具备所了解。
在 Flink 1.10 中,咱们推出了初步的支持 session 模式的主动 Kubernetes 集成(FLINK-9953 [15])。其中,“主动”指 Flink ResourceManager (K8sResMngr) 原生地与 Kubernetes 通讯,像 Flink 在 Yarn 和 Mesos 上同样按需申请 pod。用户能够利用 namespace,在多租户环境中以较少的资源开销启动 Flink。这须要用户提早配置好 RBAC 角色和有足够权限的服务帐号。
正如在统一的做业提交逻辑一节中提到的,Flink 1.10 将命令行参数映射到了统一的配置。所以,用户能够参阅 Kubernetes 配置选项,在命令行中使用如下命令向 Kubernetes 提交 Flink 做业。
./bin/flink run -d -e kubernetes-session -Dkubernetes.cluster-id=<ClusterId> examples/streaming/WindowJoin.jar
若是你但愿第一时间尝试这一特性,欢迎参考相关文档[16]、试用并与社区分享你的反馈意见:
Flink 1.9 推出了预览版的 Hive 集成。该版本容许用户使用 SQL DDL 将 Flink 特有的元数据持久化到 Hive Metastore、调用 Hive 中定义的 UDF 以及读、写 Hive 中的表。Flink 1.10 进一步开发和完善了这一特性,带来了全面兼容 Hive 主要版本[17]的生产可用的 Hive 集成。
■ Batch SQL 原生分区支持
此前,Flink 只支持写入未分区的 Hive 表。在 Flink 1.10 中,Flink SQL 扩展支持了 INSERT OVERWRITE 和 PARTITION 的语法(FLIP-63 [18]),容许用户写入 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 集成还引入了许多数据读取[19]方面的优化,例如:
■ 将可插拔模块做为 Flink 内置对象(Beta)
Flink 1.10 在 Flink table 核心引入了通用的可插拔模块机制,目前主要应用于系统内置函数(FLIP-68 [20])。经过模块,用户能够扩展 Flink 的系统对象,例如像使用 Flink 系统函数同样使用 Hive 内置函数。新版本中包含一个预先实现好的 HiveModule,可以支持多个 Hive 版本,固然用户也能够选择编写本身的可插拔模块 [21]。
■ SQL DDL 中的 watermark 和计算列
Flink 1.10 在 SQL DDL 中增长了针对流处理定义时间属性及产生 watermark 的语法扩展(FLIP-66 [22])。这使得用户能够在用 DDL 语句建立的表上进行基于时间的操做(例如窗口)以及定义 watermark 策略[23]。
CREATE TABLE table_name ( WATERMARK FOR columnName AS <watermark_strategy_expression> ) WITH ( ... )
■ 其余 SQL DDL 扩展
Flink 如今严格区分临时/持久、系统/目录函数(FLIP-57 [24])。这不只消除了函数引用中的歧义,还带来了肯定的函数解析顺序(例如,当存在命名冲突时,比起目录函数、持久函数 Flink 会优先使用系统函数、临时函数)。
在 FLIP-57 的基础上,咱们扩展了 SQL DDL 的语法,支持建立目录函数、临时函数以及临时系统函数(FLIP-79 [25]):
CREATE [TEMPORARY|TEMPORARY SYSTEM] FUNCTION [IF NOT EXISTS] [catalog_name.][db_name.]function_name AS identifier [LANGUAGE JAVA|SCALA]
关于目前完整的 Flink SQL DDL 支持,请参考最新的文档[26]。
注:为了从此正确地处理和保证元对象(表、视图、函数)上的行为一致性,Flink 废弃了 Table API 中的部分对象申明方法,以使留下的方法更加接近标准的 SQL DDL(FLIP-64 [27])。
■ 批处理完整的 TPC-DS 覆盖
TPC-DS 是普遍使用的业界标准决策支持 benchmark,用于衡量基于 SQL 的数据处理引擎性能。Flink 1.10 端到端地支持全部 TPC-DS 查询(FLINK-11491 [28]),标志着 Flink SQL 引擎已经具有知足现代数据仓库及其余相似的处理需求的能力。
做为 Flink 全面支持 Python 的第一步,在以前版本中咱们发布了预览版的 PyFlink。在新版本中,咱们专一于让用户在 Table API/SQL 中注册并使用自定义函数(UDF,另 UDTF / UDAF 规划中)(FLIP-58 [29])。
若是你对这一特性的底层实现(基于 Apache Beam 的可移植框架 [30])感兴趣,请参考 FLIP-58 的 Architecture 章节以及 FLIP-78 [31]。这些数据结构为支持 Pandas 以及从此将 PyFlink 引入到 DataStream API 奠基了基础。
从 Flink 1.10 开始,用户只要执行如下命令就能够轻松地经过 pip 安装 PyFlink:
pip install apache-flink
更多 PyFlink 规划中的优化,请参考 FLINK-14500[32],同时欢迎加入有关用户需求的讨论[33]。
准备升级到 Flink 1.10 的用户,请参考发行说明[44]中的详细变动及新特性列表。对于标注为 @Public 的 API,此版本与此前的 1.x 版本 API 兼容。
Fink 社区对这次新版本的全部贡献者表示感谢:
Achyuth Samudrala, Aitozi, Alberto Romero, Alec.Ch, Aleksey Pak, Alexander Fedulov, Alice Yan, Aljoscha Krettek, Aloys, Andrey Zagrebin, Arvid Heise, Benchao Li, Benoit Hanotte, Benoît Paris, Bhagavan Das, Biao Liu, Chesnay Schepler, Congxian Qiu, Cyrille Chépélov, César Soto Valero, David Anderson, David Hrbacek, David Moravek, Dawid Wysakowicz, Dezhi Cai, Dian Fu, Dyana Rose, Eamon Taaffe, Fabian Hueske, Fawad Halim, Fokko Driesprong, Frey Gao, Gabor Gevay, Gao Yun, Gary Yao, GatsbyNewton, GitHub, Grebennikov Roman, GuoWei Ma, Gyula Fora, Haibo Sun, Hao Dang, Henvealf, Hongtao Zhang, HuangXingBo, Hwanju Kim, Igal Shilman, Jacob Sevart, Jark Wu, Jeff Martin, Jeff Yang, Jeff Zhang, Jiangjie (Becket) Qin, Jiayi, Jiayi Liao, Jincheng Sun, Jing Zhang, Jingsong Lee, JingsongLi, Joao Boto, John Lonergan, Kaibo Zhou, Konstantin Knauf, Kostas Kloudas, Kurt Young, Leonard Xu, Ling Wang, Lining Jing, Liupengcheng, LouisXu, Mads Chr. Olesen, Marco Zühlke, Marcos Klein, Matyas Orhidi, Maximilian Bode, Maximilian Michels, Nick Pavlakis, Nico Kruber, Nicolas Deslandes, Pablo Valtuille, Paul Lam, Paul Lin, PengFei Li, Piotr Nowojski, Piotr Przybylski, Piyush Narang, Ricco Chen, Richard Deurwaarder, Robert Metzger, Roman, Roman Grebennikov, Roman Khachatryan, Rong Rong, Rui Li, Ryan Tao, Scott Kidder, Seth Wiesman, Shannon Carey, Shaobin.Ou, Shuo Cheng, Stefan Richter, Stephan Ewen, Steve OU, Steven Wu, Terry Wang, Thesharing, Thomas Weise, Till Rohrmann, Timo Walther, Tony Wei, TsReaper, Tzu-Li (Gordon) Tai, Victor Wong, WangHengwei, Wei Zhong, WeiZhong94, Wind (Jiayi Liao), Xintong Song, XuQianJin-Stars, Xuefu Zhang, Xupingyong, Yadong Xie, Yang Wang, Yangze Guo, Yikun Jiang, Ying, YngwieWang, Yu Li, Yuan Mei, Yun Gao, Yun Tang, Zhanchun Zhang, Zhenghua Gao, Zhijiang, Zhu Zhu, a-suiniaev, azagrebin, beyond1920, biao.liub, blueszheng, bowen.li, caoyingjie, catkint, chendonglin, chenqi, chunpinghe, cyq89051127, danrtsey.wy, dengziming, dianfu, eskabetxe, fanrui, forideal, gentlewang, godfrey he, godfreyhe, haodang, hehuiyuan, hequn8128, hpeter, huangxingbo, huzheng, ifndef-SleePy, jiemotongxue, joe, jrthe42, kevin.cyj, klion26, lamber-ken, libenchao, liketic, lincoln-lil, lining, liuyongvs, liyafan82, lz, mans2singh, mojo, openinx, ouyangwulin, shining-huang, shuai-xu, shuo.cs, stayhsfLee, sunhaibotb, sunjincheng121, tianboxiu, tianchen, tianchen92, tison, tszkitlo40, unknown, vinoyang, vthinkxie, wangpeibin, wangxiaowei, wangxiyuan, wangxlong, wangyang0918, whlwanghailong, xuchao0903, xuyang1706, yanghua, yangjf2019, yongqiang chai, yuzhao.cyz, zentol, zhangzhanchum, zhengcanbin, zhijiang, zhongyong jin, zhuzhu.zz, zjuwangg, zoudaokoulife, 砚田, 谢磊, 张志豪, 曹建华。
参考连接:
[1] https://flink.apache.org/news...
[2] https://flink.apache.org/down...
[3] https://issues.apache.org/jir...
[4] https://ci.apache.org/project...
[5] https://flink.apache.org/comm...
[6] https://issues.apache.org/jir...
[7] https://cwiki.apache.org/conf...
[8] https://issues.apache.org/jir...
[9] https://ci.apache.org/project...
[10] https://ci.apache.org/project...
[11] https://cwiki.apache.org/conf...
[12] https://cwiki.apache.org/conf...
[13] https://ci.apache.org/project...
[14] https://cwiki.apache.org/conf...
[15] https://jira.apache.org/jira/...
[16] https://ci.apache.org/project...
[17] https://ci.apache.org/project...
[18] https://cwiki.apache.org/conf...
[19] https://ci.apache.org/project...
[20] https://cwiki.apache.org/conf...
[21] https://ci.apache.org/project...
[22] https://cwiki.apache.org/conf...
[23] https://ci.apache.org/project...
[24] https://cwiki.apache.org/conf...
[25] https://cwiki.apache.org/conf...
[26] https://ci.apache.org/project...
[27] https://cwiki.apache.org/conf...
[28] https://issues.apache.org/jir...
[29] https://cwiki.apache.org/conf...
[30] https://beam.apache.org/roadm...
[31] https://cwiki.apache.org/conf...
[32] https://issues.apache.org/jir...
[33] http://apache-flink.147419.n8...
[34] https://issues.apache.org/jir...
[35] https://jira.apache.org/jira/...
[36] https://issues.apache.org/jir...
[37] https://ci.apache.org/project...
[38] https://issues.apache.org/jir...
[39] https://issues.apache.org/jir...
[40] https://issues.apache.org/jir...
[41] https://cwiki.apache.org/conf...
[42] https://issues.apache.org/jir...
[43] http://apache-flink-mailing-l...
[44] https://ci.apache.org/project...