Flink

1. 概述

1.1 Apache Flink

Apache Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行状态计算。

1.2 特点

  1. 支持事件时间(event-time)和处理时间(processing-time)语义
  2. 精确一次(exactly-once)的状态一致性保证
  3. 低延迟,每秒处理数百万个事件,毫秒级延迟
  4. 与众多常用存储系统的连接
  5. 高可用,动态扩展,实现7*24小时全天候运行

1.3 Flink VS Spark Streaming

  • 数据模型
  1. spark采用RDD模型,spark streaming 的 DStream 实际上也就是一组组小批数据RDD的集合
  2. flink基态数据模型是数据流,以及事件(Event)序列
  • 运行时架构
  1. spark 是批计算,将DAG划分为不同的stage,一个完成后才可以计算下一个
  2. flink是标准的流执行模式,一个事件在一个节点处理完后可以直接发往下一个节点进行处理

2. 安装与部署

2. Flink运行时的组件

在这里插入图片描述

2.1 作业管理器(JobManager)

  • 控制一个应用程序执行的主进程,也就是说,每个应用程序都会被一个不同的JobManager所控制执行
  • JobManager会先接收要执行的应用程序,这个应用程序会包括:作业图(JopGraph)、逻辑数据流图(Logical dataflow graph)和打包了所有类、库和其他资源的JAR包
  • JobManager会把JopGraph转换成一个物理层面的数据流图,这个图被叫做"执行图"(ExecutionGraph),包含了所有可以并发执行的任务
  • JobManager会向资源管理器(ResourceManager)请求执行任务必要的资源,也就是任务管理器(TaskManager)上的插槽(slot)。一旦它获取到了足够的资源,就会将执行图分发到真正运行它们的TaskManager上。而在运行过程中,JobManager会负责所有需要中央协调的操作,比如说检查点(checkpoints)的协调.

