开发者学堂课程【高校精品课-北京理工大学-大数据技术导论:大数据处理(三)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/857/detail/15612
大数据处理(三)
内容介绍:
一、spark 的运行原理
二、spark 的组件
一、spark 的运行原理
Spark 大数据处理框架,可以完成快速的大数据的处理,它的核心其中有一个很重要的概念,RDD 的概念。在提到spark 的时候,都会想到 RDD,RDD 的英文是 resilient Distributed dataset,RDD 是一个弹性的分布式的数据集。
弹性的分布式数据集是在 spark 框架下创建一个抽象的一个数据集的概念。这个数据集里面可以放很大量的数据,这个大量的数据,要分成不同的分片来存放,每个分片,都可以是一个完成计算的一个函数,RDD,它是由一组的分片,这个数据集是我们处理的一个基本的一个组成单元,一个计算,可以计算一个分片上的这个数据,RDD,还存在着一些个依赖关系,在 spark 框架里面,最开始从数据源取出来一些数据,把这些数据生成一个 RDD,这个 RDD里边包括很大量的数据,把这个 RDD,分成几个 partition 分成。包括很大量的数据,把这个 RDD,分成几个 partition,分成几个分片,分成一个 RDD 创建后,RDD 会经过一系列的处理步骤,中间转换成下一个 RDD,然后再转换成下一个RDD,从原始的 RDD 的一步一步的转换关系,形成了一个 RDD 的依赖关系,这个依赖关系叫做 lineage,也就是在spark里面叫做 RDD 的血统依赖关系。
对于 key-value 的 RDD 可以支持跨集群的分布式数据结构。一个 RDD 是一个只读的数据抽象的存储概念,把数据抽取出来之后,创建一个 RDD。并不能够对 RDD 里面的数据进行修改,它是一个抽象的一个数据集,数据放在这里,对这个 RDD 上的数据要进行一个转换,生成下一个 RDD的数据,但是并不能完成对这个 RDD 里面的某一个数据的修改,它是一个只读的一个存储的概念,可以根据数据记录里的 key 来对这个结构进行分区,RDD 的转换,可以支持一些个粗力度的 RDD 的转换操作,包括 join 等等都是支持分区的,我们可以按照分区来进行分批的数据的转换。所有的 RDD 里面的分区,都是存储在内存当中,使得我们的数据可以计算的比较快,每一个 RDD 是一个抽象的数据集合,数据集合经过一系列转换,可以转换成下一个数据集合,下一个集合再转换成下一个集合,这是 RDD 的一系列转换关系。
从这一张图里面,可以理解什么是 RDD,RDD 就是从数据源取得了一系列的数据,把它放在一个抽象的存储的数据结构里面,这样一个抽象的数据存储结构叫做弹性分布式数据集,这个数据集里面的 partition 可能是存储在一个数据集群的不同的节点上。但是从逻辑概念上就把它理解为一个统一的一个 RDD 抽象的数据集。
2.RDD 的 transforms 和 action
在 RDD 上可以进行的操作分为两大类,一个是 transformations 的操作转换操作,一个是 action 操作,从这张图可以看出来,
RDD 可以进行的转换操作,是可以进行多次转换的。从这张图可以看到,从第一个 RDD 经过一次转换,变成下一个RDD,然后第二个 RDD,再经过一系列转换,变成第三个,可以经过不同的转换,产生新的 RDD,直到所有的转换操作都完成。以后需要计算 RDD 最终的结果之前,要进行一个 action 操作来生成我们最终的 value。也就是转换操作可以有很多个,但是 action 操作只能有一个,而这个 action 操作是发生在最终的结果生成之前。
spark 有个特点,就是惰性机制。所谓的惰性机制,就是直到我们最终要需要这个结果之前,才进行这个结果的计算。而在需要结果之前的一系列步骤当中,都不去做计算这个操作,而只是进行转换的操作。从图可以看出来,RDB有两种操作,一个是转换,一个是执行,转换可以有很多很多个,但是执行只能有一个,而执行只能发生在最终要计算结果的之前。
spark 是基于 dag 图计算的一个机制,数据的计算中,所有的数据最开始都是从 HDFS 这个存储来取出来的,创建RDD 数据集,在这个图中有两个最初始创建的数据集,
一个是 RDDA,一个是 RDDC,RDDA 是从 HDFS 取出来的数据,RDDC 也是从 HDFS 取出来的大量的数据,生成了弹性分布式数据集抽象的数据存储概念,那么 A 这个 RDD 抽象数据存储,它中间有三个分片,这个三个分片可能存储在集群当中的三个不同的节点上。RDDC 也同样有三个分片存储在三个不同的数据节点上,从 RDDA 会经过一个转换操作变成 RDDB,RDDC 通过转换操作可以变成 RDDD。然后又通过一个转换操作,Reduce by key 这样一个操作变成了rd de,然后又通过了一个 join 操作,和 RDDB 生成了 RDDF。可以看成三个分区的长方形,那么它就是图的一个节点,那我们从节点 a 通过一个 map 操作到了节点 B,在节点 C 通过一个 map 操作到了节点D,然后节点D,通过reduce by key 这样一个操作变成了节点 E,然后节点 e 和节点 B一起 join 生成了节点F,节点F进行 action,这样的一个计算操作,把最终的生成的结果又存储回到 HDFS,永久性的硬盘存储当中,RDD 通过一系列的转换,这些个转换关系,就构成了 dag 图,从 a 到 BC 到 D 到 e,然后 B 和 e 一起,生成了 F,这就是 dag 图,spark 基本的计算就是基于这种 dag 图的机制,也就是从最初始生成的 RDD,通过一系列 dad 图当中的步骤的变换,生成最终的结果。
3.spark 架构
spark 它的运行的架构,在运行架构里,它的 dag 计算,RDD 计算是怎么完成的?看这张图,
当有一个应用程序要请求 spark 上的资源来进行计算的时候首先要创建一个 Driver program,driver program,会为每一个应用程序创建一个 spark context ,在应用程序运行的整个过程当中和计算资源来进行交互,完成 spark的计算任务。第一步,由 driver program,创建了一个 spark context spark contacts 会向 cluster manager 请求计算资源,请求计算节点。
Cluster manager 会向 worker node 节点去询问哪一个 worker node 可以完成目前的任务,当他找到了相关的worker node 可以支持目前的应用的计算任务的时候,spark context。就会直接和执行任务的 worker node 打交道,来发取任务和获取当前的执行状态。在具体的worker node里边,有一个 executor 负责专门的任务的执行,Execute就会和 smart context 进行交互,来传递要执行的任务。来获取任务目前执行的状态等等,
具体的在 spark contact 内部又完成了哪些任务,当客户端向 spark 提交一个请求,要完成某一个任务的计算的时候,driver 首先创建了一个 spark contact,在 spark context 创建了之后,Spark context 向 cluster 申请到 worker,也就是计算节点。得到了相关的计算节点之后,spark context 会首先为任务创建一个 RDD 的 dag,就是 RDD的抽象数据集。数据集的转换和计算有一系列的依赖关系要先把它创建出来,也就是 RDD 的 dag。创建数据集和数据集的转换关系,数据集转换依赖关系,以及最终的 action 计算关系。
当 dag 创建出来之后,会为这个 dag 安排一个 dag schedule,这个 schedule 是负责如何去执行创建的 dag 上的一个一个RDD 的任务,dag schedule 在创建之后,会和计算节点 worker 进行交互,将 dag 里边的一个一个的任务,发送给具体的工作的计算节点,由工作的计算节点的 execute 去完成由 dag schedule 发给他的这些个任务。在 dag schedule 再往后,会有一个 task schedule,一个 dag 会包括很多很多个 task,dag schedule会生成 task schedule,然后由task schedule,把任务具体的交给 execute 来完成。那么当任务在完成以后,也会通过 task schedule 获得到task完成的状态,task schedule 会把这个状态再返回给上一层的 dag schedule。然后 dag schedule 再返回 spark contact,这样spark context 就会知道相关的任务已经完成,最终我们整个 application 上的应用需要做的所有的任务,整个dat都完成。
所以这张图,是显示了一个用户向 spark 提交一个请求,请求收到以后由专。
请求收到以后由 driver program 为这个任务创建一个 spark contact spark context 会创建 RDD 的 dag 首先会创建要计算的,所有的 RDD 以及 RDD 的依赖关系,RDD 的依赖关系,就是由 dag 来表示,dag 要有一个 dag schedule来安排 dag 上的所有的节点的任务,Dag scholar 会创建一个 task schedule 来完成 dag 上面的一个一个的 task,这个 task 的具体是由 worker 来完成的,那会 task schedule 把 task 任务发给 execute ,execute 来进行任务的完成,当任务在执行过程当中以及完成之后,会把结果返回给 task schedule。Task schedule 就会向 dag schedule 汇报,汇报之后再汇报给spark context,这样 driver 和 spark context 了解到任务的执行过程以及任务的执行,结果完成后,就完成了这个 collect 提交的应用任务,这样的整个计算过程就完成了,这个是 spark 的架构里面的基本的工作原理。
二、spark 的组件
spark 比 hadoop 的优势在于它不仅仅适合单一的工作的处理,hadoop 是适合做单一的批量的处理,spark 可以适合更多的场景,spark 有 spark sql 这个组件,它可以完成传统的查询、统计、分析。有 spark sdreaming 这个组件可以完成数据流相关的任务,然后 spark 上有 machine learning MLIB 组件,它可以完成对大数据的利用机器学习算法来进行的完成的相关任务。spark 上面还有一个 graph X 组件,它可以完成大数据的图处理的相关的任务。
这四个组件会对应大数据处理的不同的业务场景的不同任务。这四个组件的完成任务时,都是构建在 APache spark core 这个核心的组件上,核心组件去支持上层的查询、统计、分析和流数据处理,还有机器学习任务以及图处理任务,
这一部分关于 spark,讲述了 spark 的来源,Spark 的历史,还讲述了 spark 的生态系统,中间很重要的一部分,spark 的运行原理,最后是 spark 相关的组件。