批处理与流处理
当数据源呈流式出现时,无论批计算或微批计算(如spark streaming),故海量数据处理需要实现实时处理,如早期的storm实现了流处理,但无法实现数据的精准一致性,且不能做到高吞吐,故storm已经淘汰,flink作为新的流式计算/实时计算引擎成为主流。
Flink简介
2010年由柏林工业大学等三所德国大学发起的‘Stratosphere: information Management on the Cloud’ 项目,该项目代码在2014年被贡献给Apache,2014年12月,Aparche推广flink作为商业项目,2015年9月发布第一个稳定版本0.9。FLink在国内的应用十分广泛,头部互联网/零售/金融等公司均使用flink,并为Apache贡献了超过60%的代码,故Flink有官方中文页面
Flink官网定义
Flink是一个框架和分布式处理引擎, 用于再无边界和有边界的数据流上进行有状态的计算,flink能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算
Apache flink is a framework and distributed processing engine for stateful computations over unbounded and bounded data streams. Flink has been designed to run in all common cluster environments, perform computations at in-memory speed and at any scale.
有界流(bounded)和无界流(unbounded)
-
无界流:定义了流的开始,但不定义流的结束,即该数据流会无休止的产生数据。无界流的数据需要持续处理,即数据被社区后需要立即处理。
处理无界流通常要求以特定顺序社区事件,例如事件发生的顺序,以便可以推断结果的完整性。
-
有界流:有定义流的开始和流的结束,有界流可以在摄取所有数据后再进行计算,故有界流不需要有序摄取(通常称为批处理 *batch processing)
Flink可处理有界流和无界流数据集(data set),即 Flink 也可做批处理,但性能上与 Spark 区别不大
有状态的计算
-
Flink默认有状态计算 != spark streaming某些算子(比如聚合和窗口)支持有状态的计算,需要手动设置
-
Flink有状态计算原理:
摄取数据时,会结合当前本地内存中存储的状态进行处理和计算,后可能需要更新当前状态,然后输出结果,即称为有状态的计算
*个人理解:流处理需要实时处理每一个事件,不能
状态保存在本地内存中,系统错误或中断时会丢失 ==> 结合checkpoint机制进行备份
应用场景
绝大多数的业务场景都是无界流,即没有结束状态,会持续不断地产生,
Flink的特点和优势
-
高吞吐、低延迟、高性能
-
事件时间概念:Event Time(支持三种时间:event time,process time 处理时间,ingestion time 事件摄取时间)(详见后续)
-
支持有状态的计算(*见第5点)
-
支持灵活的窗口机制(window)(详见后续)
-
基于轻量级分布式快照(Checkpoint)实现(详见后续)
-
基于JVM实现独立的内存管理
Flink单独申请几块内存用做内存池,Flink任务均想内存池申请内存,归还内存,可以减少频繁的向jvm申请内存,及避免内存碎片。
-
Save point机制
一段时间内应用的种植有可能导致数据丢失或计算结果错误,flink通过save point技术将任务执行的快照保留在存储介质上,任务重启时可直接从实现保存的save point回复原来的计算状态,使任务继续进行。
Save point与checkpoint有类似之处,save point需要手动开启,一般用作可预见性的系统中断恢复,如升级等,check point一般用作不可预见的系统中断的容灾或备份。
流计算框架对比
产品 | 模型 | API | 保证次数 | 容错机制 | 状态管理 | 延时 | 吞吐量 |
---|---|---|---|---|---|---|---|
Storm | Native (数据进入立即处理-流处理) | 组合式(基础API) | at-least-once | record ACK(回滚机制) | 无 | 低 | 低 |
Trident | Micro-Batching (微批处理) | 组合式 | exactly-once | record ACK | 基于操作 | 中 | 中 |
Spark Streaming | Micro-Batching | 声明式(提供封装后的高阶函数,如count) | exactly-once | RDD Checkpoint (基于RDD做checkpoint) | 基于Dstream | 中 | 高 |
Flink | Native | 声明式 | exactly-once | CheckPoint (flink特有的快照) | 所有操作 | 低 | 高 |
*Flink会将任务分成小任务处理,内存充足是吞吐量很高