Flink流式框架原理探究

Flink是一个开源的流式处理框架,它具有如下特点:

  •  分布式: Flink 程序可以运行在多台机器上。
  •  高性能: 处理性能比较高。
  • 高可用: 由于Flink 程序本身是稳定的,因此它支持高可用性(High Availability,HA)。
  • 准确:Flink 可以保证数据处理的准确性.

Flink是Java代码实现的,它同时支持实时流处理和批处理。对于Flink而言,作为一个流处理框架,批处理只是流数据的一个极限特例而已。此外,Flink还支持迭代计算,内存管理和程序优化,这是它的原生特性。

 

Flink 架构分析

Flink架构可以分为4层,包括Deploy层,Core层,API层和Library层

  1. Deploy层: 该层主要涉及Flink的部署模式,Flink支持多种部署模式-本地,集群(Standalone/YARN)和云服务(GCE/EC2)
  2. Core层: 该层提供了支持Flink计算的全部核心实现,为API层提供基础服务
  3. API层: 该层主要实现了面向无界Stream的流处理和面向Batch的批处理,其中流处理对应DataStream API,批处理对应DataSet API。
  4. library层: 该层也称为Flink应用框架层,根据API层的划分,在API层之上构建的满足特定应用的实现计算框架,也分别对应于面向流处理和面向批处理两类。面向流处理支持CEP(复杂的事务处理),基于SQL-like的操作(基于Table的关系操作);面向批处理支持FlinkML(机器学习库),Gelly(图处理),Table操作。

Flink 基本组件

如果对Hadoop和Storm程序有所了解,在Hadoop中实现一个MapReduce需要两个阶段--Map和Reduce阶段,而在Storm中实现一个Topology则需要Spout和Bolt组件。因此,如果我们需要实现一个Flink任务的话,也需要有类似的逻辑。

Flink中提供了3个组件,包括DataSource,Transformation和DataSink。

  •      DataSource:表示数据源组件,主要用来接收数据,目前常用的有readTextFile,socketTextStream,fromCollection以及一些第三方的  Source。
  •     Transformation: 表示算子,主要用来对数据进行处理,比如Map,FlatMap,Filter,Reduce,Aggregation等。
  •      DataSink:表示输出组件,主要用来把计算的结果输出到其他的存储介质中,比如writeAsText以及Kafka,Redis,Elasticsearch等第三方Sink组件。

因此,想要组装一个Flink Job,至少需要这3个组件

Flink Job = DataSource+Transformation+DataSink

=============================================================================================

Flink典型使用场景:

Flink主要应用于流式数据分析场景,目前主要涉及如下领域.

  • 实时ETL:集成流计算现有的诸多数据通道和SQL灵活的加工能力,对流式数据进行实时清洗,归并和结构化处理;同时,对离线仓库进行有效补充和优化,并为数据实时传输提供可计算通道。
  • 实时报表:实时化采集,加工流式数据存储;实时监控和展现业务,客户各类指标,让数据化运营实时化。
  • 监控预警:对系统和用户行为进行实时检测和分析,以便及时发现危险行为。
  • 在线系统:实时及时各类指标,并利用实时结果及时调整在线系统的相关策略,在各类内容投放,无线智能推送领域有大量的应用。

 

(五)流式计算框架对比

Storm是比较早的流式计算框架,后来有出现了Spark Streaming和Trident,现在又出现了Flink这种优秀的实时计算框架,那么这几种计算框架到底有什么不同呢,看下表的分析

 

工作中如何选择实时计算框架

  1. 需要关注流数据是否需要进行状态管理,如果是,那么只能在Trident,Spark Streaming和Flink中选择一个.
  2. 需要考虑项目对At-least-once(至少一次)或者Exactly-once(仅一次)消息投递模式是否有特殊要求,如果必须要保证仅一次,也不能选择Storm。
  3. 对于小型独立的项目,并且需要低延迟的场景,建议使用Storm,这样比较简单.
  4. 如果你的项目已经使用了Spark,并且秒级别的实时处理可以满足需求的话,建议使用Spark Streaming
  5. 要求消息投递语义为Exactly-once:数据量比较大,要求高吞吐低延迟;需要进行状态管理或窗口统计,这时建议使用Flink。

 

 

 

发布了74 篇原创文章 · 获赞 4 · 访问量 3168

猜你喜欢

转载自blog.csdn.net/u014635374/article/details/105676445