人工智能-机器学习

Flink基础教程

2021-12-14  本文已影响0人  yeedom

第 1 章 为何选择 Flink

图12:Flink的一个优势是,它拥有诸多重要的流式计算功能。其他项目为了实现这些功能,都不得不付出代价。比如,Storm实现了低延迟,但是在作者撰写本书时还做不到高吞吐,也不能在故障发生时准确地处理计算状态;SparkStreaming通过采用微批处理方法实现了高吞吐和容错性,但是牺牲了低延迟和实时处理能力,也不能使窗口与自然时间相匹配,并且表现力欠佳

image-20211122232358397

图14:Flink技术栈的核心组成部分。值得一提的是,Flink分别提供了面向流处理的接口(DataStreamAPI)和面向批处理的接口(DataSetAPI)。因此,Flink既可以完成流处理,也可以完成批处理。Flink支持的拓展库涉及机器学习(FlinkML)、复杂事件处理(CEP),以及图计算(Gelly),还有分别针对流处理和批处理的TableAPI

image-20211122232741300

布衣格电信

支持真正的流处理——通过上层的API和下层的执行引擎都能实时进行流处理,这满足了我们对可编程性和低延迟的需求。此外,使用Flink,我们的系统得以快速上线,这是其他任何一种方案都做不到的。如此一来,我们就有了更多的人手开发新的业务逻辑


第 2 章 流处理架构

消息传输层和流处理层

  1. 持续地将数据在应用程序和系统间移动;
  2. 聚合并处理事件;
  3. 在本地维持应用程序的状态

图21:Flink项目的架构有两个主要组成部分:消息传输层和由Flink提供的流处理层。消息传输层负责传输连续事件产生的消息,能够提供消息传输的系统包括KafkaMapRStreamsMapRStreamsMapR融合数据平台的一个主要组成部分,它兼容KafkaAPI

image-20211122232909671

第 3 章 Flink 的用途


第 4 章 对时间的处理

  1. 流即是流,不必人为地将它分割为文件;
  2. 时间的定义被明确地写入应用程序代码(如以上代码的时间窗口),而不是与摄取、计算和调度等过程牵扯不清
  1. 批处理只作为提高系统性能的机制。批量越大,系统的吞吐量就越大
  2. 为了提高性能而使用的批处理必须完全独立于定义窗口时所用的缓冲,或者为了保证容错性而提交的代码,也不能作为API的一部分。否则,系统将受到限制,并且变得脆弱且难以使用
  1. 事件时间,即事件实际发生的时间。更准确地说,每一个事件都有一个与它相关的时间戳,并且时间戳是数据记录的一部分(比如手机或者服务器的记录)。事件时间其实就是时间戳
  2. 处理时间,即事件被处理的时间。处理时间其实就是处理事件的机器所测量的时间

图4-4:事件时间顺序与处理时间顺序不一致的乱序事件流

image-20211122233224549

图45:一分钟滚动窗口计算最近一分钟的数值总和

image-20211122233254715

图46:一分钟滑动窗口每半分钟计算一次最近一分钟的数值总和

image-20211122233311245

图48展示了爱立信团队构建的数据管道

image-20211122233414911

第 5 章 有状态的计算

  1. 第4章讨论的所有类型的窗口。例如,计算过去一小时的平均温度,就是有状态的计算
  2. 所有用于复杂事件处理的状态机。例如,若在一分钟内收到两个相差20度以上的温度读数,则发出警告,这是有状态的计算
  3. 流与流之间的所有关联操作,以及流与静态表或动态表之间的关联操作,都是有状态的计算

图5-1:无状态流处理与有状态流处理的区别。输入记录由黑条表示。无状态流处理每次只转换一条输入记录,并且仅根据最新的输入记录输出结果(白条)。有状态流处理维护所有已处理记录的状态值,并根据每条新输入的记录更新状态,因此输出记录(灰条)反映的是综合考虑多个事件之后的结果

image-20211122233530992
  1. atmostonce:这其实是没有正确性保障的委婉说法——故障发生之后,计数结果可能丢失
  2. atleastonce:这表示计数结果可能大于正确值,但绝不会小于正确值。也就是说,计数程序在发生故障后可能多算,但是绝不会少算
  3. exactlyonce:这指的是系统保证在发生故障后得到的计数结果与正确值一致

图5-2:数环状项链上的珠子看上去毫无意义(甚至有些徒劳无功,因为可以永不停歇地计数),但是它可以用来很好地类比处理永不结束的事件流。在某些文化中,人们仍旧将数珠子视作消磨时间的好方法

image-20211122234207868

图5-3:程序的初始状态。注意,abc三组的初始计数状态都是0,即三个圆柱上的值。ckpt表示检查点屏障。每条记录在处理顺序上严格地遵守在检查点之前或之后的规定,例如["b",2]在检查点之前被处理,["a",2]则在检查点之后被处理

image-20211122234247467

图5-4:当Flink数据源(在本例中与keyBy算子内联)遇到检查点屏障时,它会将其在输入流中的位置保存到稳定存储中。这让Flink可以根据该位置重启输入

image-20211122234312979

图5-6:检查点操作完成,状态和位置均已备份到稳定存储中。输入流中的所有记录都已处理完成。值得注意的是,备份的状态值与实际的状态值是不同的。备份反映的是检查点的状态

image-20211122234341262

图5-9:手动触发的保存点(以圆圈表示)在不同时间捕获正在运行的Flink应用程序的状态

image-20211122234416989

图5-10:使用保存点更新Flink应用程序的版本。新版本可以从旧版本生成的一个保存点处开始执行

image-20211122234436610
  1. 应用程序代码升级
  2. Flink版本更新
  3. 维护和迁移
  4. 假设模拟与恢复
  5. A/B测试

图5-11:在该应用程序架构中,有状态的 Flink 应用程序消费来自消息队列的数据,然后将数据写入输出系统,以供查询 。底部的详情图展示 了 Flink 应用程序的内部情况

image-20211122234645910

图5-14:Yahoo!Streaming Benchmark 结果。横轴表示每秒的事件吞吐量,以千为单位。纵轴表示端到端的99百分位数延迟,以秒为单位。

在性能测评中,Spark Streaming 遇到了吞吐量和延迟性难两全的问题。随着批处理作业规模的增加,延迟升高。如果为了降低延迟而缩减规模,吞吐量就会减少。Storm 和 Flink 则可以在吞吐量增加时维持低延迟

image-20211122234709384

图5-16:使用高吞吐数据生成器的结果

  1. 当Storm 和 Kafka 一起使用时,应用程序可以保持每秒40万事件的处理速度,并且瓶颈在于 CPU
  2. 当 Flink 和 Kafka 一起使用时,应用程序可以保持每秒300万事件的处理速度,并且瓶颈在于网络
  3. 当消除网络瓶颈时,Flink 应用程序可以保持每秒1500万事件的处理速度
  4. 在额外的测试中,消除队列由 MapR Streams提供,并且采用10个高性能网络节点;Flink 应用程序可以保持每秒1000万事件的处理速度
image-20211122234906699

第 6 章 批处理:一种特殊的流处理

图64:分布式排序的处理阶段

image-20211122235314194

进一步使用 Flink

上一篇下一篇

猜你喜欢

热点阅读