Flink 的历史版本特性介绍(一)

时间:2025-04-09 07:14:19

如果你还不了解 Flink 是什么,可以查看我之前的介绍文章:Flink 介绍

如果你想跟着我一起学习 flink,欢迎查看订阅专栏:Flink 专栏

这篇文章列举了 Flink 每次发布的版本中的重要特性,从中可以看出 Flink 是如何一步一步发展到今天的。

Flink 的前身是 Stratosphere 项目,最初由柏林工业大学的研究团队开发。Stratosphere 项目旨在实现高性能大数据处理和分析。

0.6.0

发布于 2014 年,这是在 Apache 内部的第一个版本,名称为 Flink。具有以下特点:

  • 定义:ApacheFlink 是用于集群的通用数据处理引擎。
  • 作业通过 Flink 的运行时引擎执行。
  • 数据存储在 Hadoop HDFS 中
  • 支持的资源管理器:standalone、Hadoop YARN
  • 支持的编程语言:Java、Scala

0.7.0

发布于 2014 年,引入下面的新特性:

  • FlinkStreaming:提供了一个 Java API,可以实时处理流数据源(例如Apache Kafka、Apache Flume等)。
  • 流式 Scala API:现在 Scala 和 Java 具有相同的语法和 Transformation,并在之后的版本中保持同步。

0.8.0

发布于 2015 年,引入下面的新特性:

  • 扩展文件系统:现在可以在 Flink 中使用 Hadoop 支持的所有文件系统
  • 支持窗口:引入了新的窗口 API,用于创建窗口、删除窗口元素等
  • hadoop 2.2.0+ 作为默认的依赖

0.9.0

发布于 2015 年,引入下面的新特性:

  • 引入 Table API:/flink/flink-docs-release-0.9/libs/
  • 引入 Gelly 进行图处理:/2015/08/24/introducing-gelly-graph-processing-with-apache-flink/
  • 引入机器学习库:/flink/flink-docs-release-0.9/libs/ml/
  • 引入 Akka 框架来作为 Flink 的 RPC 系统:/
  • 为流处理引入精确一次(exactly-once)语义保证。

0.10.0

发布于 2015 年,引入下面的新特性:

  • 支持 event-time、ingestion-time、processing-time 的流处理
  • 支持 stateful 流处理:提供接口用于定义、更新、查询操作符状态(operator state)
  • 支持高可用:引入 Zookeeper,支持为 standalone 集群和 YARN 设置高可用模式
  • 完善 DataStream API,引入流分区和窗口操作符,窗口设计受到 DataFlow 模型的启发,基于window assigners, triggers 和 evictors概念
  • 引入新的 Connector:ElasticSearchApache Nifi
  • 引入新的 Web Dashboard:可以查看运行 job 的进度,并显示已处理数据量和记录计数的实时统计数据。此外,它还提供了对 TaskManager 的资源使用情况和 JVM 统计信息的访问,包括 JVM 堆使用情况和垃圾收集详细信息。
  • 引入堆外托管内存(off-heap managed memory):可以从堆外内存分配托管内存,有利于减少 TaskManager 的启动时间,减少垃圾回收压力。
  • 为 DataSet API 增加了 left、right 和 outer join 的原生支持。

1.0.0

发布于 2016 年,引入下面的新特性:

  • 支持 RocksDB 作为状态后端的一种实现,用于存储状态。RocksDB 是一个嵌入式键/值存储数据库,最初由 Facebook 开发。当使用这个后端时,流程序中的活动状态可以远远超过内存。RocksDB 文件存储在一个像 HDFS 或 S3这样的分布式文件系统中,用于备份。
  • 引入 savepoints:savepoints是正在运行的流作业状态的 checkpoint,用户可以在 Job 运行时手动触发该 savepoints。savepoints 解决了一些生产上的难题,包括代码升级(应用程序和框架)、集群维护和迁移、 A/B 测试和假设场景,以及测试和调试。
  • 引入复杂事件处理库(CEP)来检测复杂事件流的特殊模式:CEP on Flink
  • 监控功能增强:(1)允许提交 job;(2)引入背压检测(backpressure monitoring)
  • kafka connector 增强:允许在 1 个 source 中订阅多个 topic

