Flink学习笔记(一)——初识Flink

2,379 阅读3分钟

记录

 最近参与了一个重构项目,其中统计模块之前是用定时任务去批量跑出结果在写入数据库中,由于数据量的积累,定时任务的执行时间从之前的几分钟到了现在的几个小时甚至十几个小时,最终导致大量任务堆积,久久不能出现统计结果,这对运营团队在实际使用中产生了极大的不便,因此亟需一个能实时计算大量数据的工具。上面拍板调研Flink在咱们项目的使用场景是否适用,因此对于大数据极感兴趣的我主动请命来进行这个调研工作(虽然之前根本没接触过!)特记录此次调研学习的过程,便于后面的归纳理解。

什么是Flink

 对于小白的我来说可能最先需要了解的就是Flink到底是什么?

Flink全称:Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算,并同时提供支持流处理和批处理两种类型应用的功能。

 简单来说这就是很厉害的大数据处理框架!那么它厉害在哪里呢?

  1. 支持高吞吐、低延迟,高性能的流处理
  2. 支持带有事件事件窗口操作
  3. 支持有状态计算的exactly-onece语义
  4. 支持高度灵活的window操作
  5. 支持具有轻量级分布式快照实现的容错
  6. 一个运行同时支持batch on streaming和streaming处理
  7. flink在jvm内部实现了自己的内存管理
  8. 支持迭代计算

 .... 对比图

Flink的基础架构

架构图

  • Flink Program
    • 用户开发分用于计算任务的代码会被flink解析,生成一个Dataflow graph 简称DAG(一种有向无环图) 通过client会把这个DAG提交到JobManager
  • Job Manager
    • 负责管理和协调所有计算节点和计算任务,client和web控制台也是通过JobManager来提交和管理每个计算任务
  • Task Manager
    • 计算节点,每一个节点就是一个java进程,负责执行计算任务,计算任务被放在TaskSlot中,每个TaskSlot就是一个执行单元,运行在TaskManager进程中,数据从SourceTask中流入,进入这个DAG,每经过一个Task,数据就会在这个Task做一些计算和变换,然后数据继续流向下一个Task,直到最后一个Sink Task流出DAG,完成所有计算。

Flink组件栈

  • Deployment层
    • 主要涉及了Flink的部署模式,Flink支持多种部署模式:本地部署、集群部署(Standalone/YARN)、云(GCE/EC2)
  • Runtime层
    • Runtime层提供了支持Flink计算的全部核心实现,比如:支持分布式stream处理,JobGraph到ExecutionGraph的映射、调度等等,为上层API层提供基础服务
  • API层
    • API层主要实现了面向无解stream的流处理和面向batch的批处理API,其中面向流处理对应DataStream API,面向批处理对应DataSet API
  • Libaries层
    • 在API层之上构建的满足特定应用的实现计算框架,也分别对应于面向流处理和面向批处理类
    • 面向流处理支持:CEP(复杂事件处理)、基于SQL-like的操作(基于Table的关系操作)
    • 面向批处理支持:FlinkML(机器学习库)、Gelly(图处理)

未完待续。。。