写点什么

大数据计算生态之数据计算(一)

用户头像
小舰
关注
发布于: 2021 年 04 月 03 日
大数据计算生态之数据计算(一)

大数据计算发展至今,已经形成了一个百花齐放的大数据生态,通用计算、定制开发,批量处理、实时计算,关系查询、图遍历以及机器学习等等,我们都可以找到各种对应的计算引擎来协助我们处理这些任务。本系列文章拟以大数据平台从低到高的层次为主线,梳理整个大数据计算生态组件及其功能。

在[

小舰:大数据计算生态之数据存储​zhuanlan.zhihu.com


]中介绍了存储层中的各个存储组件的分类及功能。有了数据之后,各个应用就可以利用这些数据进行不同维度或角度的分析,从而形成不同的数据价值产品。支撑这一过程最重要的就是计算引擎。

计算层是整个大数据计算生态的核心,计算引擎为各个数据任务提供算力支持。本文将详细介绍计算层的各个计算引擎。

目前可以大致把计算引擎分为批处理、流处理和即席(Ad-Hoc)查询和图查询四类。

批处理指的是大规模复杂的数据处理过程,通常的时间跨度在几分钟到数小时甚至数日;流处理指的是实时的数据处理和查询,通常的时间跨度在数百毫秒到数秒之间;即席(Ad-Hoc)查询指的是介于实时和批处理之间的一种查询处理,如一些交互式的数据探查任务,需要秒级或分钟级的较快的响应时间。图查询是基于图模型进行的数据查询,图查询涉及到更多的是迭代类的操作,常见的图算法如路径搜索算法、中心性算法以及社群发现算法等,这些算法在公安系统和银行金融领域中的打击犯罪团伙、金融欺诈、信用卡盗刷等领域有着重要的应用。


一、批处理

目前,在批处理领域,使用最多的计算引擎当属 HadoopMR 和 Spark 两者。HadoopMR 是最早的批处理引擎,是根据 Google 的”三驾马车“实现的开源计算框架,主要是解决海量数据的计算问题。由于 HadoopMR 在处理效率上的一系列问题,Spark 应运而生,Spark 针对 Hadoop MR2.0 存在的问题,对 MapReduce 做了大量优化。

1.MapReduce(Hadoop)

MapReduce 就是指我们常说的 Hadoop MapReduce,它是一个批处理计算引擎。每个 MapReduce 任务都包含两个过程:Map 过程和 Reduce 过程。



MapReduce 的计算模型:Map 和 Reduce 两个计算过程(中间用 Shuffle 串联),MapReduce 程序。

- - Map 阶段:多台机器同时读取一个文件的各个部分,分别统计词频,产生多个 Map 集合;

- - Reduce 阶段:接收所对应的 Map 集合结果,将相同键的集合汇总,进而得到整个文件的词频结果;

MapReduce 的缺点是每个 map 阶段结束时,都需要将中间结果写到磁盘,reduce 阶段继续从磁盘读取数据进行下一步的处理。这个过程会产生大量的数据 I/O,导致处理效率比较低。


2. Spark

与 Hadoop MapReduce 不同的是,Spark 是基于内存的批处理计算引擎。SparkSpark 及其组件已经形成了一个大数据生态,Spark 基于这个引擎,提供了很多的高级应用模块解决不同场景中的业务需求。Spark 分为 Spark Core、SparkSQL、SparkStreaming、GraphX 以及 MLLib 等,SparkCore 为 Spark 的核心和基础,提供基本的批处理功能,其他的每个组件专注于不同的处理任务。



Spark Core:Spark Core 包含 Spark 的基本功能,如内存计算、任务调度、部署模式、故障恢复、存储管理等。Spark 建立在统一的抽象 RDD 之上,使其可以以基本一致的方式应对不同的大数据处理场景;通常所说的 Apache Spark,就是指 Spark Core;

Spark SQL:Spark SQL 允许开发人员直接处理 RDD,同时也可查询 Hive、HBase 等外部数据源。Spark SQL 的一个重要特点是其能够统一处理关系表和 RDD,使得开发人员可以轻松地使用 SQL 命令进行查询,并进行更复杂的数据分析;

Spark Streaming:Spark Streaming 支持高吞吐量、可容错处理的实时流数据处理,其核心思路是将流式计算分解成一系列短小的批处理作业。Spark Streaming 支持多种数据输入源,如 Kafka、Flume 和 TCP 套接字等;

MLlib(机器学习):MLlib 提供了常用机器学习算法的实现,包括聚类、分类、回归、协同过滤等,降低了机器学习的门槛,开发人员只要具备一定的理论知识就能进行机器学习的工作;

GraphX(图计算):GraphX 是 Spark 中用于图计算的 API,可认为是 Pregel 在 Spark 上的重写及优化,Graphx 性能良好,拥有丰富的功能和运算符,能在海量数据上自如地运行复杂的图算法。

Spark 与 Hadoop 相比主要有且不限于以下几个优势:

(1)减少磁盘 I/O

Hadoop 的的 map 和 reduce 过程每此处理都要涉及读写磁盘,map 端的中间结果也要排序并写入磁盘,reduce 从磁盘中进行读取;这样整个处理过程中磁盘 I/O 就成了处理瓶颈;Spark 允许将 map 端的中间结果放入内存,reduce 直接从内存中拉取数据,避免了大量的磁盘 I/O。

(2)提高并行度