1.1.0

发布于 2016 年,引入下面的新特性:

  • connectors:
    • 支持将文件作为 Source
    • 支持将 Kinesis 作为 Source 和 Sink
    • 支持将 Cassandra 作为 Sink
  • Table API 和 SQL:支持更多的标量函数,支持外部的 source 和 sink。
  • DataStream API:支持 session windows,支持对延迟元素进行处理。
  • CEP 支持 Scala API
  • 允许收集和暴露 job 的运行指标给外部系统

1.2.0

发布于 2017 年,引入下面的新特性:

  • 并行度:支持配置最大并行度;支持配置 job 和操作符的并行度;支持修改并行度(从 savepoint 以新的并行度启动 job)
  • 可扩展的非分区状态:为像 KafkaConsumer 这样不使用 keyed state 而是使用 operator state 的操作者添加了可扩展的非分区状态。为了实现可扩展(并行度变更),operator state 需要在并行实例之间进行重分配。
  • ProcessFunction:一个底层的流处理操作,允许访问流应用的底层构建块:Events(流元素)、State(一致性,容错)、Timers(事件时间、处理时间)
  • 异步 IO:引入一个专用的 Async I/O 操作符,用于以检查点的方式异步发出阻塞调用
  • 增加新的部署方式:支持在 Apache Mesos 上运行一个高可用的 Flink 集群。
  • 支持使用 Kerberos 对外部服务进行身份验证,比如 Zookeep、 Kafka、 HDFS 和 YARN。
  • Queryable State:允许用户查询运算符的当前状态。
  • 应用升级:允许用户从1.1.4 版本生成的 savepoint 重新启动作业,不会丢失状态。
  • Table API 和 SQL 功能增强
    • Streaming Table 支持添加了滚动、滑动和会话组窗口聚合
    • 支持更多的内置 SQL 函数和操作,比如EXISTS, VALUES, LIMIT, CURRENT_DATE, INITCAP, NULLIF

1.3.0

发布于 2017 年,引入下面的新特性:

  • 大状态处理/恢复

    • RocksDB 状态后端支持增量 checkpointing,可以加快 checkpointing 速度,节省磁盘空间
    • 文件系统和内存状态后端支持使用 copy-on-write hashmap 实现的异步快照
    • 允许升级状态的序列化器
    • 允许在操作符(operator)粒度上恢复 job 状态
    • 在 job 失败的情况下,可以只重启执行图中受影响的子图,而不是重启整个执行图
  • DataStream API

    • 引入 Side Outputs:允许一个操作符有多个输出流。window 操作符现在可以将延迟的窗口元素输出到 side outputs
    • 引入 Union Operator State API,用于将全部状态发送给所有并行实例,一般用于发送broadcast state
    • 引入 Per-window State,将 window state 和 window 中 keyed state 独立开
  • 部署和工具

    • HistoryServer:允许查看已完成 job 的状态的统计信息
    • watermark 监控:web 前端可以查看每个操作符的 watermark
    • 网络缓冲区配置:不再使用绝对值,默认使用 JVM 堆内存的 10%,还可以配置最小和最大百分比。

1.4.0

发布于 2017 年,引入下面的新特性:

  • TwoPhaseCommitSinkFunction:实现了两阶段提交算法,使得构建端到端的精确一次语义的应用成为可能。
  • Table API 和 SQL
    • Flink SQL 支持基于 processing time 和 event time 的窗口 join
    • Flink SQL 支持INSERT INTO SELECT
    • Table API 支持流表上的聚合,之前只支持 projection、selection 和 union
    • 支持新的 source 和 sink,包括 Kafka 0.11 和 JDBC sink
    • Flink SQL 使用 Apache Calcite 1.14
  • 如果不需要 Hadoop,可以不再引入Hadoop的依赖

1.5.0

