官网 https://nightlies.apache.org/flink/flink-docs-release-1.15/release-notes/flink-1.15

变化的依赖概况

在Flink 1.15中有几个变化,当从早期版本升级时,需要更新依赖项名称,主要包括从非Scala模块中选择排除Scala依赖项,以及重新组织表模块。 一个快速的依赖变化清单如下:
对以下模块的任何依赖都需要更新,以不再包含后缀:

flink-cep
flink-clients
flink-connector-elasticsearch-base
flink-connector-elasticsearch6
flink-connector-elasticsearch7
flink-connector-gcp-pubsub
flink-connector-hbase-1.4
flink-connector-hbase-2.2
flink-connector-hbase-base
flink-connector-jdbc
flink-connector-kafka
flink-connector-kinesis
flink-connector-nifi
flink-connector-pulsar
flink-connector-rabbitmq
flink-container
flink-dstl-dfs
flink-gelly
flink-hadoop-bulk
flink-kubernetes
flink-runtime-web
flink-sql-connector-elasticsearch6
flink-sql-connector-elasticsearch7
flink-sql-connector-hbase-1.4
flink-sql-connector-hbase-2.2
flink-sql-connector-kafka
flink-sql-connector-kinesis
flink-sql-connector-rabbitmq
flink-state-processor-api
flink-statebackend-rocksdb
flink-streaming-java
flink-test-utils
flink-yarn
flink-table-api-java-bridge
flink-table-runtime
flink-sql-client
flink-orc
flink-orc-nohive
flink-parquet

对于Table / SQL用户,新的模块flink-table-planner-loader取代了flink- Table - planner_1 .12,并且避免了Scala后缀的需要。 为了向后兼容,用户仍然可以将其与位于opt/中的flink-table-planner_2.12进行交换。 Flink-table-uber被分为flink-table-api-java-uber, flink-table-planner(-loader)和flink-table-runtime。 Scala用户需要显式地添加对flink-table-api-scala或flink-table-api-scala-bridge的依赖。

所涉及问题的详细情况如下。

添加对opting-out Scala的支持

Java DataSet/-Stream api现在独立于Scala,不再传递地依赖于它。具体如下:

  • 如果你只打算在Java类型中使用Java api,那么你可以通过从发行版的lib/目录中删除Flink -scala jar来选择加入一个没有scala的Flink。 然后你就可以使用任何Scala版本和Scala库了。 你可以把Scala本身捆绑到你的user-jar中; 或者放到发行版的lib/目录中。
  • 如果您依赖于Scala api,而没有对它们的显式依赖,那么在构建项目时可能会遇到问题。 您可以通过向您正在使用的api添加显式依赖来解决这个问题。 这将主要影响Scala DataStream/CEP api的用户。

许多模块已经失去了它们的Scala后缀。 当混合来自不同Flink版本(例如,一个旧的连接器)的依赖关系时,建议进一步注意,因为您现在可能会拉入单个模块的多个版本(这在以前是通过名称相等来防止的)。

重新组织table模块和介绍flink-table-planner-loader

新的模块flink-table-planner-loader取代了flink-table-planner_2.12,并且避免了Scala后缀的需要。 它包含在Flink发行版的lib/下。 为了向后兼容,用户仍然可以将其与位于opt/中的flink-table-planner_2.12进行交换。 因此,flink-table-uber被分为flink-table-api-java-uber、flink-table-planner(-loader)和flink-table-runtime。 flink-sql-client不再有Scala后缀。

建议让新项目在提供的范围内依赖于flink-table-planner-loader(没有Scala后缀)。

请注意,该发行版默认情况下不包含Scala API。 Scala用户需要显式地添加对flink-table-api-scala或flink-table-api-scala-bridge的依赖。

从flink-table-runtime #中移除flink-scala的依赖

flink-table-runtime不再有Scala后缀了。如果case类的遗留类型系统(基于TypeInformation)仍然在Table API中使用,请确保包含flink-scala。

Flink-table uber jar不应该包括flink-connector-files依赖

表文件系统连接器不再是Flink -table-uber JAR的一部分,而是一个专用的(但可移动的)Flink -connector-files JAR,位于Flink发行版的/lib目录中。

JDK升级

Java 8的支持现在已弃用,并将在未来的版本中删除(FLINK-25247)。我们建议所有用户迁移到Java 11。

在Flink docker镜像中的默认Java版本现在是Java 11 (Flink -25251)。有些图像是用Java 8构建的,标记为“java8”。

