Flink学习 - 1. Flink基本介绍

  • Flink
  • Flink的具体优势
  • API支持
  • 整合支持
  • 架构
  • Deploy层
  • Runtime层
  • API层
  • Libraries层
  • Flink 程序与数据流结构



 

Flink

Flink是一个能够用于对有界数据流及无解数据流进行有状态计算的分布式计算框架。

传统的流处理和批处理是完全不同的应用类型,因为他们所提供的SLA是完全不同的:流处理一般需要支持低延迟、Exactly-once保证,而批处理一般需要支持高吞吐、高效处理;

传统的批处理方案有MapReduce、Tez、Crunch、Spark;流处理方案有Samza、Storm。

Flink在实现流处理和批处理时,与传统的一些方案完全不同,它从另一个视角看待流处理和批处理,将二者统一起来:Flink是完全支持流处理,也就是说作为流处理看待时输入数据流是无界的;批处理被作为一种特殊的流处理,只是它的输入数据流被定义成有界的。基于同一Flink运行时(Flink Runtime),分别提供了流处理和批处理的API,而这两种API也是实现上层面向流处理、批处理类型应用框架的基础。

Flink 通过实现Google Dataflow 流式计算模型实现了高吞吐、低延迟、高性能间距实时流式计算框架。同时Flink支持高度容错的状态管理,防止状态在计算过程中因为系统异常而出现丢失,Flink周期性地通过分布式快照技术CheckPoints 实现状态的持久化维护,使得即使在系统停机或者异常的情况下都能计算出正确的结果。

python flink 开发 flink -p_flink

Flink的具体优势

  1. 同时支持高吞吐、低延迟、高性能
  2. 支持事件事件(Event Time)概念
  3. 支持有状态计算
  4. 支持高度灵活的窗口(Window)操作
  5. 基于轻量级分布式快照(Snapshot)实现的容错
  6. 基于JVM实现独立的内存管理
  7. Save Points(保存点)
  8. 支持具有Backpressure功能的持续流模型
  9. 支持迭代计算
  10. 支持程序自动优化:避免特定情况下shuffle、排序等昂贵操作,中间结果必须要进行缓存

API支持

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WCCAoySn-1578647338208)(http://note.youdao.com/yws/res/21924/A24328DD9B15417DAAEE32F63052B805)]

  1. DataStream API
  2. DataSet API
  3. Table API && SQL

整合支持

Flink 支持本地运行、能在独立集群或者在被 YARN 或 Mesos 管理的集群上运行, 也能部署在云上

  1. 支持Flink on YARN
  2. 支持HDFS
  3. 支持来自Kafka的输入数据
  4. 支持Apache HBase
  5. 支持Hadoop程序
  6. 支持Tachyon
  7. 支持ElasticSearch
  8. 支持RabbitMQ
  9. 支持Apache Storm
  10. 支持S3
  11. 支持XtreemFS

架构

Flink是一个分层的架构系统,不同层的栈建立在其下层基础上,并且各层所包含的组件都提供了特定的抽象用来服务上层组件。

python flink 开发 flink -p_python flink 开发_02

Deploy层

该层主要涉及了Flink的部署模式,Flink支持多种部署模式:本地、集群(Standalone/YARN)、云(GCE/EC2)。

Flink On Yarn模式:
流程图大致如下:

python flink 开发 flink -p_流处理_03

  1. flink-client将任务提交到yarn,会将所有依赖的jar和config等温江上传到hdfs中
  2. 向resourceManager申请资源,Resourcemanager中主要包含两部分:applicationManager和resourceScheduler
  3. ApplicationManager启动ApplicationMaster,ResourceScheduler分配运行ApplicationMaster所需要的Container。
  4. 在ApplicationMaster上启动Flink的JobManager,并采用轮询的方式通过RPC想ResourceManager申请资源
  5. RsourceManager接收到请求后,会分配相应的Container去将来启动TaskManager,并从hdfs上下载相应的jar和config。
  6. ApplicationMater 要求相应的Container启动任务。
  7. 至此相应的JobManager和TaskManager启动完成。

Runtime层

Runtime层提供了支持Flink计算的全部核心实现,如:

  • 支持分布式stream处理
  • JobGraph到ExecutionGraph的映射、调度等,为上层API层提供基础服务。
  • 运行时层以JobGraph的形式来接收程序,JobGraph即为一个一般化的并行数据流图(data flow),它拥有任意数量的Task来接收和产生datastream。

API层

API层主要实现了流处理(DataStream API)和批处理(DataSet API)的API.

Libraries层

该层也可以称为Flink应用框架层,根据API层的划分,在API层之上构建的满足特定应用的实现计算框架,也分别对应于面向流处理和面向批处理两类。

  • 面向流处理支持:CEP(复杂事件处理)、基于SQL-like的操作(基于Table的关系操作);
  • 面向批处理支持:FlinkML(机器学习库)、Gelly(图处理)。

Flink 程序与数据流结构

摘自 Flink 从 0 到 1 学习 —— Apache Flink 介绍

python flink 开发 flink -p_批处理_04

Flink 应用程序结构就是如上图所示:

1、Source: 数据源,Flink 在流处理和批处理上的 source 大概有 4 类:基于本地集合的 source、基于文件的 source、基于网络套接字的 source、自定义的 source。自定义的 source 常见的有 Apache kafka、Amazon Kinesis Streams、RabbitMQ、Twitter Streaming API、Apache NiFi 等,当然你也可以定义自己的 source。

2、Transformation:数据转换的各种操作,有 Map / FlatMap / Filter / KeyBy / Reduce / Fold / Aggregations / Window / WindowAll / Union / Window join / Split / Select / Project 等,操作很多,可以将数据转换计算成你想要的数据。

3、Sink:接收器,Flink 将转换计算后的数据发送的地点 ,你可能需要存储下来,Flink 常见的 Sink 大概有如下几类:写入文件、打印出来、写入 socket 、自定义的 sink 。自定义的 sink 常见的有 Apache kafka、RabbitMQ、MySQL、ElasticSearch、Apache Cassandra、Hadoop FileSystem 等,同理你也可以定义自己的 sink。