流计算通用概念和Flink中的概念介绍

[toc]

通用的流式处理概念

流式处理和离线处理

USER_SCORES

存在一个 USER_SCORES 表,在批处理和流式处理中分别执行 SELECT 语句,区别如下:

  • 批处理一次返回最终结果
  • 流处理会随着数据进入引擎,不断的输出结果(设定5s的winow触发计算)
SQL

什么是流式计算

流式计算的特点:

  • 处理不断增长,理论上无限的数据集
  • 持续的进行数据的处理
Stream

流式计算中时间域(Time domain)的概念

时间域通常区分为:

  • 事件时间(Event Time),事件发生的时间
  • 处理时间(Processing Time),引擎处理事件的系统时间
Time Domain

流式处理需要在一个指定的时间域中计算,大部分场景关心 Event time(观测真实世界的时间),例如:描述用户随时间的行为、大多数计费应用程序以及许多类型的异常检测。

时间偏差(Skew)

理想情况 Event time 和 Processing time 是相等的。现实情况中由于网络环境、分布式逻辑等原因,Event time 和 Processing time 通常存在偏差,如下图:

Skew

虚线表示理想情况,红色线表示现实情况,理想与红线之间的水平距离是处理时间和事件时间之间的偏离

时间窗口(Time Window)

沿着时间边界将数据集分割成有限的片段,对一个时间窗口的数据进行计算。时间窗口的打开和关闭由窗口分配器指定。

常见的几种时间窗口:

  • Tumbling Windows(Time、Count)
  • Sliding Windows(Time、Count)
  • Session Windows
  • Global Window
Windows

Tumbling Time Windows

固定时间长度,不重叠的窗口

Tumbling

Sliding Time Windows

固定时间长度,重叠的窗口

Sliding

Session Windows

有特定模式(例如根据指定事件类型)指定窗口的开始和结束,不规则大小的窗口,窗口间的空隙称为 Session gap

Session

水印(Watermark)

水印是一种关于事件时间的完整性的描述。代表引擎处理的时间进度。是一个时间戳x。具有值X的水印声明:已经观察到所有事件时间小于X的输入数据。

事件有序的情况


In order

事件无序的情况

Out of order

延迟消息的情况

Delay

可允许延迟(Lateness)

表示可以容忍数据迟到的程度。小于时间值x的时间,可能在Watermark更新为x后到达。在lateness范围内的数据还会参与计算(再次计算Window),超过的会被丢弃。

Lateness

Flink中概念

Flink 架构和编程模型

架构可划分为以下几个部分和主要功能:

  • JobManager
    • ResourceManager
    • Dispatcher
    • JobMaster
  • TaskManager
    • Task Slots
  • Client
    • Submit
Program

Tasks & Operator Chains(Streaming Dataflow)

类似 Spark 中的 Stage 划分

根据代码生产 Streaming Dataflow

Streaming Dataflow

根据算子特性,通过 Operator chain 划分 Task

Operator chain

Streaming Dataflow in parallelized view

在并行的视图中(假设 Source 并行度为 2),逻辑上的 Task 会被划分为两个 SubTask

Parallelized

Task Slots

定义一个TaskManager可以接受多少个Task(SubTask)。多个 Task Slots 平分TM的内存(资源只有内存隔离,没有CPU隔离)

假设两个 TaskManager 各3个 Task Slot,运行上面的 Streaming Dataflow,每个 Task Slot 中运行一个 SubTask。

Task slot

Flink 允许多个 SubTask 共享一个 Slot,称为 Slot Sharing。当 Task/SubTask 很多时,没有足够的 Task Slot 保证一个 Task 占用一个 Task Slot 的情况。

Slot sharing

有状态流处理(Stateful Stream Processing)

Flink 中的状态涉及到有状态的操作、系统容错等功能

有状态的操作(Stateful Operations):

  • 应用程序搜索某些事件模式时,状态将存储到目前为止遇到的事件序列。
  • 当聚合每分钟/小时/天的事件时,状态会保存挂起的聚合。
  • 在数据流上训练机器学习模型时,状态保持模型参数的当前版本。
  • 当需要管理历史数据时,状态允许有效地访问过去发生的事件。

