Apache Flink 1.9重磅发布!首次合并阿里内部版本Blink重要功能

Apache Flink 1.9重磅发布!首次合并阿里内部版本Blink重要功能
最新回答
夙词欢

2022-04-29 10:04:28

Apache Flink 1.9 版本首次合并阿里内部版本 Blink 的重要功能,包括批处理作业的批式恢复、基于 Blink 的 Table API 和 SQL 新查询引擎(预览版)、State Processor API、重新设计的 WebUI、新的 Python Table API(预览版)以及与 Apache Hive 生态系统的集成(预览版)。具体介绍如下:

  • 批处理作业的批式恢复

    功能描述:批作业(DataSet、Table API 和 SQL)从 task 失败中恢复的时间显著缩短。在 Flink 1.9 之前,批处理作业中的 task 失败是通过取消所有 task 并重新启动整个作业来恢复的,即作业从头开始,所有进度都会洞返稿废弃。在此版本中,Flink 将中间结果保留在网络 shuffle 的边纳孝缘,并使用此数据去恢复那些仅受故障影响的 task。所谓 task 的 “failover regions”(故障区)是指通过 pipelined 方式连接的数据交换方式,定义了 task 受故障影响的边界。

    配置方法:要使用这个新的故障策略,需要确保 flink-conf.yaml 中有 jobmanager.execution.failover-strategy: region 的配置。1.9 发布包中默认包含该配置项,但从之前版本升级上来时,若要复用之前的配置,需手动世手加上该配置。

    效果:“Region” 的故障策略能提升 “embarrassingly parallel” 类型流作业(没有任何像 keyBy() 和 rebalance 的 shuffle 的作业)的恢复速度,恢复时只有受影响的故障区的 task 需要重启。对于其他类型的流作业,故障恢复行为与之前版本一样。

  • 基于 Blink 的 Table API 和 SQL 新查询引擎(预览版)

    集成工作:在 Blink 捐赠给 Apache Flink 之后,社区致力于为 Table API 和 SQL 集成 Blink 的查询优化器和 runtime。首先将 flink-table 单模块重构成了多个小模块,使 Java 和 Scala API 模块、优化器、以及 runtime 模块有更清晰的分层和定义明确的接口。

    查询处理器:扩展了 Blink 的 planner 以实现新的优化器接口,现在有两个插件化的查询处理器来执行 Table API 和 SQL:1.9 以前的 Flink 处理器和新的基于 Blink 的处理器。基于 Blink 的查询处理器提供了更好的 SQL 覆盖率(1.9 完整支持 TPC-H,TPC-DS 的支持在下一个版本的计划中),并通过更广泛的查询优化(基于成本的执行计划选择和更多的优化规则)、改进的代码生成机制、和调优过的算子实现来提升批处理查询的性能。此外,还提供了更强大的流处理能力,包括维表 Join,TopN,去重等新功能,以及聚合场景缓解数据倾斜的优化,和内置更多常用的函数。

    使用建议:两个查询处理器之间的语义和功能大部分一致,但并未完全对齐。1.9 之前的 Flink 处理器仍然是 1.9 版本的默认处理器,建议用于生产设置。可以在创建 TableEnvironment 时通过 EnvironmentSettings 配置启用 Blink 处理器,被选择的处理器必须要在正在执行的 Java 进程的类路径中。对于集群设置,默认两个查询处理器都会自动地加载到类路径中。当从 IDE 中运行一个查询时,需要在项目中显式地增加一个处理器的依赖。

  • State Processor API

    功能描述:直到 Flink 1.9,从外部访问作业的状态仅局限于 Queryable State(可查询状态)实验性功能。此版本中引入了一种新的、强大的类库,基于 DataSet 支持读取、写入、和修改状态快照。这意味着 Flink 作业的状态可以自主构建,可以通过读取外部系统的数据(例如外部数据库),然后转换成 savepoint;Savepoint 中的状态可以使用任意的 Flink 批处理 API 查询(DataSet、Table、SQL),例如分析相关的状态模式或检查状态差异以支持应用程序审核或故障排查;Savepoint 中的状态 schema 可以离线迁移,而之前的方案只能在访问状态时进行在线迁移;Savepoint 中的无效数据可以被识别出来并纠正。

    覆盖范围:新的 State Processor API 覆盖了所有类型的快照:savepoint,full checkpoint 和 incremental checkpoint。

  • 重新设计的 WebUI

    重构情况:社区讨论了现代化 Flink WebUI 的提案,决定采用 Angular 的最新稳定版来重构这个组件,从 Angular 1.x 跃升到了 7.x。重新设计的 UI 是 1.9.0 的默认版本,不过有一个按钮可以切换到旧版的 WebUI。

    未来计划:未来,不保证旧版 WebUI 的功能是对齐的,且待新版本稳定后将会完全移除旧版 WebUI。

  • 新的 Python Table API(预览版)

    功能描述:此版本引入了 Python Table API 的第一个版本。该功能围绕着 Table API 设计了很薄的一层 Python API 包装器,基本上将 Python Table API 方法的调用都转换为 Java Table API 调用。在 Flink 1.9 版本中,Python Table API 尚不支持 UDF,只是标准的关系操作。Python 中支持 UDF 的功能在未来版本的路线图中。

    使用方法:如果想尝试新的 Python API,则需要手动安装 PyFlink。然后,可以看一看文档中的演练并尝试自己探索。社区目前正在准备一个 pyflink 的 Python 包,该包将可以通过 pip 进行安装。

  • 与 Apache Hive 生态系统的集成(预览版)

    集成背景:Apache Hive 是 Hadoop 生态圈中广泛用于存储和查询海量结构化数据的系统。Hive 除了是一个查询处理器外,还提供了一个叫做 Metastore 的 catalog 来管理和组织大数据集。查询处理器的一个常见集成点是与 Hive 的 Metastore 集成,以便能够利用 Hive 管理的数据。

    集成功能:社区开始为 Flink table API 和 SQL 实现一个连接到 Hive Metastore 的外部 catalog。在 Flink 1.9 中,用户能够查询和处理存储在 Hive 中多种格式的数据。Hive 集成还包括支持在 Flink table API / SQL 中使用 Hive 的 UDF。

    表持久化:以前,Table API / SQL 中定义的表一直是临时的。不过,新的 catalog 连接器还允许在 Metastore 中持久化存储那些使用 SQL DDL 语句创建的表(如 CREATE TABLE,DROP TABLE)。这意味着可以连接到 Metastore 并注册一个表,例如是一个 Kafka topic 的表。从现在开始,只要 catalog 连接到 Metastore,就可以查询该表。

    功能状态:Flink 1.9 中提供的 Hive 支持还是实验性的。计划在下一个版本中稳定这些功能。