发布于 2018 年,引入下面的新特性:

  • 部署
    • 增加了对 YARN 和 Mesos 的动态资源分配和动态资源释放的支持,以提高资源利用率、故障恢复和动态扩展。
    • 简化了对容器管理基础设施(如 Kubernates)上的部署,现在对 JobManager 的请求都通过 REST 的方式,包括作业提交、取消、取消作业状态、获取保存点。
  • 广播状态

    • 广播状态是一种存在于所有并行实例上的状态。广播状态的典型用法涉及两个流,一个是常规数据流,另一个是控制/配置流,通过向所有并行实例广播规则或者模式,可以将它们应用于常规流的所有事件。
    • 广播状态也可以像其他状态一样,在保证精确一次的语义下被保存、修改和查询。
  • 网络

    • 分布式流应用的性能在很大程度上取决于将事件从一个操作符传输到另一个操作符的网络连接组件。在流处理上下文中,延迟和吞吐量是两个非常重要的指标。
  • Task 本地状态恢复

    • Flink 的 checkpoint 机制会将状态写入远程持久化存储,并在出现故障时从远程存储加载。该机制确保在应用失败时不会丢失状态。但是,在出现故障的情况下,从远程存储加载状态、恢复应用需要一段时间。
    • 为了提高故障恢复的效率,基于故障通常发生在单个操作符、TaskManager 或者机器的事实,提出任务本地的状态恢复。在将操作符的状态写入远程存储时,Flink 现在还可以在每台机器的本地磁盘上保留一个副本。在发生故障的情况下,调度程序尝试将任务重新调度到前一台机器,并从本地磁盘而不是远程存储来加载状态,从而加快恢复速度。
  • Table API 和 SQL 扩展对 join 的支持
    • 支持在有限时间范围内进行表 join,时间支持 processing time 和 event time,下面的例子连接表 d 和表 a,表 a 的到达时间字段可以在表的deptureTime 两个小时窗口内
SELECT , , 
FROM Departures d LEFT OUTER JOIN Arrivals a
  ON  = 
  AND  BETWEEN 
       AND  + '2' HOURS
  • 1
  • 2
  • 3
  • 4
  • 5
  • 支持非窗口的 inner join,和标准的 SQL 语句等价
SELECT , , , 
FROM Users u JOIN Orders o
  ON  = 
  • 1
  • 2
  • 3
  • SQL CLI 客户端:支持批和流 SQL 查询
  • 应用可以在不手动触发 savepoint 的情况下扩缩容。Flink 会自动创建 savepoint,停止应用,然后扩缩容至新的并行度。

1.6.0

发布于 2018 年,引入下面的新特性:

  • 提高对状态的支持
    • 支持状态 TTL:允许对状态设置存活时间(time-to-live, TTL),超过存活时间的状态会被清理,operator state 和 keyed state 不会无线增长,也不会包含在随后的 checkpoint 中。
    • 基于 RocksDB 的 timer 状态:在 timer 状态可以存储到 RocksDB 之后,可以支持更大的 timer 状态。
    • 改进了 Flink 的内部定时器数据结构,使得删除复杂度从 O(N)降低到 O(log n)
  • 扩展 Flink 的部署选项

    • 提供了一个集群容器入口点来引导启动作业集群。
    • 客户端现在通过 POST 调用向服务器发送所有与作业相关的内容。
  • SQL 客户端增强

    • 支持用户自定义函数
    • 支持批查询
    • 支持 INSERT INTO 语句
  • Table API 和 SQL 增强

    • Flink 的 Table & SQL API 支持左、右和完整的外部连接,允许连续的结果更新查询。
    • SQL 聚合函数支持 DISTINCT 关键字。
    • 对于带窗口和非带窗口的聚合,支持诸如 COUNT (DISTINCT 列)之类的查询。
    • SQL 和 Table API 现在都包含更多的内置函数,比如 MD5、 SHA1、 SHA2、 LOG 和用于多集的 UNNEST。
  • DataStream API

    • 支持 interval join:现在可以将来自不同流的事件 join 在一起,其中一个流的元素相对于另一个流的元素处于指定的时间间隔内。

