Flink 基础教程
Flink 的一个优势是,它拥有诸多重要的流式计算功能。其他项目为了实现这些功能,都不得不付出代价。比如,Storm 实现了低延迟,但是做不到高吞吐,也不能在故障发生时准确地处理计算状态;Spark Streaming 通过采用微批处理方法实现了高吞吐和容错性,但是牺牲了低延迟和实时处理能力,也不能使窗口与自然时间相匹配,并且表现力欠佳。

初探 Flink
Apache Flink 是为分布式、高性能、随时可用以及准确的流处理应用程序打造的开源流处理框架。Flink 不仅能提供同时支持高吞吐和 exactly-once 语义的实时计算,还能提供批量数据处理。
Flink 起源于 Stratosphere 项目, Stratosphere 是在 2010~2014 年由 3 所地处柏林的大学和欧洲的一些其他的大学共同进行的研究项目。2014 年 4 月,Stratosphere 的代码被复制并捐献给了 Apache 软件基金会,Flink 一词在德语中表示快速和灵巧。项目采用一只松鼠的彩色图案作为 logo,这不仅因为松鼠具有快速和灵巧的特点,还因为柏林的松鼠有一种迷人的红棕色。

批处理与流处理
Flink 的核心计算构造是 Flink Runtime 执行引擎,它是一个分布式系统,能够接受数据流程序并在一台或多台机器上以容错方式执行。 Flink Runtime 执行引擎可以作为 YARN(Yet Another Resource Negotiator)的应用程序在集群上运行,也可以在 Mesos 集群上运行,还可以在单机上运行(这对于调试 Flink 应用程序来说非常有用)。

Flink 分别提供了面向流处理的接口(DataStream API)和面向批处理的接口(DataSet API)。因此,Flink 既可以完成流处理,也可以完成批处理。Flink 支持的拓展库涉及机器学习(FlinkML)、复杂事件处理(CEP),以及图计算(Gelly),还有分别针对流处理和批处理的 Table API。
Flink 提供了封装在 Runtime 执行引擎之上的 API,以帮助用户更方便地生成流式计算程序。
Flink 项目的架构有两个主要组成部分:消息传输层和由 Flink 提供的流处理层。消息传输层负责传输连续事件产生的消息,能够提供消息传输的系统包括 Kafka 和 MapR Streams。

对时间的处理
采用批处理架构
用定期运行的批处理作业来实现应用程序的持续性。数据被持续地分割为文件(如以一小时为单位);然后,批处理作业将文件作为输入,以此达到持续处理数据的效果。

采用流处理架构计数
通过流处理架构实现应用程序的持续性。水平圆柱体表示消息传输系统(Kafka 或 MapR Streams)。消息传输系统为负责处理所有数据的流处理器(在本例中是 Flink)提供流数据。

DataStream<LogEvent> stream = env
// 通过Kafka生成数据流
.addSource(new FlinkKafkaConsumer(...))
// 分组
.keyBy("country")
// 将时间窗口设为60分钟
.timeWindow(Time.minutes(60))
// 针对每个时间窗口进行操作
.apply(new CountPerWindowFunction());
流处理区别于批处理最主要的两点是:流即是流,不必人为地将它分割为文件;时间的定义被明确地写入应用程序代码(如以上代码的时间窗口),而不是与摄取、计算和调度等过程牵扯不清。
时间概念
在流处理中,主要有两个时间概念:
- 事件时间,即事件实际发生的时间。
This chapter requires login to view full content. You are viewing a preview.
Login to View Full Content