Streaming
高性能 & 低延迟
Flink的流计算实现,仅需要很低的配置,就能实现高吞吐量和低延迟的流数据处理。
下面的图表显示了一个分布式流数据的计数任务,的性能和cpu核数的比值。
正好一次语义状态的计算
流数据应用可以在计算过程中保持自定义状态(state)。
Flink's checkpoint 的机制保证了,当发生故障时,状态的仅一次的语义。
自带流量控制(限流)的连续流数据模型
流数据的应用,是一种源源不断的应用。Flink的streaming runtime 具有天然的限流功能(背压): 放慢下游的操作。上游数据量太大的时候,自动反压上游的操作。
轻量级分布式快照实现的故障容错机制
Flink的故障容错机制是通过Chandy-Lamport分布式快照实现的。这是一种轻量级的机制, 它允许系统维持高吞吐率的同时,提供强大的一致性保证。
Batch and Streaming in One System
流处理和批处理同时运行
Flink 使用了一个共同的runtime对于流处理和批处理.
批处理作为流处理的一种特殊场景。
内存管理
Flink 在JVM内实现了它自己的内存管理.应用能够,使用超出主内存的内存大小,同时减少GC次数.
迭代和增量迭代
Flink针对迭代计算这个方面进行了专业的支持 (集群学习领域和图计算这两个领域,经常需要迭代计算).
增量迭代可以通过计算所需的依赖,使计算更快速的收敛。
性能优化
批处理,在花销昂贵的操作(shuffle和sort)的情况下会自动优化利用,从而避免这些昂贵的花销。同时,中间数据是可以缓存起来的。
APIs and Libraries
批处理程序
Flink的DataSet API可以让你写出漂亮的类型安全和易于维护的代码,目前支持Java和Scala。它支持比keyvalue更广泛的数据类型,和丰富的操作。
下面这个例子展示了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")
}
流处理程序
DataStream API支持,在流数据中进行功能丰富的transformations ,同时还支持用户定义的状态,和灵活的窗口。
下面的例子展示了如何计算滑动窗口的文字出现频率。
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) }
.groupBy("word")
.window(Time.of(5, SECONDS)).every(Time.of(1, SECONDS))
.sum("freq")
lib包的生态系统
Flink's 栈提供了多种 libraries 应对各种不同的场景: 机器学习, 图计算, 和 相关性处理(Relational Data Processing).
这些libraries 在加快开发中,目前还处于测试阶段。
Ecosystem
范围广泛的集成
Flink 集成了大多数数据处理领域的开源项目。
Flink 可以跑在yarn上面,和hdfs集成,拉kafka上面的数据,还可以执行Hadoop的代码,和连接各种数据存储。