官网 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的依赖。
所涉及问题的详细情况如下。
Java DataSet/-Stream api现在独立于Scala,不再传递地依赖于它。具体如下:
许多模块已经失去了它们的Scala后缀。 当混合来自不同Flink版本(例如,一个旧的连接器)的依赖关系时,建议进一步注意,因为您现在可能会拉入单个模块的多个版本(这在以前是通过名称相等来防止的)。
新的模块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不再有Scala后缀了。如果case类的遗留类型系统(基于TypeInformation)仍然在Table API中使用,请确保包含flink-scala。
表文件系统连接器不再是Flink -table-uber JAR的一部分,而是一个专用的(但可移动的)Flink -connector-files JAR,位于Flink发行版的/lib目录中。
Java 8的支持现在已弃用,并将在未来的版本中删除(FLINK-25247)。我们建议所有用户迁移到Java 11。
在Flink docker镜像中的默认Java版本现在是Java 11 (Flink -25251)。有些图像是用Java 8构建的,标记为“java8”。
对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中被移除。
默认情况下,已禁用遗留类型转换行为。这可能对极端情况(字符串解析、数字溢出、字符串表示、varchar/二进制精度)有影响。设置table.exec。legacy-cast-behaviour=ENABLED,恢复旧的行为。
在进入表接收器之前,默认情况下,CHAR/VARCHAR长度是强制的(修剪/填充)
使用Scala隐式转换调用的表函数已经更新,以使用新的类型系统和新的类型推断。用户被要求更新他们的udf或使用已弃用的TableEnvironment。registerFunction通过名称调用函数来临时恢复旧的行为。
flink-conf.yaml和其他配置(例如CLI)现在被传播到TableConfig。尽管直接在TableConfig中设置的配置仍然优先,但是如果表配置意外地设置在其他层中,这种更改可能会产生副作用。
先前已弃用的方法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现在是一个保留关键字。使用反引号转义表、字段和其他引用。
用于表连接器的DataStreamScanProvider和DataStreamSinkProvider收到了一个额外的方法,该方法可能会破坏之前使用lambdas的实现。我们建议将静态类作为替代并增强将来的健壮性。
建议将语句集更新为新的SQL语法:
EXECUTE STATEMENT SET BEGIN ... END;
EXPLAIN STATEMENT SET BEGIN ... END;
这将使用retraction和AVG()改变十进制SUM()的结果。部分行为恢复到与1.13相同,使整体行为与Hive / Spark一致。
DecodingFormat接口用于可投射和非投射格式,导致不一致的实现。FileSystemTableSource已经进行了更新,以区分这两个接口。为FileSystemTableSource实现自定义格式的用户可能需要验证实现,并确保在必要时实现ProjectableDecodingFormat。
这可能会对现有的表源实现产生影响,因为下推过滤器可能不再包含分区谓词。但是,实现分区下推和过滤器下推的表源的连接器实现变得更容易了。
这将在1.14.0和1.14.1之间更改十进制SUM()的结果。将1.13的行为恢复为与Hive/Spark一致。
来自DDL结果的布尔列的字符串表示(true/false -> true/false),以及DQL结果中的行列(+I[…->(…))已更改为可打印。
将不完整字符串(如“12”)转换为TIME的默认值已从12:01:01更改为12:00:00。
STRING到TIMESTAMP(_LTZ)类型转换现在考虑的是小数秒。以前,任何精度的小数秒都被忽略。
如果使用了新的接收接口(例如Kafka),这将为拓扑添加一个额外的操作符。当从1.14保存点恢复时,可能会导致1.14.1出现问题。一种解决方法是在接收之前将时间属性转换为SQL语句中的常规时间戳。
在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不再返回NULL,但总是FALSE(即使参数是NULL)。
禁用UPSERT INTO语句。在以前的版本中,UPSERT INTO语法错误地暴露了出来,没有详细讨论。从这个版本开始,每个UPSERT INTO都将抛出一个异常。UPSERT INTO的用户应该使用文档中的INSERT INTO语句。
十进制数字类型不再允许转换为布尔值。
此问题旨在修复各种主要的关键问题,有效地使它无法使用此功能。更改可能会影响那些不正确管道的保存点向后兼容性。同样,在这些变更之后,产生的变更日志流也可能不同。以前正确的管道应该可以从保存点恢复。
StreamTableEnvironment.fromChangelogStream might produce a different stream because primary keys were not properly considered before.
Table#print的结果已经修改为更接近实际的SQL数据类型。例如,decimal可以正确打印前导/尾随零。
对MapR文件系统的支持已被删除。
flink-connector-testing模块已经被删除,用户应该改用flink-connector-test-utils模块。
现在实现的格式BulkWriterFormatFactory不再需要实现分区键读取,因为它在内部由FileSystemTableSource.
ElasticsearchXSinkBuilder使用支持 DataStream API 的批处理和流模式的新统一接收器接口取代ElasticsearchSink.Builder并提供至少一次写入。
对于使用旧 ElasticsearchSink 接口 ( org.apache.flink.streaming.connectors.elasticsearch7.ElasticsearchSink) 并依赖于自己的 elasticsearch-rest-high-level-client 版本的 Elasticsearch 7 用户,由于内部更改,需要将客户端依赖项更新为 >= 7.14.0 的版本。
旧的 JDBC 连接器(connector.type=jdbc在 DDL 中表示)已被删除。如果尚未完成,用户需要升级到较新的堆栈(connector=jdbc在 DDL 中表示)。
引入了新的指标numRecordsSend,numRecordsSendErrors供用户监控发送到外部系统的记录数量。numRecordsOut应该用于监视接收器任务之间传输的记录数。
连接器开发人员在构建接收器连接器时应注意这些指标 numRecordsOut、numRecordsSend 和 numRecordsSendErrors 的使用。有关详细信息,请参阅新的 Kafka Sink。此外,由于 numRecordsOut 现在只计算接收器任务之间发送的记录,并且 numRecordsOutErrors 是为计算发送到外部系统的记录而设计的,因此我们不推荐使用 numRecordsOutErrors 并建议使用 numRecordsSendErrors 代替。
将重试逻辑添加到已完成作业的清理步骤。此功能改变了 Flink 作业的清理方式。不是尝试一次清理作业,而是重复此步骤,直到成功。用户旨在修复阻止 Flink 完成作业清理的问题。可以配置和禁用重试功能。
TaskManagers JobManager现在在关闭时显式发送信号。这减少了反应模式下的缩减延迟(之前绑定到心跳超时)。
TaskManager 上的作业指标现在在最后一个插槽被释放时被删除,而不是最后一个任务。这意味着它们可能会被报告比以前更长的时间,并且当 TaskManager 上没有任务运行时。
修复了故障转移未列在异常历史记录中但作为根本原因的问题。JobMaster 如果在初始化期间发生故障,则可能会发生这种情况。
实现了一个新的多组件领导选举服务,每个 Flink 进程只运行一次领导选举。如果这会导致任何问题,那么您可以high-availability.use-old-ha-services: true在 中设置flink-conf.yaml 使用旧的高可用性服务。
尝试取消FINISHED/FAILED作业现在返回 409 Conflict 而不是 404 Not Found。
JobManagers现在可以查询所有保存点操作的状态,无论哪个接收JobManager到初始请求。
通过引入新的 JobResultStore 组件,Flink 可以将作业的清理状态持久化到文件系统中,解决了在应用模式下作业完成但在清理过程中失败时重新提交作业的问题。(见FLINK-25431)
从 1.15 开始,sort-shuffle 成为默认的阻塞 shuffle 实现,并且默认启用 shuffle 数据压缩。这些变化仅影响批处理作业,更多信息请参考官方文档【链接】。
从保存点或保留的外部检查点恢复时,您可以选择要执行操作的模式。您可以从CLAIM, NO_CLAIM, LEGACY(旧行为)中进行选择。
在CLAIM模式下,Flink 拥有快照的所有权,并可能会在某个时间点尝试删除快照。另一方面,该NO_CLAIM 模式将确保 Flink 不依赖于任何属于初始快照的文件的存在。
有关更详尽的描述,请参阅文档。
获取保存点时,您可以指定二进制格式。您可以选择原生(特定于特定状态后端)或规范(在所有状态后端统一)。
共享状态跟踪更改为使用检查点 ID 而不是引用计数。共享状态不再在流产时清理(而是在归并或工作终止时)。
这可能会导致丢弃已中止检查点的状态出现延迟。
在每个检查点中引入持久字节的度量(通过 REST API 和 UI),这可以帮助用户了解在基于增量或更改日志的检查点期间保留了多少数据大小。
在 1.15 中我们默认启用了部分任务完成后的检查点支持,并让任务在退出前等待最终检查点,以确保所有数据都已提交。
但是,值得注意的是,此更改会强制任务在退出之前等待另一个检查点。换句话说,此更改将阻止任务,直到下一个检查点被触发并完成。如果检查点间隔较长,任务的执行时间也会大大延长。在最坏的情况下,如果检查点间隔是Long.MAX_VALUE,那么这些任务实际上会被永远阻塞。
具体参考文档
State Processor API 已从 Flinks 的旧 DataSet API 迁移到现在运行在正在BATCH执行的 DataStreams 上。
RocksDB 的内部日志默认保存在 flink 的日志目录下。
现在支持的最低 Hadoop 客户端版本是 2.8.5(Flink 运行时依赖的版本)。客户端仍然可以与旧版本的服务器通信,因为二进制协议应该是向后兼容的。
连接器使用的 Elasticsearch 库分别升级到 7.15.2 和 6.8.20。
对于使用旧 ElasticsearchSink 接口org.apache.flink.streaming.connectors.elasticsearch7.ElasticsearchSink(elasticsearch-rest-high-level-client
已放弃对使用 Zookeeper 3.4 进行 HA 的支持。依赖 Zookeeper 的用户需要升级到 3.5/3.6。默认情况下,Flink 现在使用 Zookeeper 3.5 客户端。
Kafka 连接器现在默认使用 Kafka 客户端 2.8.1。