永不停息的智能服务:流式计算、数据处理及相关技术

2021-07-28 17:17:21 浏览数 (1)

点击蓝字

关注我们

#TSer#

时间序列知识整理系列,持续更新中 ⛳️

赶紧后台回复"讨论"加入讨论组交流吧 ?

在工业界,当我们提到实时数据机器学习时,常常可以听到如下讨论:

  • 他们希望有一个模型,这个模型利用最近历史信息来进行预测分析。举一个天气的例子,如果最近几天都是晴天,那么未来几天极小概率会出现雨雪和低温天气
  • 这个模型还需要是可更新的。当数据流经系统时,模型是可以随之进化升级。举个例子,随着业务规模的扩大,我们希望零售销售模型仍然保持准确。

实时机器学习应用是人工智能真正落地服务化的关键一步,因为工业界大部分场景下数据都是实时产生的。因此作为一名合格的人工智能领域专家,掌握流式场景下的算法设计必不可少。

本文主要介绍流式数据处理的使用场景、相关技术,并从服务管理的角度,介绍了针对流式计算服务的设计及关键指标。主要面向希望了解流式计算、服务管理的朋友们。

流式计算的使用场景

01

首先,当前业界已经有非常多数据处理的方式了,为什么还需要流式数据处理?要回答这个问题,我们先回顾一下传统的的数据处理架构。

传统的数据处理架构是一种典型的以数据库为中心,适应存储事务性数据处理的场景。由于数据处理能力优先,在该架构下,往往数据都是以批量的方式进行处理,例如:批量写入数据库、批量读取数据库进行数据处理。这种架构在面对实时性较低的场景中较为有效,但是在对实时性较高的场景则不太有效,例如:自动驾驶场景、工业机器人场景、基于会话的用户统计等。

因此,流式计算或流式数据处理被提出。其实流处理它最接近数据产生的自然规律,只不过过去我们没有流处理能力,只能做一些特殊的处理才能真正地使用流数据,比如将流数据攒成批量数据再处理,不然无法进行大规模的计算。使用流数据并不新鲜,新鲜的是我们有了新技术,从而可以大规模、灵活、自然和低成本地使用它们。

流式处理的核心目标有以下三点:

  • 低延迟:近实时的数据处理能力
  • 高吞吐:能处理大批量的数据
  • 可以容错:在数据计算有误的情况下,可容忍错误,且可更正错误

流式处理框架

02

典型的流处理框架结合了消息传输层技术以及流处理层技术。具体如图所示:

消息传输层的引入流处理层提供了以下支持:

  • 消息传输层的一个作用是作为流处理层上游的安全队列,它相当于缓冲区,可以将事件数据作为短期数据保留起来,以防数据处理过程发生中断
  • 具有持久性的好处之一是消息可以重播。实现时间穿梭

生产者和消费者解耦

在当前典型的流处理技术中,有这么几类:

Lambda架构

基于Lambda架构,实现了离线计算的精确性的同时,且获得了流式数据处理的实时性。但是,由于要开发同样逻辑的代码,开发、维护成本高

Kappa架构

为了解决lambda架构中维护两套同样逻辑的代码,kappa架构提出使用流式处理解决上述问题。当需要重新处理、计算数据时,使用另一个流程处理的作业(可以是相同的、优化的版本)进行数据处理。

spark streaming

基于小批量进行数据处理

Flink

以上几种技术中,flink既可以实现低延迟、高吞吐,还可以实现容错。

Flink概况

03

Flink技术除支持流处理外,还支持批处理,其架构如下图所示:

另外,Flink具有分布式的特点,具体体现在它能够在成百上千台机器上运行,它将大型的计算任务分成许多小的部分,每个机器执行一个部分。

Flink能够自动地确保在发生机器故障或者其他错误时计算能持续进行,或者在修复bug或进行版本升级后有计划地再执行一次。这种能力使得开发人员不需要担心失败。

Flink本质上使用容错性数据流,这使得开发人员可以分析持续生成且永远不结束的数据(即流处理)。因为不用再在编写应用程序代码时考虑如何解决问题,所以工程师的时间得以充分利用,整个团队也因此受益。好处并不局限于缩短开发时间,随着灵活性的增加,团队整体的开发质量得到了提高,运维工作也变得更容易、更高效。Flink让应用程序在生产环境中获得良好的性能。

总体来说,Flink的主要特性:

  • 符合产生数据的自然规律:支持流式数据处理
  • 发生故障后仍保持准确:具体容错机制(exactly once)
  • 及时给出所需结果:低延迟、实时性强

时间概念

在流数据处理的体系中,时间是一个重要的概念。总体来说,可分为以下三种时间:

  • 事件时间:即事件实际发生的时间。更准确地说,每一个事件都有一个与它相关的时间戳,并且时间戳是数据记录的一部分(比如手机或者服务器的记录)。事件时间其实就是时间戳。处理时间,即事件被处理的时间。
  • 处理时间:其实就是处理事件的机器所测量的时间
  • 摄取时间:也叫作进入时间。它指的是事件进入流处理框架的时间

Flink允许用户根据所需的语义和对准确性的要求选择采用事件时间、处理时间或摄取时间定义窗口

窗口

窗口是一种机制,它用于将许多事件按照时间或者其他特征分组,从而将每一组作为整体进行分析(比如求和)

时间穿梭

流处理器支持事件时间,这意味着将数据流“倒带”,用同一组数据重新运行同样的程序,会得到相同的结果

水印

假设第一个窗口从10:00:00开始(即从10时0分0秒开始),需要计算从10:00:00到10:01:00的数值总和。当时间就是记录的一部分时,我们怎么知道10:01:00已到呢?换句话说,我们怎么知道盖有时间戳10:00:59的元素还没到呢?Flink通过水印来推进事件时间。水印是嵌在流中的常规记录,计算程序通过水印获知某个时间点已到。

有状态的计算

流式计算分为无状态和有状态两种情况:

  • 无状态的计算观察每个独立事件,并根据最后一个事件输出结果。例如,流处理应用程序从传感器接收温度读数,并在温度超过90度时发出警告。
  • 有状态的计算则会基于多个事件输出结果。

数据处理容错及一致性保障

在有状态的数据处理中,如何保障数据的一致性是一个关键点。保障一致性的方式有以下三种:

  • at most once:这其实是没有正确性保障的委婉说法——故障发生之后,计数结果可能丢失
  • at least once:这表示计数结果可能大于正确值,但绝不会小于正确值。也就是说,计数程序在发生故障后可能多算,但是绝不会少算
  • exactly once:这指的是系统保证在发生故障后得到的计数结果与正确值一致

Flink如何保证exactlyonce呢?它使用一种被称为“检查点”的特性,在出现故障时将系统重置回正确状态。

批处理

有限流处理是无限流处理的一种特殊情况,它只不过在某个时间点停止而已。此外,如果计算结果不在执行过程中连续生成,而仅在末尾处生成一次,那就是批处理(分批处理数据)

0 人点赞