Spark架构与作业执行流程简介(scala版)

  在讲spark之前,不得不详细介绍一下RDD(Resilient Distributed Dataset),打开RDD的源码,一开始的介绍如此:

字面意思就是弹性分布式数据集,是spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。

Resilient:弹性的,它表示的是数据可以保存在磁盘,也可以保存在内存中

Distributed:它的数据分布式存储,并且可以做分布式的计算

Dataset:一个数据集,简单的理解为集合,用于存放数据的

事实上,关于RDD有5个特性,同样我们可以看看源码是怎么介绍这5个特性的:

  1. A list of partitions (每个RDD都有一个分区列表)
  2. A function for computing each split (作用在每个分区上面的函数)
  3. A list of dependencies on other RDDs (一个RDD依赖其他多个RDD,这个特性很重要,rdd的容错机制就是根据这个特性而来的)
  4. Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned) [可选项:针对于 kv 键值对的RDD才具有该分区特性]
  5. Optionally, a list of preferred locations to compute each split on (e.g. block locations foran HDFS file) [可选项 : 数据本地性,数据最优,选择尽量存储在worker节点上的数据节点。]

那么我们又如何更好的去理解这5个特性呢?

1)一组分片(Partition),即数据集的基本组成单位。

对于RDD来说,每个分片都会被一个计算任务处理,并决定并行计算的粒度。用户可  以在创建RDD时指定RDD的分片个数,如果没有指定,那么就会采用默认值。默认值  就是程序所分配到的CPU Core的数目。

2)一个计算每个分区的函数。

Spark中RDD的计算是以分片为单位的,每个RDD都会实现compute函数以达到这个目的。compute函数会对迭代器进行复合,不需要保存每次计算的结果。

3)RDD之间的依赖关系。

RDD的每次转换都会生成一个新的RDD,所以RDD之间就会形成类似于流水线一样的前后依赖关系。在部分分区数据丢失时,Spark可以通过这个依赖关系重新计算丢失的分区数据,而不是对RDD的所有分区进行重新计算。

4)一个Partitioner,即RDD的分片函数。

当前Spark中实现了两种类型的分片函数,一个是基于哈希的HashPartitioner,另外一个是基于范围的RangePartitioner。只有对于于key-value的RDD,才会有Partitioner, 非key-value的RDD的Parititioner的值是None。Partitioner函数不但决定了RDD本身的分片数量,也决定了parent RDD Shuffle输出时的分片数量。

5)一个列表,存储存取每个Partition的优先位置(preferred location)。

对于一个HDFS文件来说,这个列表保存的就是每个Partition所在的块的位置。按照“移动数据不如移动计算”的理念,Spark在进行任务调度的时候,会尽可能地将计算任务分配到其所要处理数据块的存储位置。

思考:为什么会产生RDD?

(1)    传统的MapReduce虽然具有自动容错、平衡负载和可拓展性的优点,但是其最大缺点是采用非循环式的数据流模型,使得在迭代计算式要进行大量的磁盘IO操作。RDD正是解决这一缺点的抽象方法

(2)     RDD是Spark提供的最重要的抽象的概念,它是一种有容错机制的特殊集合,可以分布在集群的节点上,以函数式编操作集合的方式,进行各种并行操作。可以将RDD理 解为一个具有容错机制的特殊集合,它提供了一种只读、只能有已存在的RDD变换而来的共享内存,然后将所有数据都加载到内存中,方便进行多次重用。

    a. 他是分布式的,可以分布在多台机器上,进行计算。

b. 他是弹性的,计算过程中内存不够时它会和磁盘进行数据交换。

c. 这些限制可以极大的降低自动容错开销

d. 实质是一种更为通用的迭代并行计算框架,用户可以显示的控制计算的中间结果,然后将其自由运用于之后的计算。

(3)    RDD的容错机制实现分布式数据集容错方法有两种:数据检查点和记录更新RDD

  采用记录更新的方式:记录所有更新点的成本很高。所以,RDD只支持粗  颗粒变换,即只记录单个块上执行的单个操作,然后创建某个RDD的变换序列(血统)存储下来;变换序列指,每个RDD都包含了他是如何由其他RDD变换过来的以及如何重建某一块数据的信息。因此RDD的容错机制又称“血统”容错。 要实现这种“血统”容错机制,最大的难题就是如何表达父RDD和子RDD之间的依赖关系。实际上依赖关系可以分两种,窄依赖和宽依赖:窄依赖:子RDD中的每个数据块只依赖于父RDD中对应的有限个固定的数据块;宽依赖:子RDD中的一个数据块可以依赖于父RDD中的所有数据块。

(4)RDD内部的设计每个RDD都需要包含以下四个部分:

    a. 源数据分割后的数据块,源代码中的splits变量

b. 关于“血统”的信息,源码中的dependencies变量