不再支持scala 2.11

对Scala 2.11的支持已经在FLINK-20845中移除。所有(过渡地)依赖于Scala的Flink依赖都以它们所针对的Scala版本作为后缀,例如Flink -stream -scala_2.12。用户应该更新所有Flink依赖项,将“2.11”改为“2.12”。

Scala版本(2.11、2.12等)之间不是二进制兼容的。这也意味着,如果你正在升级到Flink Scala 2.12应用程序,你不能保证可以从Flink Scala 2.11应用程序的保存点恢复。这取决于您在应用程序中使用的数据类型。

Scala Shell/REPL已经在FLINK-24360中被移除。

Table API & SQL

默认情况下禁用遗留类型转换行为

默认情况下,已禁用遗留类型转换行为。这可能对极端情况(字符串解析、数字溢出、字符串表示、varchar/二进制精度)有影响。设置table.exec。legacy-cast-behaviour=ENABLED,恢复旧的行为。

当输出到Sink #时强制CHAR/VARCHAR精度

在进入表接收器之前,默认情况下,CHAR/VARCHAR长度是强制的(修剪/填充)

支持Scala Table API表函数中的新类型推断

使用Scala隐式转换调用的表函数已经更新,以使用新的类型系统和新的类型推断。用户被要求更新他们的udf或使用已弃用的TableEnvironment。registerFunction通过名称调用函数来临时恢复旧的行为。

将执行器配置传播到TableConfig

flink-conf.yaml和其他配置(例如CLI)现在被传播到TableConfig。尽管直接在TableConfig中设置的配置仍然优先,但是如果表配置意外地设置在其他层中,这种更改可能会产生副作用。

删除pre FLIP-84方法

先前已弃用的方法TableEnvironment.execute, Table.insertInto, TableEnvironment.fromTableSource, TableEnvironment.sqlUpdate, and TableEnvironment.explain 已经被移除. 请使用 TableEnvironment.executeSql, TableEnvironment.explainSql, TableEnvironment.createStatementSet, as well as Table.executeInsert, Table.explain and Table.execute and the newly introduces classes TableResult, ResultKind, StatementSet and ExplainDetail.

修复解析器生成器警告

STATEMENT现在是一个保留关键字。使用反引号转义表、字段和其他引用。

为DataStream/Transformation提供程序公开uid生成器

用于表连接器的DataStreamScanProvider和DataStreamSinkProvider收到了一个额外的方法,该方法可能会破坏之前使用lambdas的实现。我们建议将静态类作为替代并增强将来的健壮性。

添加新的语句集语法

建议将语句集更新为新的SQL语法:

EXECUTE STATEMENT SET BEGIN ... END;
EXPLAIN STATEMENT SET BEGIN ... END;

检查并可能修复所有聚合函数的十进制精度和刻度

这将使用retraction和AVG()改变十进制SUM()的结果。部分行为恢复到与1.13相同,使整体行为与Hive / Spark一致。

阐明DecodingFormat的语义及其数据类型

DecodingFormat接口用于可投射和非投射格式,导致不一致的实现。FileSystemTableSource已经进行了更新,以区分这两个接口。为FileSystemTableSource实现自定义格式的用户可能需要验证实现,并确保在必要时实现ProjectableDecodingFormat。

在过滤器之前下推分区

这可能会对现有的表源实现产生影响,因为下推过滤器可能不再包含分区谓词。但是,实现分区下推和过滤器下推的表源的连接器实现变得更容易了。

Flink SQL SUM()导致精度错误

这将在1.14.0和1.14.1之间更改十进制SUM()的结果。将1.13的行为恢复为与Hive/Spark一致。

在TableResult#print中使用新的类型转换规则

