本文主要介绍了流式数据处理的使用场景、相关技术(flink),并从服务管理的角度,基于锋刃介绍了针对流式计算服务的服务目录设计及关键指标。主要面向的读者为希望了解流式计算、服务管理的朋友。
1.流式计算的使用场景
首先,当前业界已经有非常多数据处理的方式了,为什么还需要流式数据处理?要回答这个问题,我们先回顾一下传统的的数据处理架构。
传统的数据处理架构是一种典型的以数据库为中心,适应存储事务性数据处理的场景。由于数据处理能力优先,在该架构下,往往数据都是以批量的方式进行处理,例如:批量写入数据库、批量读取数据库进行数据处理。这种架构在面对实时性较低的场景中较为有效,但是在对实时性较高的场景则不太有效,例如:自动驾驶场景、工业机器人场景、基于会话的用户统计等。
![80d38591a758112edab4e16ac6d8dfa3.png](https://img-blog.csdnimg.cn/img_convert/80d38591a758112edab4e16ac6d8dfa3.png)
因此,流式计算或流式数据处理被提出。其实流处理它最接近数据产生的自然规律,只不过过去我们没有流处理能力,只能做一些特殊的处理才能真正地使用流数据,比如将流数据攒成批量数据再处理,不然无法进行大规模的计算。使用流数据并不新鲜,新鲜的是我们有了新技术,从而可以大规模、灵活、自然和低成本地使用它们。
流式处理的核心目标有以下三点:
- 低延迟:近实时的数据处理能力
- 高吞吐:能处理大批量的数据
- 可以容错:在数据计算有误的情况下,可容忍错误,且可更正错误
2.流处理框架
典型的流处理框架结合了消息传输层技术以及流处理层技术。具体如图所示:
![406cccca7c76e0183f8aa390858abff7.png](https://img-blog.csdnimg.cn/img_convert/406cccca7c76e0183f8aa390858abff7.png)
消息传输层的引入流处理层提供了以下支持:
- 消息传输层的一个作用是作为流处理层上游的安全队列,它相当于缓冲区,可以将事件数据作为短期数据保留起来,以防数据处理过程发生中断
- 具有持久性的好处之一是消息可以重播。实现时间穿梭
![41d187b42da342790849825ce7d6abae.png](https://img-blog.csdnimg.cn/img_convert/41d187b42da342790849825ce7d6abae.png)
- 生产者和消费者解耦
![e6c900d0cb3aee05c377c419db27945a.png](https://img-blog.csdnimg.cn/img_convert/e6c900d0cb3aee05c377c419db27945a.png)
在当前典型的流处理技术中,有这么几类:
- Lambda架构
基于Lambda架构,实现了离线计算的精确性的同时,且获得了流式数据处理的实时性。但是,由于要开发同样逻辑的代码,开发、维护成本高。
![bde2bdf158719a1e0ff324343a883509.png](https://img-blog.csdnimg.cn/img_convert/bde2bdf158719a1e0ff324343a883509.png)
- Kappa架构
为了解决lambda架构中维护两套同样逻辑的代码,kappa架构提出使用流式处理解决上述问题。当需要重新处理、计算数据时,使用另一个流程处理的作业(可以是相同的、优化的版本)进行数据处理。
![b3fb21716d13d511be4d5f98eea52801.png](https://img-blog.csdnimg.cn/img_convert/b3fb21716d13d511be4d5f98eea52801.png)
- spark streaming
基于小批量进行数据处理
- Flink
以上几种技术中,flink既可以实现低延迟、高吞吐,还可以实现容错。
![d7c08328d19c043a324c0c7efd2ab874.png](https://img-blog.csdnimg.cn/img_convert/d7c08328d19c043a324c0c7efd2ab874.png)
3.Flink概况
Flink技术除支持流处理外,还支持批处理,其架构如下图所示:
![ef56adc832fea2e34f3ef75856493aa8.png](https://img-blog.csdnimg.cn/img_convert/ef56adc832fea2e34f3ef75856493aa8.png)
另外,Flink具有分布式的特点,具体体现在它能够在成百上千台机器上运行,它将大型的计算任务分成许多小的部分,每个机器执行一个部分。Flink能够自动地确保在发生机器故障或者其他错误时计算能持续进行,或者在修复bug或进行版本升级后有计划地再执行一次。这种能力使得开发人员不需要担心失败。Flink本质上使用容错性数据流,这使得开发人员可以分析持续生成且永远不结束的数据(即流处理)。因为不用再在编写应用程序代码时考虑如何解决问题,所以工程师的时间得以充分利用,整个团队也因此受益。好处并不局限于缩短开发时间,随着灵活性的增加,团队整体的开发质量得到了提高,运维工作也变得更容易、更高效。Flink让应用程序在生产环境中获得良好的性能。
总体来说,Flink的主要特性:
- 符合产生数据的自然规律:支持流式数据处理
- 发生故障后仍保持准确:具体容错机制(exactly once)
- 及时给出所需结果:低延迟、实时性强
时间概念
在流数据处理的体系中,时间是一个重要的概念。总体来说,可分为以下三种时间:
- 事件时间:即事件实际发生的时间。更准确地说,每一个事件都有一个与它相关的时间戳,并且时间戳是数据记录的一部分(比如手机或者服务器的记录)。事件时间其实就是时间戳。处理时间,即事件被处理的时间。
- 处理时间:其实就是处理事件的机器所测量的时间
- 摄取时间:也叫作进入时间。它指的是事件进入流处理框架的时间
![7de834112d4e1b5270d9958bb00ca5ff.png](https://img-blog.csdnimg.cn/img_convert/7de834112d4e1b5270d9958bb00ca5ff.png)
Flink允许用户根据所需的语义和对准确性的要求选择采用事件时间、处理时间或摄取时间定义窗口
窗口
窗口是一种机制,它用于将许多事件按照时间或者其他特征分组,从而将每一组作为整体进行分析(比如求和)
![629fc41312a8af73a5b910eb52b58de8.png](https://img-blog.csdnimg.cn/img_convert/629fc41312a8af73a5b910eb52b58de8.png)
时间穿梭
流处理器支持事件时间,这意味着将数据流“倒带”,用同一组数据重新运行同样的程序,会得到相同的结果
水印
假设第一个窗口从10:00:00开始(即从10时0分0秒开始),需要计算从10:00:00到10:01:00的数值总和。当时间就是记录的一部分时,我们怎么知道10:01:00已到呢?换句话说,我们怎么知道盖有时间戳10:00:59的元素还没到呢?Flink通过水印来推进事件时间。水印是嵌在流中的常规记录,计算程序通过水印获知某个时间点已到。
有状态的计算
流式计算分为无状态和有状态两种情况。
- 无状态的计算观察每个独立事件,并根据最后一个事件输出结果。例如,流处理应用程序从传感器接收温度读数,并在温度超过90度时发出警告。
- 有状态的计算则会基于多个事件输出结果。
![a46a62adb9f50f4e672245eb2980b51b.png](https://img-blog.csdnimg.cn/img_convert/a46a62adb9f50f4e672245eb2980b51b.png)
数据处理容错及一致性保障
在有状态的数据处理中,如何保障数据的一致性是一个关键点。保障一致性的方式有以下三种:
- at most once:这其实是没有正确性保障的委婉说法——故障发生之后,计数结果可能丢失
- at least once:这表示计数结果可能大于正确值,但绝不会小于正确值。也就是说,计数程序在发生故障后可能多算,但是绝不会少算
- exactly once:这指的是系统保证在发生故障后得到的计数结果与正确值一致
Flink如何保证exactlyonce呢?它使用一种被称为“检查点”的特性,在出现故障时将系统重置回正确状态。
![57e10e210cbd24d34e3514032861bc0e.png](https://img-blog.csdnimg.cn/img_convert/57e10e210cbd24d34e3514032861bc0e.png)
![a8cfdd1f87bc6262a660f86ebc04cc6a.png](https://img-blog.csdnimg.cn/img_convert/a8cfdd1f87bc6262a660f86ebc04cc6a.png)
![7f4c94a9f508c34a1bb68ad67e9077b8.png](https://img-blog.csdnimg.cn/img_convert/7f4c94a9f508c34a1bb68ad67e9077b8.png)
![d961605c0195f5a59fc657d483bb596f.png](https://img-blog.csdnimg.cn/img_convert/d961605c0195f5a59fc657d483bb596f.png)
![c5dcd7fbd0958917cbe8a3dd9458540d.png](https://img-blog.csdnimg.cn/img_convert/c5dcd7fbd0958917cbe8a3dd9458540d.png)
![bfa716903a7e2ef574302ff28938aabe.png](https://img-blog.csdnimg.cn/img_convert/bfa716903a7e2ef574302ff28938aabe.png)
批处理
有限流处理是无限流处理的一种特殊情况,它只不过在某个时间点停止而已。此外,如果计算结果不在执行过程中连续生成,而仅在末尾处生成一次,那就是批处理(分批处理数据)
![87df0000cdc14da7df6e5322c4907f0a.png](https://img-blog.csdnimg.cn/img_convert/87df0000cdc14da7df6e5322c4907f0a.png)