c. 一个计算函数(该RDD如何通过父RDD计算得到),源码中的iterator(split)和compute函数

d. 一些关于如何分块和数据存放位置的元信息,如源码中的partitioner和preferredLocations

原文地址:https://www.cnblogs.com/likemebee/p/spark.html

时间: 2024-11-08 17:42:22

Spark架构与作业执行流程简介(scala版)的相关文章

【转】Spark架构与作业执行流程简介

原文链接 http://www.cnblogs.com/shenh062326/p/3658543.html Spark架构与作业执行流程简介 Local模式 运行Spark最简单的方法是通过Local模式(即伪分布式模式). 运行命令为:./bin/run-example org.apache.spark.examples.SparkPi local 基于standalone的Spark架构与作业执行流程 Standalone模式下,集群启动时包括Master与Worker,其中Master负

步步深入:MySQL架构总览->查询执行流程->SQL解析顺序

前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序来探讨一下其中的知识. 一.MySQL架构总览: 架构最好看图,再配上必要的说明文字. 下图根据参考书籍中一图为原本,再在其上添加上了自己的理解. 从上图中我们可以看到,整个架构分为两层,上层是MySQLD的被称为的‘SQL Layer’,下层是各种各样对上提供接口的存储引擎,被称为‘Storage Engin

MySQL架构总览->查询执行流程->SQL解析顺序

前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序来探讨一下其中的知识. 一.MySQL架构总览: 架构最好看图,再配上必要的说明文字. 下图根据参考书籍中一图为原本,再在其上添加上了自己的理解. 从上图中我们可以看到,整个架构分为两层,上层是MySQLD的被称为的'SQL Layer',下层是各种各样对上提供接口的存储引擎,被称为'Storage Engin

spark(二):spark架构及物理执行图

上图是一个job的提交流程图,job提交的具体步骤如下 一旦有action,就会触发DagScheduler.runJob来提交任务,主要是先生成逻辑执行图DAG,然后调用 finalStage = newStage() 来划分 stage. new Stage() 的时候会调用 finalRDD 的 getParentStages(): getParentStages() 从 finalRDD 出发,反向 visit 逻辑执行图,遇到 NarrowDependency 就将依赖的 RDD 加入

Python之Django框架执行流程简介

我为大家简单阐述一下Django框架执行的大概流程. Django框架的执行流程    1.浏览器发送请求    2.服务器接收请求并将请求转发给Django框架    3.框架处理请求,如果是请求数据就去找model,如果请求时模版就去找template,然后将模板或数据读取并返回给服务器一个相应.    4.服务器再将相应转发给客户端 原文地址:https://www.cnblogs.com/chao666/p/12093912.html

【Spark机器学习速成宝典】基础篇01Windows下spark开发环境搭建+sbt+idea(Scala版)

注意: spark用2.1.1 scala用2.11.11 材料准备 spark安装包 JDK 8 IDEA开发工具 scala 2.11.8 (注:spark2.1.0环境于scala2.11环境开发,所以必须版本对应 scala不是必须安装的,如果你是打算使用scala进行spark开发,则需要安装 环境搭建步骤 将spark-2.1.1-bin-hadoop2.x版本至c盘下即可 将spark中的jar包全部提取出来另外放到一地方用于进行开发 新建IDEA项目,将所有jar包导入到IDEA

Spark架构解析(转)

Application: Application是创建了SparkContext实例对象的Spark用户,包含了Driver程序, Spark-shell是一个应用程序,因为spark-shell在启动的时候创建了一个SparkContext对象,其名称为sc,也就是说只要创建一个SparkContext就有对应的application,而一个action对应一个driver.相对应的transformation只产生元数据. Job: 和action相对应,每一个action例如count.s

Map/Reduce 工作机制分析 --- 作业的执行流程

前言 从运行我们的 Map/Reduce 程序,到结果的提交,Hadoop 平台其实做了很多事情. 那么 Hadoop 平台到底做了什么事情,让 Map/Reduce 程序可以如此 "轻易" 地实现分布式运行? Map/Reduce 任务执行总流程 经过之前的学习,我们已经知道一个 Map/Reduce 作业的总流程为: 代码编写  -->  作业配置  -->  作业提交  -->  Map任务的分配和执行  -->  处理中间结果(Shuffle)  --&

第九篇:Map/Reduce 工作机制分析 - 作业的执行流程

前言 从运行我们的 Map/Reduce 程序,到结果的提交,Hadoop 平台其实做了很多事情. 那么 Hadoop 平台到底做了什么事情,让 Map/Reduce 程序可以如此 "轻易" 地实现分布式运行? Map/Reduce 任务执行总流程 经过之前的学习,我们已经知道一个 Map/Reduce 作业的总流程为: 代码编写  -->  作业配置  -->  作业提交  -->  Map任务的分配和执行  -->  处理中间结果(Shuffle)  --&