Spark Streaming精进之前必须了解的基本概念

Spark 是一个快速的,多用途的计算系统。这是来自官网的自我介绍。一般敢自称系统的都是有两把刷子的,况且还是多用途的计算系统。 Spark 计算系统包含如下功能组件

Spark Core : Spark 的核心功能模块。

Spark SQL : 用于处理结构化数据。

MLlib :用于机器学习。

GraphX :用于图像处理。

Spark Streaming :用于处理实时数据流。

包含如此多的功能,自称多功能计算系统也是可以的。这篇文章帮大家梳理一下学习 Spark Streaming 过程中可能会让你产生困惑的基本概念。

RDD

Spark CoreSpark 的核心模块,这个模块提供了一个核心概念叫做 RDD (resilient distributed dataset)。你可以简单的把它理解成一个数据片段集合,你要处理的源数据文件可以分解成很多个 RDDSparkRDD 提供了两种类型的操作,一种是 transformations ,一种是 action

transformations :如果一个 RDD 经过某种操作之后,生成一个新的 RDD ,那么这个操作就是 transaction 的。比如, map , flatMap , filter 等。

action :对一个 RDD 进行计算操作,以生成某种结果,比如 reducecount 等操作。

注意:所有的 transformations 都是Lazy的,也就是说只有碰到 action 操作的时候才会执行前面的 transformations 操作。

DStream

Spark Streaming 是用来处理流式数据的,假设我们规定每隔一秒钟(通过duration设置)取一次数据,那么这段时间内积赞的数据就称为一个 batch ,里面的数据就用 DStream 表示。从编写代码的角度来看,你可以把 DStreamRDD 同等对待,因为他们的算子操作都是一样的。但是他们的数据结构还是有着本质不同的,我们可以把 DStream 简单的理解成是 RDD 加上了时间戳。如下图

DAG

Spark 使用 DAG 进行数据建模, DAG 被称为有向无环图,有向无环图的定义是这样的 “在图论中,如果一个有向图从任意顶点出发无法经过若干条边回到该点,则这个图是一个有向无环图(DAG,directed acyclic graph)”,我们通过一个简单的例子来感受一下, Spark 是如何使用 DAG 建模的。

下面的代码可以完成一段文本内容的各个单词的数量统计。

var textFile = sc.textFile(args[1]);
var result = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b);
result.saveAsTextFile(args[2]);

上面这段代码可以用下面这个图表示

这就是一个简单的 DAG 模型,数据按照方向流动,再也回不到原点。 Spark Streaming 将这个 DAG 模型,不断的应用到每一个 Batch 里面的数据中。大家可以把 DAG 模型理解成类,它是数据处理的模版,而每个 Batch 里面的数据就是不同的实例对象。

Job,Stage,Task

Spark 应用程序启动之后,我们会利用 Spark 提供的监控页面来查看程序的运行情况。在页面上会看到 JobStageTask 等内容展示,如果不理解他们代表什么意思,那么 Spark 好心好意提供的监控页面对我们来说就毫无意义。

下面给大家简单说一下这些概念到底什么意思,以及他们之间的关系。

先来看个图

从图中可以看出,一个 Application 被分解成多个 Job ,每个 Job 又分解成多个 StageStage 又会分解成多个 Task ,而 Task 是任务运行的最小单元,最终会被 Executor 执行。

Application:简单的说就是我们写的应用代码,启动起来之后就是一个 Application

Job:由 Sparkaction 算子触发。也就是每遇到一个 action 算子就会触发一个 Job 任务,这个时候就会执行前面的一系列 transformations 操作。

Stage: Job 任务会继续分解成 StageStage 是根据 DAG 的宽窄依赖来划分,也就是 RDD 之间的依赖关系。从后往前,每遇到一个宽依赖就划分为一个 Stage

宽依赖(Shuffle/Wide Dependency):父 RDD 的分区和子 RDD 的分区是一对多或者多对多的关系。比如 groupByKey , reduceByKey , join 等操作

窄依赖(Narrow Dependency):父 RDD 的分区和子 RDD 的分区的关系是一对一或者多对一的关系,比如 map , flatmap , filter 等操作。

宽窄依赖的定义可以用如下图,形象的展示。

拿文章开头的单词统计程序为例, Stage 划分情况应该是这样的。

task: Stage 包含很多 Task ,每个 Task 会执行 Stage 中包含的算子。

以上就是 Spark 精进之路上必须了解的基本概念,希望对各位有帮助。

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章