程序容错(Fault Tolerant):Checkpointing 算法

  • Checkpoint:运行时容错
  • Savepoint:重新启动、迁移、升级。Manyally triggered checkpoint

与状态存储(State Persistence)有关的相关概念分类

  • Key State vs. Operated State vs. Broadcast State
  • Raw State vs. Managed State
  • State TTL
  • State Backend:Memory、FileSystem、RocksDB
  • Queryable State(Beta)

Exactly Once vs. At Least Once

Flink 支持 Exactly-once 语义,针对的是应用内部的数据流处理(也就是State来说的)。

事件的处理可以发生多次,但是处理的结果只在持久化后端状态存储中反映一次,Flink 自身是无法保证端到端的 Exactly-once 语义的。所以基于Checkpoint重启处理,有些数据会重复处理(At Least once)

支持端到端的 Exactly-once:TwoPhaseCommitSinkFunction

Back Pressure

生成数据的速度大于算子消费的速度;

缓冲区(本地/远程)中的数据不能及时消费,数据进入缓冲区有阻塞。

Back Pressure

Back Pressure in Flink

通过定时采样(Sample Threads,由 JobManager 触发):间隔50ms触发100次采样(默认)。得到一个 Ratio(0.01表示100个中有一个被压:无法写入缓冲区)

  • OK: 0 <= Ratio <= 0.10
  • LOW: 0.10 < Ratio <= 0.5
  • HIGH: 0.5 < Ratio <= 1
Sample Threads

Back Pressure in Spark Streaming(1.5.x+)

每个 Batch 计算一个平均速率,发送给上游控制速度。

Dynamic Table & Continuous Queries(SQL)

静态表:常规的数据库中的表或批处理中的表等,其在查询时数据不再变化

动态表:是随时间变化的,即使是在查询的时候。流上的数据是源源不断的,一条数据的到来会触发一次查询,这次查询在执行时还有下一条数据到来,对表本身数据是在变化的。

对动态表的查询是连续的,即连续查询(Continuous Query)

简单的GROUP-BY Count聚合查询

对应着下文介绍的Update查询,这种方式需要更新之前已经发出的结果,包括INSERT和UPDATE两种改变。改变之前已经发出的结果意味着,这种查询需要维护更多的状态(state)数据;

Group By Count

带有窗口(window)的聚合查询

对应着下文介绍的Append查询,这种方式查询的结果都是以追加的形式加入到result表中,仅包含INSERT操作。这种方式生成的表和update生成的表转换成流的方式不一样(见下文)

Group by Window count

Dynamic Table to Stream

动态表转换为流或将其写入外部系统时,支持三种方法:

  • Append-only Stream(仅追加)
  • Retract Stream(回溯,undo-redo)
  • Upsert Stream(redo)

Retract Stream(回溯,undo-redo)

Retract

Upsert Stream(redo)

Upsert

Temporal Tables

Flink 1.13中改名 Versioned Table。可以提供历史某个时间点上的数据,在某些场景下可以避免重复计算。

有一个动态表 LatestRates

LatestRates

创建一个 Temporal Table Rate 记录 LatestRates 历史时间点上的数据。

Rate
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容

  • 介绍 概述 Apache Flink是一个面向数据流处理和批量数据处理的可分布式的开源计算框架,它基于同一个Fli...
    stephen_k阅读 50,798评论 0 22
  • 1. 程序和数据流 Flink程序构建的基本单元是stream和transformation(请注意,DataSe...
    郭寻抚阅读 14,957评论 0 10
  • Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时,...
    康小为6840阅读 1,191评论 0 7
  • 概述 2019 年是大数据实时计算领域最不平凡的一年,2019 年 1 月阿里巴巴 Blink (内部的 Flin...
    Yobhel阅读 1,841评论 0 33
  • 概述 2019 年是大数据实时计算领域最不平凡的一年,2019 年 1 月阿里巴巴 Blink (内部的 Flin...
    王知无阅读 3,242评论 2 11