2.2 任务管理器(TaskManager)

  • Flink中的工作进程。通常在Flink中会有多个TaskManager运行,每一个TaskManager都包含了一定数量的插槽((slots)。插槽的数量限制了TaskManager能够执行的任务数量。
  • 启动之后,TaskManager会向资源管理器注册它的插槽;收到资源管理器的指令后,TaskManager就会将一个或者多个插槽提供给
    JobManager调用。JobManager就可以向插槽分配任务(tasks)来执行了。
  • 在执行过程中,一个TaskManager可以跟其它运行同一应用程序的
    TaskManager交换数据。

2.3 资源管理器(ResourceManager)

  • 主要负责管理任务管理器(TaskManager)的插槽(slot),TaskManger插槽是Flink中定义的处理资源单元。
  • Flink为不同的环境和资源管理工具提供了不同资源管理器,比如YARN、Mesos、K8s,以及standalone部署。
  • 当JobManager申请插槽资源时,ResourceManager会将有空闲插槽的TaskManager分配给JobManager。如果ResourceManager没有足够的插槽来满足JobManager的请求,它还可以向资源提供平台发起会话,以提供启动TaskManager进程的容器。

2.4 分发器(Dispatcher)

  • 可以跨作业运行,它为应用提交提供了REST接口。
  • 当一个应用被提交执行时,分发器就会启动并将应用移交给一个JobManager。
  • Dispatcher也会启动一个Web UI,用来方便地展示和监控作业执行的信息。
  • Dispatcher在架构中可能并不是必需的,这取决于应用提交运行的方式。

3. 任务提交流程

在这里插入图片描述

4. Flink API

4.1 不用级别的抽象

Flink提供了四种不同层级的API。低级API,核心API,Table API,SQL

在这里插入图片描述

  • Flink API 最底层的抽象为有状态实时流处理。其抽象实现是 Process Function,并且 Process Function 被 Flink 框架集成到了 DataStream API 中来为我们使用。自由度最高,从而允许程序可以实现复杂计算。

  • Flink API 第二层抽象是 Core APIs。Core APIs 提供的流式 API(Fluent API)为数据处理提供了通用的模块组件,例如各种形式的用户自定义转换(transformations)、联接(joins)、聚合(aggregations)、窗口(windows)和状态(state)操作等。此层 API 中处理的数据类型在每种编程语言中都有其对应的类。

  • Flink API 第三层抽象是 Table API。Table API 是以表(Table)为中心的声明式编程(DSL)API,例如在流式数据场景下,它可以表示一张正在动态改变的表。
    表和 DataStream/DataSet 可以进行无缝切换,Flink 允许用户在编写应用程序时将 Table API 与 DataStream/DataSet API 混合使用。

  • Flink API 最顶层抽象是 SQL。这层抽象在语义和程序表达式上都类似于 Table API,但是其程序实现都是 SQL 查询表达式。SQL 抽象与 Table API 抽象之间的关联是非常紧密的,并且 SQL 查询语句可以在 Table API 中定义的表上执行。

4.2 常用DataStream API

Flink DataStream的常用API(主要分为三块):DataSource(程序的数据源输入),Transformation(具体的操作),Sink(程序的输出)

4.2.1 Flink针对DataStream提供了大量的已经实现的DataSource (数据源)接口

  1. 基于文件: readTextFile (path)读取文本文件,文件遵循Text InputFormat逐行读取规则并返回。
  2. 基于Socket: socketTextStream从Sokcet中读取数据,元素可以通过一个分隔符分开
  3. 基于集合: fromCollection (Collection)通过Java的Collection集合创建一个数据流,集合中的所有元素必须是相同类型的。
  4. 自定义输入: addSource可以实现读取第三方数据源的数据。

4.2.2 Flink针对DataStream提供了大量的已经实现的算子

4.2.2.1 Map

DataStream → DataStream
输入一个元素,然后返回一个元素,中间可以进行清洗转换等操作。
在这里插入图片描述

4.2.2.2 Flatmap

DataStream → DataStream
输入一个元素,可以返回零个,一个或者多个元素
在这里插入图片描述

4.2.2.3 Filter

DataStream → DataStream
过滤函数,对传入的数据进行判断,符合条件的数据会被留下。
在这里插入图片描述

4.2.2.4 KeyBy

DataStream → DataStream
根据指定的Key进行分组,Key相同的数据会进入同一个分区。
在这里插入图片描述

4.2.2.5 Reduce/Aggregations

KeyedStream → DataStream

在这里插入图片描述

4.2.2.6 union

DataStream → DataStream
在这里插入图片描述

4.2.27 旁路输出

DataStream → DataStream
在这里插入图片描述

4.2.2.8 window/WindowAll
  • KeyedStream → WindowedStream

  • DataStream → AllWindowedStream

Sliding Windows滑动窗口(time/count):

  • 每次滑动window slide的距离, 并获取window size范围内的数据进行处理
    在这里插入图片描述

Tumbling Windows滚动窗口(time/count): (滚动窗口是window size = widow slide的滑动窗口)

  • 每次获取window size范围内的数据进行处理
    在这里插入图片描述
4.2.2.8 Window有序消费
  • 场景: Window基于 EventTime 统计, 需要既实时统计, 又需要保障数据准确性

  • 问题: Window基于 EventTime 而不是 OperateTime 计算时, Flink会丢弃延时数据

Watermark(水印):

  • 缺点: 降低吞吐量(缓存历史窗口数据), 仅能处理允许延时范围内的数据, 迟到严重数据依然会被丢弃

  • 窗口按 EventTime 计算后, 划分每个窗口开始,结束时间点; 按读取到消息被标记上的Watermark判断是否超过结束时间点触发统计

  • Watermark 标记规则: 例: 窗口结束时间-2秒 -> 允许消息延迟2秒

Allowed Lateness(允许迟到机制):

  • 将延迟过于严重的数据输出到侧输出流, 侧输出流存储或进行特殊处理
4.2.2.9 RichAsyncFunction(外部数据访问的异步 I/O)

在这里插入图片描述

实现数据库(或键/值存储)的异步 I/O 交互需要支持异步请求的数据库客户端。许多主流数据库都提供了这样的客户端。
如果没有这样的客户端,可以通过创建多个客户端并使用线程池处理同步调用的方法,将同步客户端转换为有限并发的客户端。
然而,这种方法通常比正规的异步客户端效率低。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值