Streaming


高吞吐 & 低延迟

Flink 的流处理引擎只需要很少配置就能实现高吞吐率和低延迟。下图展示了一个分布式计数的任务的性能,包括了流数据 shuffle 过程。

Performance of data streaming applications

支持 Event Time 和乱序事件

Flink 支持了流处理和 Event Time 语义的窗口机制。

Event time 使得计算乱序到达的事件或可能延迟到达的事件更加简单。

Event Time and Out-of-Order Streams

状态计算的 exactly-once 语义

流程序可以在计算过程中维护自定义状态。

Flink 的 checkpointing 机制保证了即时在故障发生下也能保障状态的 exactly once 语义。

Exactly-once Semantics for Stateful Computations

高度灵活的流式窗口

Flink 支持在时间窗口,统计窗口,session 窗口,以及数据驱动的窗口

窗口可以通过灵活的触发条件来定制,以支持复杂的流计算模式。

Windows

带反压的连续流模型

数据流应用执行的是不间断的(常驻)operators。

Flink streaming 在运行时有着天然的流控:慢的数据 sink 节点会反压(backpressure)快的数据源(sources)。

Continuous Streaming Model

容错性

Flink 的容错机制是基于 Chandy-Lamport distributed snapshots 来实现的。

这种机制是非常轻量级的,允许系统拥有高吞吐率的同时还能提供强一致性的保障。

Lightweight Distributed Snapshots

Batch 和 Streaming 一个系统


流处理和批处理共用一个引擎

Flink 为流处理和批处理应用公用一个通用的引擎。

批处理应用可以以一种特殊的流处理应用高效地运行。

Unified Runtime for Batch and Stream Data Analysis

内存管理

Flink 在 JVM 中实现了自己的内存管理。

应用可以超出主内存的大小限制,并且承受更少的垃圾收集的开销。

Managed JVM Heap

迭代和增量迭代

Flink 具有迭代计算的专门支持(比如在机器学习和图计算中)。

增量迭代可以利用依赖计算来更快地收敛。

Performance of iterations and delta iterations

程序调优

批处理程序会自动地优化一些场景,比如避免一些昂贵的操作(如 shuffles 和 sorts),还有缓存一些中间数据。

Optimizer choosing between different execution strategies

API 和 类库


流处理应用

DataStream API 支持了数据流上的函数式转换,可以使用自定义的状态和灵活的窗口。

右侧的示例展示了如何以滑动窗口的方式统计文本数据流中单词出现的次数。

WindowWordCount in Flink's DataStream API

case class Word(word: String, freq: Long)

val texts: DataStream[String] = ...

val counts = text
  .flatMap { line => line.split("\\W+") } 
  .map { token => Word(token, 1) }
  .keyBy("word")
  .timeWindow(Time.seconds(5), Time.seconds(1))
  .sum("freq")

批处理应用

Flink 的 DataSet API 可以使你用 Java 或 Scala 写出漂亮的、类型安全的、可维护的代码。它支持广泛的数据类型,不仅仅是 key/value 对,以及丰富的 operators。

右侧的示例展示了图计算中 PageRank 算法的一个核心循环。

case class Page(pageId: Long, rank: Double)
case class Adjacency(id: Long, neighbors: Array[Long])

val result = initialRanks.iterate(30) { pages =>
  pages.join(adjacency).where("pageId").equalTo("pageId") {

    (page, adj, out : Collector[Page]) => {
      out.collect(Page(page.id, 0.15 / numPages))
        
      for (n <- adj.neighbors) {
        out.collect(Page(n, 0.85*page.rank/adj.neighbors.length))
      }
    }
  }
  .groupBy("pageId").sum("rank")
}

类库生态

Flink 栈中提供了提供了很多具有高级 API 和满足不同场景的类库:机器学习、图分析、关系式数据处理。

当前类库还在 beta 状态,并且在大力发展。

Flink Stack with Libraries

生态系统


广泛集成

Flink 与开源大数据处理生态系统中的许多项目都有集成。

Flink 可以运行在 YARN 上,与 HDFS 协同工作,从 Kafka 中读取流数据,可以执行 Hadoop 程序代码,可以连接多种数据存储系统。

Other projects that Flink is integrated with