ApacheFlink 是一个开源的分布式流处理和批处理系统。Flink的核心是在数据流上提供了数据分发、通信、具备容错的分布式计算。同时,Flink 在流处理引擎上构建了批处理引擎,原生支持了迭代计算、内存管理和程序优化。
Apache Flink的特性
1. 流处理特性
l 高吞吐、低延迟
Flink 的流处理引擎只需要很少配置就能实现高吞吐率和低延迟。下图展示了一个分布式计数的任务的性能,包括了流数据 shuffle 过程。
l 支持Event Time和Out-of-Order事件
Flink 支持了流处理和 Event Time 语义的窗口机制。
Event time 使得计算乱序到达的事件或可能延迟到达的事件更加简单。
l 状态计算的exactly-once语义
流程序可以在计算过程中维护自定义状态。
Flink的checkpointing机制保证了即使在故障发生下也能保障状态的exactly once语义。
l 高度灵活的流失窗口
Flink支持在时间窗口,统计窗口,session窗口,以及数据驱动的窗口。
窗口可以通过灵活的触发条件来定制,以支持复杂的流计算模式。
l 带Backpressure的连续流模型
数据流应用执行的是不间断的(常驻)operators。
Flink streaming在运行时有着天然的流控:慢的数据sink节点会反压(backpressure)快的数据源(sources)。
l 容错性
Flink 的容错机制是基于 Chandy-Lamport distributed snapshots 来实现的。
这种机制是非常轻量级的,允许系统拥有高吞吐率的同时还能提供强一致性的保障。
2. 批处理和流程共用一个系统
l 流处理和批处理共用一个引擎
它能够基于同一个Flink Runtime,提供支持流处理和批处理两种类型应用的功能。
批处理被作为一种特殊的流处理,只是它的输入数据流被定义为有界的。
l 内存管理
Flink在JVM中实现了自己的内存管理。
应用可以超出主内存的大小限制,并且承受更少的垃圾收集的开销。
l 迭代和增量迭代
Flink具有迭代计算的专门支持(比如在机器学习和图计算中)。
增量迭代可以利用依赖计算来更快地收敛。
l 程序调优
批处理程序会自动地优化一些场景,比如避免一些昂贵的操作(如shuffles和sorts),还有缓存一些中间数据。
3. API和类库
l 流处理应用
DataStream API 支持了数据流上的函数式转换,可以使用自定义的状态和灵活的窗口。
下面的示例展示了如何以滑动窗口的方式统计文本数据流中单词出现的次数。
WindowWordCount在Flink的DataStreamAPI中应用:
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")
l 批处理应用
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")
}
l 类库生态系统
Flink栈中提供了很多具有高级API和满足不同场景的类库:机器学习、图分析、关系式数据处理。
当前类库还在 beta 状态,并且在大力发展。
4. 与大数据生态系统集成
Flink与开源大数据处理生态系统中的许多项目都有集成。
Flink可以运行在YARN上,与HDFS协同工作,从Kafka中读取流数据,可以执行Hadoop程序代码,可以连接多种数据存储系统。