来自DDL结果的布尔列的字符串表示(true/false -> true/false),以及DQL结果中的行列(+I[…->(…))已更改为可打印。

将字符串转换为DATE和TIME允许不完整字符串

将不完整字符串(如“12”)转换为TIME的默认值已从12:01:01更改为12:00:00。

从STRING转换到TIMESTAMP_LTZ会丢失小数秒

STRING到TIMESTAMP(_LTZ)类型转换现在考虑的是小数秒。以前,任何精度的小数秒都被忽略。

在Table API中使用时,使用统一接收器框架构建的接收器不接收时间戳

如果使用了新的接收接口(例如Kafka),这将为拓扑添加一个额外的操作符。当从1.14保存点恢复时,可能会导致1.14.1出现问题。一种解决方法是在接收之前将时间属性转换为SQL语句中的常规时间戳。

SQL函数应该返回STRING而不是VARCHAR(2000)

在1.14中返回VARCHAR(2000)的函数现在返回最大长度的VARCHAR。特别是包括:

SON_VALUE
CHR
REVERSE
SPLIT_INDEX
REGEXP_EXTRACT
PARSE_URL
FROM_UNIXTIME
DECODE
DATE_FORMAT
CONVERT_TZ

支持IS JSON的表API

这个问题增加了IS JSON的表API。注意,IS JSON不再返回NULL,但总是FALSE(即使参数是NULL)。

在Flink SQL中禁用upsert into语法

禁用UPSERT INTO语句。在以前的版本中,UPSERT INTO语法错误地暴露了出来,没有详细讨论。从这个版本开始,每个UPSERT INTO都将抛出一个异常。UPSERT INTO的用户应该使用文档中的INSERT INTO语句。

RuntimeException: while resolving method ‘booleanValue’ in class class java.math.BigDecimal

十进制数字类型不再允许转换为布尔值。

不会为所有接收器提供程序插入Upsert materializer

此问题旨在修复各种主要的关键问题,有效地使它无法使用此功能。更改可能会影响那些不正确管道的保存点向后兼容性。同样,在这些变更之后,产生的变更日志流也可能不同。以前正确的管道应该可以从保存点恢复。

Propagate unique keys for fromChangelogStream

StreamTableEnvironment.fromChangelogStream might produce a different stream because primary keys were not properly considered before.

TableResult#print()应该使用内部数据类型

Table#print的结果已经修改为更接近实际的SQL数据类型。例如,decimal可以正确打印前导/尾随零。

Connectors连接器

Remove MapR filesystem

对MapR文件系统的支持已被删除。

合并flink-connector-testing到flink-connector-test-utils

flink-connector-testing模块已经被删除,用户应该改用flink-connector-test-utils模块。

通过元数据支持分区键(对于文件系统连接器)

现在实现的格式BulkWriterFormatFactory不再需要实现分区键读取,因为它在内部由FileSystemTableSource.

将 ElasticSearch Sink 移植到新的 Unified Sink API (FLIP-143)

ElasticsearchXSinkBuilder使用支持 DataStream API 的批处理和流模式的新统一接收器接口取代ElasticsearchSink.Builder并提供至少一次写入。
对于使用旧 ElasticsearchSink 接口 ( org.apache.flink.streaming.connectors.elasticsearch7.ElasticsearchSink) 并依赖于自己的 elasticsearch-rest-high-level-client 版本的 Elasticsearch 7 用户,由于内部更改,需要将客户端依赖项更新为 >= 7.14.0 的版本。

减少 Table API 连接器中的遗留问题

旧的 JDBC 连接器(connector.type=jdbc在 DDL 中表示)已被删除。如果尚未完成,用户需要升级到较新的堆栈(connector=jdbc在 DDL 中表示)。

可扩展统一接收器使用新指标来捕获传出记录

引入了新的指标numRecordsSend,numRecordsSendErrors供用户监控发送到外部系统的记录数量。numRecordsOut应该用于监视接收器任务之间传输的记录数。

连接器开发人员在构建接收器连接器时应注意这些指标 numRecordsOut、numRecordsSend 和 numRecordsSendErrors 的使用。有关详细信息,请参阅新的 Kafka Sink。此外,由于 numRecordsOut 现在只计算接收器任务之间发送的记录,并且 numRecordsOutErrors 是为计算发送到外部系统的记录而设计的,因此我们不推荐使用 numRecordsOutErrors 并建议使用 numRecordsSendErrors 代替。

Runtime & Coordination

整合清理阶段的重试策略

将重试逻辑添加到已完成作业的清理步骤。此功能改变了 Flink 作业的清理方式。不是尝试一次清理作业,而是重复此步骤,直到成功。用户旨在修复阻止 Flink 完成作业清理的问题。可以配置和禁用重试功能。

TaskManager and JobManager之间引入显式关闭信号

TaskManagers JobManager现在在关闭时显式发送信号。这减少了反应模式下的缩减延迟(之前绑定到心跳超时)。

TaskManagerJobMetricGroup使用最后一个插槽而不是任务 释放

TaskManager 上的作业指标现在在最后一个插槽被释放时被删除,而不是最后一个任务。这意味着它们可能会被报告比以前更长的时间,并且当 TaskManager 上没有任务运行时。

通过异常历史记录访问 JobMaster 初始化期间发生的错误

修复了故障转移未列在异常历史记录中但作为根本原因的问题。JobMaster 如果在初始化期间发生故障,则可能会发生这种情况。

如果没有前导 ResourceManager,DispatcherResourceManagerComponent 无法注销应用程序

实现了一个新的多组件领导选举服务,每个 Flink 进程只运行一次领导选举。如果这会导致任何问题,那么您可以high-availability.use-old-ha-services: true在 中设置flink-conf.yaml 使用旧的高可用性服务。

允许幂等作业取消

尝试取消FINISHED/FAILED作业现在返回 409 Conflict 而不是 404 Not Found。

将异步保存点操作缓存移动到 Dispatcher

JobManagers现在可以查询所有保存点操作的状态,无论哪个接收JobManager到初始请求。

每个作业的待机模式调度程序不知道作业的 JobSchedulingStatus

通过引入新的 JobResultStore 组件,Flink 可以将作业的清理状态持久化到文件系统中,解决了在应用模式下作业完成但在清理过程中失败时重新提交作业的问题。(见FLINK-25431)

更改阻塞 shuffle 的一些默认配置值以获得更好的可用性

从 1.15 开始,sort-shuffle 成为默认的阻塞 shuffle 实现,并且默认启用 shuffle 数据压缩。这些变化仅影响批处理作业,更多信息请参考官方文档【链接】

检查点

FLIP-193:快照所有权

从保存点或保留的外部检查点恢复时,您可以选择要执行操作的模式。您可以从CLAIM, NO_CLAIM, LEGACY(旧行为)中进行选择。

在CLAIM模式下,Flink 拥有快照的所有权,并可能会在某个时间点尝试删除快照。另一方面,该NO_CLAIM 模式将确保 Flink 不依赖于任何属于初始快照的文件的存在。

有关更详尽的描述,请参阅文档

支持本机保存点(无需修改 statebackend 特定的快照策略)

获取保存点时,您可以指定二进制格式。您可以选择原生(特定于特定状态后端)或规范(在所有状态后端统一)。

防止 JM在 检查点中止时丢弃状态

共享状态跟踪更改为使用检查点 ID 而不是引用计数。共享状态不再在流产时清理(而是在归并或工作终止时)。

这可能会导致丢弃已中止检查点的状态出现延迟。

引入增量/完整检查点大小统计信息

在每个检查点中引入持久字节的度量(通过 REST API 和 UI),这可以帮助用户了解在基于增量或更改日志的检查点期间保留了多少数据大小。

默认启用最终检查点

在 1.15 中我们默认启用了部分任务完成后的检查点支持,并让任务在退出前等待最终检查点,以确保所有数据都已提交。

但是,值得注意的是,此更改会强制任务在退出之前等待另一个检查点。换句话说,此更改将阻止任务,直到下一个检查点被触发并完成。如果检查点间隔较长,任务的执行时间也会大大延长。在最坏的情况下,如果检查点间隔是Long.MAX_VALUE,那么这些任务实际上会被永远阻塞。

具体参考文档

将状态处理器 API 迁移到 DataStream API

State Processor API 已从 Flinks 的旧 DataSet API 迁移到现在运行在正在BATCH执行的 DataStreams 上。

将 RocksDB 的日志默认重定位到 flink 日志目录下

RocksDB 的内部日志默认保存在 flink 的日志目录下。

依赖升级

将支持的最低 hadoop 版本升级到 2.8.5

现在支持的最低 Hadoop 客户端版本是 2.8.5(Flink 运行时依赖的版本)。客户端仍然可以与旧版本的服务器通信,因为二进制协议应该是向后兼容的。

将 Elasticsearch 接收器更新到最新的次要版本

连接器使用的 Elasticsearch 库分别升级到 7.15.2 和 6.8.20。

对于使用旧 ElasticsearchSink 接口org.apache.flink.streaming.connectors.elasticsearch7.ElasticsearchSink(elasticsearch-rest-high-level-client

放弃对 Zookeeper 3.4 的支持

已放弃对使用 Zookeeper 3.4 进行 HA 的支持。依赖 Zookeeper 的用户需要升级到 3.5/3.6。默认情况下,Flink 现在使用 Zookeeper 3.5 客户端。

升级Kafka依赖

Kafka 连接器现在默认使用 Kafka 客户端 2.8.1。