1.7.0

发布于 2018 年,引入下面的新特性:

  • 完全支持 Scala 2.12
  • 状态模式演进(state schema evolution)
    • 增加状态模式演进,允许在用户状态 schema 中增加或者删除 column,来应对需求变化。
    • 对于使用 Avro 生成的类作为用户状态时,状态模式演进是开箱即用的功能。
  • 1.6.0 版本中引入的StreamingFileSink现在支持以精确一次的语义保证写入 S3 文件系统
  • Streaming SQL中支持MATCH_RECOGNIZE,用于在数据流上进行模式匹配。
  • 时态表(temporal table)和 temporal join
    • 时态表提供了一个表的变化历史视图,可以返回表在特定时间点的内容
    • temporal join允许使用处理时间或事件时间将常规数据流temporal table 进行 join
    • 比如,有一张包含历史货币汇率的时态表,可以获取任意时间点对应的汇率。有一个数据流,按照数据流中的事件时间和时态表进行 join 就可以对数据流中的数据按照当时的汇率进行转换。
  • SQL Client 支持定义视图

1.8.0

发布于 2019 年,引入下面的新特性:

状态模式演进

  • POJO 数据类型支持状态模式演进
  • 升级所有 Flink 序列化器以使用新的序列化兼容性抽象
  • 为常见的序列化器提供预定义的快照实现

状态清理

  • 之前在 1.6.0 版本引入了状态 TTL,允许在指定的时候后清理 keyed 状态
  • 现在为基于堆的状态后端和基于 RocksDB 的状态后端引入了对于状态的持续清理

SQL 模式检测

允许在 SQL 模式检测(MATCH_RECOGNIZE)中使用用户自定义函数和聚合

1.9.0

发布于 2019 年,引入下面的新特性:Flink 的目标是开发一个流处理系统来统一和支持多种形式的实时、离线和事件驱动应用。在这个版本中,将流处理和批处理功能集成到一个统一的运行时。

支持特定区域的批 job 恢复

在 1.9.0 版本之前,批 job 失败之后,恢复的话需要取消所有 task 并重启 job。

在 1.9.0 版本之后,批 job 失败之后,可以配置为只取消并重启失败的 task:-strategy: region

State Processor API

在 1.9.0 版本之后,外部只能通过 queryable state 来访问 job 状态,1.9.0 版本引入了一个可以使用批处理 DataSet API 读取、写入和修改 job 状态的 State Processor API

新的State Processor API支持所有快照:savepoint、全量checkpoint 和增量 checkpoint

Stop with Savepoint

现在可以使用 svaepoint 来停止 job:bin/flink stop -p [:targetDirectory] :jobId

SQL API 支持 DDL

之前 SQL API 只支持 DML 语句,现在可以支持 DDL 语句,比如CREATE TABLEDROP TABLE

集成 Hive

Hive 在 Hadoop 生态中被广泛用于存储和查询大量结构化数据,用户能够查询和处理所有存储在 Hive 中的数据。

支持在 Table API 或 SQL 查询中使用 Hive 的 UDF。

引入 Python Table API

1.10.0

发布于 2020 年,引入下面的新特性:

改进内存管理和配置

  • 引入托管内存(managed memory)来解决 RocksDB 状态后端的内存使用问题,为了统一批作业和流作业的配置,托管内存位于堆外(off-heap)
  • 简化 RocksDB 配置:(1)配置开箱即用,不再需要调优(2)允许配置本机内存,避免超出总内存

统一 job 提交逻辑

  • 在这个版本之前,job 提交是执行环境的职责,并且与不同的部署方式密切相关(比如Yarn、Kubernates、Mesos)。
  • 引入了通用的 Executor 接口进行 job 提交,引入了 JobClient 来获取 job 执行结果。

集成原生的 Kubernates

未完

由于从1.11.0版本开始,每个版本包含的特性很多,对于每个版本会单独写文章来介绍,敬请期待。

相关文章