MapReduce 的并行度是进程级别,Spark 是线程级别;MapReduce 需要进行磁盘的 map 写入,reduce 读取,属于串行执行;spark 把不同环节抽象为 stage,允许多个 stage 串行执行或并行执行。

(3)避免重复计算

Spark 中通过 DAG(有向无环图)来串起数据处理的各个 Stage 阶段,如果某个阶段发生故障或者数据丢失,可以利用血缘机制来回溯某个 RDD,从而减少数据的重新计算,提高效率。

从以上我们看到 Spark 对 Hadoop MR 存在的问题都进行了优化,从而提升了数据处理的效率。根据 Spark 官方提供的性能对比数据,Spark 性能比 Hadoop 高出 120 倍。



通过上图简单的一个 wordCount 统计的例子,可以大致了解 Spark 进行数据处理的流程,体会 Spark 的 pipeline 管道计算模式的优势。


二、流处理

Spark 的 Spark Streaming 和 Storm 是比较早的流计算框架,随着流计算技术的发展,Storm 逐渐被遗弃,Flink 作为一匹流计算的黑马得到了业界的广泛应用。Spark Streaming 也依靠 Spark 生态生存了下来。但是面对 Spark Streaming 对于 Flink 表现出的不足,从 Spark 2.3 开始,Structured Streaming 引入了低延迟的持续流处理模式,这时候已经不再采用批处理引擎,而是一种类似 Flink 机制的持续处理引擎,可以达到端到端最低 1ms 的延迟。


1.Storm

Storm 是 Twitter 开源的分布式实时大数据处理框架,被业界称为实时版 Hadoop。Apache Storm 从一端读取实时数据的原始流,并将其传递通过一系列小处理单元,并在另一端输出处理/有用的信息。

在 Storm 中,需要先设计一个实时计算结构,也就是拓扑(topology)。这个拓扑结构会被提交给集群,其中主节点(master node)负责给工作节点(worker node)分配代码,工作节点负责执行代码。在一个拓扑结构中,包含 spout 和 bolt 两种角色。数据在 spouts 之间传递,这些 spouts 将数据流以 tuple 元组的形式发送;而 bolt 则负责转换数据流。



下图描述了 Apache Storm 的核心概念。



2.Spark Streaming

Spark Streaming 属于 Spark 的一个组件,是基于批的流式计算框架,支持 Kafka、Flume 及简单的 TCP 套接字等多种数据输入源,输入流接收器(Reciever)负责接入数据。DStream 是 SparkStreaming 中的数据流抽象,它也可以被组织为 DStreamGraph。Dstream 本质上由一系列连续的 RDD 组成。

Spark Streaming,即核心 Spark API 的扩展,不像 Storm 那样一次处理一个数据流。相反,它在处理数据流之前,会按照时间间隔对数据流进行分段切分。Spark 针对连续数据流的抽象,我们称为 DStream(Discretized Stream)。

DStream 是小批处理的 RDD(弹性分布式数据集), RDD 则是分布式数据集,可以通过任意函数和滑动数据窗口(窗口计算)进行转换,实现并行操作。


3.Flink

Flink 是一个面向数据流处理和批量数据处理的可分布式的开源计算框架,它基于同一个 Flink 流式执行模型(streaming execution model),能够支持流处理和批处理两种应用类型。

Flink 最核心的数据结构是 Stream,它代表一个运行在多分区上的并行流。


在 Stream 上同样可以进行各种转换操作(Transformation)。与 Spark 的 RDD 不同的是,Stream 代表一个数据流而不是静态数据的集合。所以,它包含的数据是随着时间增长而变化的。而且 Stream 上的转换操作都是逐条进行的,即每当有新的数据进来,整个流程都会被执行并更新结果。这样的基本处理模式决定了 Flink 会比 Spark Streaming 有更低的流处理延迟性。当一个 Flink 程序被执行的时候,它会被映射为 Streaming Dataflow,上图就是一个 Streaming Dataflow。

  1. Structured Streaming

Spark 2.0 引入了 Structured Streaming, 将微批次处理从高级 API 中解耦出去。它简化了 API 的使用,API 不再负责进行微批次处理;开发者可以将流看成是一个没有边界的表,并基于这些“表”运行查询。Structured Streaming 的默认引擎基于微批处理引擎,并且可以达到最低 100ms 的延迟和数据处理的 exactly-once 保证。采用何种处理模式只需要进行简单的模式配置即可。

Structured Streaming 定义了无界表的概念,即每个流的数据源从逻辑上来说看做一个不断增长的动态表(无界表),从数据源不断流入的每个数据项可以看作为新的一行数据追加到动态表中。用户可以通过静态结构化数据的批处理查询方式(SQL 查询),对数据进行实时查询。

Structured Streaming 通过不同的触发模式来实现不同的延迟级别和一致性语义。主要提供了以下四种触发模式:

  • 单次触发:顾名思义就是只触发一次执行,类似于 Flink 的批处理;

  • 周期性触发:查询以微批处理模式执行,微批执行将以用户指定的时间间隔来进行;

  • 默认触发:一个批次执行结束立即执行下个批次;

  • 连续处理:是 Structured Streaming 从 2.3 开始提出的新的模式,对标的就是 Flink 的流处理模式,该模式支持传入一个参数,传入参数为 checkpoint 间隔,也就是连续处理引擎每隔多久记录查询的进度;


发布于: 2021 年 04 月 03 日阅读数: 21
用户头像

小舰

关注

公众号:DLab数据实验室 2020.11.12 加入

中国人民大学硕士

评论

发布
暂无评论
大数据计算生态之数据计算(一)