Spark修炼之道(进阶篇)——Spark入门到精通:第七节 Spark运行原理

作者:周志湖
网名:摇摆少年梦
微信号:zhouzhihubeyond

本节主要内容

  1. Spark运行方式
  2. Spark运行原理解析

本节内容及部分图片来自:
http://blog.csdn.net/book_mmicky/article/details/25714419
http://blog.csdn.net/yirenboy/article/details/47441465
这两篇文件对Spark的运行架构原理进行了比较深入的讲解,写得非常好,建议大家认真看一下,在此向作者致敬!

1. Spark运行方式

用户编写完Spark应用程序之后,需要将应用程序提交到集群中运行,提交时使用脚本spark-submit进行,spark-submit可以带多种参数,参数选项可以通过下列命令查看

root@sparkmaster:/hadoopLearning/spark-1.5.0-bin-hadoop2.4/bin# ./spark-submit --help

可以看到,spark-submit提交参数如下:

./bin/spark-submit \
  --class <main-class>
  --master <master-url> \
  --deploy-mode <deploy-mode> \
  --conf <key>=<value> \
  ... # other options
  <application-jar> \
  [application-arguments]

下面介绍几种常用Spark应用程序提交方式:

(1)本地运行方式 –master local

//--master local,本地运行方式。读取文件可以采用本地文件系统也可采用HDFS,这里给出的例子是采用本地文件系统
//从本地文件系统读取文件file:/hadoopLearning/spark-1.5.0-bin-hadoop2.4/README.md
//生成的结果也保存到本地文件系统:file:/SparkWordCountResult
root@sparkmaster:/hadoopLearning/spark-1.5.0-bin-hadoop2.4/bin# ./spark-submit --master local
--class SparkWordCount --executor-memory 1g
/root/IdeaProjects/SparkWordCount/out/artifacts/SparkWordCount_jar/SparkWordCount.jar
file:/hadoopLearning/spark-1.5.0-bin-hadoop2.4/README.md
file:/SparkWordCountResult

(2)Standalone运行方式 –master spark://sparkmaster:7077

采用Spark自带的资源管理器进行集群资源管理

//standalone运行,指定--master spark://sparkmaster:7077
//采用本地文件系统,也可采用HDFS
//没有指定deploy-mode,默认为client deploy mode
root@sparkmaster:/hadoopLearning/spark-1.5.0-bin-hadoop2.4/bin#
./spark-submit --master spark://sparkmaster:7077
--class SparkWordCount --executor-memory 1g
/root/IdeaProjects/SparkWordCount/out/artifacts/SparkWordCount_jar/SparkWordCount.jar
file:/hadoopLearning/spark-1.5.0-bin-hadoop2.4/README.md
file:/SparkWordCountResult2


图片来源:http://blog.csdn.net/book_mmicky/article/details/25714419

在执行过程中,可以通过http://192.168.1.103:4040查看任务状态,192.168.1.103为sparkmaster IP地址:

也可以指定为cluster deploy mode,例如:

root@sparkmaster:/hadoopLearning/spark-1.5.0-bin-hadoop2.4/bin# ./spark-submit
--master spark://sparkmaster:7077
--deploy-mode cluster
--supervise --class SparkWordCount --executor-memory 1g
/root/IdeaProjects/SparkWordCount/out/artifacts/SparkWordCount_jar/SparkWordCount.jar
 file:/hadoopLearning/spark-1.5.0-bin-hadoop2.4/README.md
 file:/SparkWordCountResult3

与 clinet deploy mode不同的是 cluster deploy mode中的SparkContext在集群内部创建。

(3)Yarn运行方式

采用Yarn作为底层资源管理器

//Yarn Cluster
root@sparkmaster:/hadoopLearning/spark-1.5.0-bin-hadoop2.4/bin#
./spark-submit --master yarn-cluster
--class org.apache.spark.examples.SparkPi
--executor-memory 1g
/root/IdeaProjects/SparkWordCount/out/artifacts/SparkWordCount_jar/SparkWordCount.jar


图片来源:http://blog.csdn.net/yirenboy/article/details/47441465

//Yarn Client
root@sparkmaster:/hadoopLearning/spark-1.5.0-bin-hadoop2.4/bin#
./spark-submit --master yarn-client
--class org.apache.spark.examples.SparkPi
--executor-memory 1g
/root/IdeaProjects/SparkWordCount/out/artifacts/SparkWordCount_jar/SparkWordCount.jar


图片来源:http://blog.csdn.net/yirenboy/article/details/47441465

//Yarn Client运行效果图

2. Spark运行原理解析

(1)窄依赖与宽依赖

在前面讲的Spark编程模型当中,我们对RDD中的常用transformation与action 函数进行了讲解,我们提到RDD经过transformation操作后会生成新的RDD,前一个RDD与tranformation操作后的RDD构成了lineage关系,也即后一个RDD与前一个RDD存在一定的依赖关系,根据tranformation操作后RDD与父RDD中的分区对应关系,可以将依赖分为两种:宽依赖(wide dependency)和窄依赖(narrow dependency),如下图所示:

图中的实线空心矩形代表一个RDD,实线空心矩形中的带阴影的小矩形表示分区(partition)。从上图中可以看到, map,filter、union等transformation操作后的RDD仅依赖于父RDD的固定分区,它们是窄依赖的;而groupByKey后的RDD的分区与父RDD所有的分区都有依赖关系,此时它们就是宽依赖的。join操作存在两种情况,如果分区仅仅依赖于父RDD的某一分区,则是窄依赖的,否则就是宽依赖。

(2)Spark job运行原理

spark-submit提交Spark应用程序后,其执行流程如下:
1 创建SparkContext对象,然后SparkContext会向Clutser Manager(集群资源管理器),例如Yarn、Standalone、Mesos等申请资源
2 资源管理器在worker node上创建executor并分配资源(CPU、内存等),后期excutor会定时向资源管理器发送心跳信息
3 SparkContext启动DAGScheduler,将提交的作业(job)转换成若干Stage,各Stage构成DAG(Directed Acyclic Graph有向无环图),各个Stage包含若干相task,这些task的集合被称为TaskSet
4 TaskSet发送给TaskSet Scheduler,TaskSet Scheduler将Task发送给对应的Executor,同时SparkContext将应用程序代码发送到Executor,从而启动任务的执行
5 Executor执行Task,完成后释放相应的资源。

下图给出了DAGScheduler的工作原理:

当RDDG触发相应的action操作(如collect)后,DAGScheduler会根据程序中的transformation类型构造相应的DAG并生成相应的stage,所有窄依赖构成一个stage,而单个宽依赖会生成相应的stage。上图中的黑色矩形表示这些RDD被缓存过,因此上图中的只需要计算stage2、 stage3即可

前面我们提到各Stage由若干个task组成,这些task构建taskset,最终交给Task Scheduler进行调度,最终将task发送到executor上执行,如下图所示 。

(3)spark-Shell jobs调度演示

在spark-master上,启动spark-shell

root@sparkmaster:/hadoopLearning/spark-1.5.0-bin-hadoop2.4/bin#
./spark-shell --master spark://sparkmaster:7077
--executor-memory 1g

打开浏览器,输入: http://sparkmaster:4040/,并点击executors,可以查看集群中所有的executor,如下图所示

从图中可以看到sparkmaster除了是一个executor之外,它还是一个driver即(standalone clinet模式)

val rdd1= sc.textFile("/README.md")
.flatMap(line => line.split(" "))
.map(word => (word, 1))
.groupByKey().reduceByKey((a,b)=>a+b)

点击stage 1 对应的的map,查看该stage中对应的task信息及在对应的executor上的执行情况:

时间: 2024-07-28 18:16:25

Spark修炼之道(进阶篇)——Spark入门到精通:第七节 Spark运行原理的相关文章

Spark修炼之道(进阶篇)——Spark入门到精通:第一节 Spark 1.5.0集群搭建

作者:周志湖 网名:摇摆少年梦 微信号:zhouzhihubeyond 本节主要内容 操作系统环境准备 Hadoop 2.4.1集群搭建 Spark 1.5.0 集群部署 注:在利用CentOS 6.5操作系统安装spark 1.5集群过程中,本人发现Hadoop 2.4.1集群可以顺利搭建,但在Spark 1.5.0集群启动时出现了问题(可能原因是64位操作系统原因,源码需要重新编译,但本人没经过测试),经本人测试在ubuntu 10.04 操作系统上可以顺利成功搭建.大家可以利用CentOS

Spark修炼之道(进阶篇)——Spark入门到精通:第九节 Spark SQL运行流程解析

1.整体运行流程 使用下列代码对SparkSQL流程进行分析,让大家明白LogicalPlan的几种状态,理解SparkSQL整体执行流程 // sc is an existing SparkContext. val sqlContext = new org.apache.spark.sql.SQLContext(sc) // this is used to implicitly convert an RDD to a DataFrame. import sqlContext.implicits

Scala入门到精通——第七节:类和对象(二)

本节主要内容 单例对象 伴生对象与伴生类 apply方法 应用程序对象 抽象类 单例对象 在某些应用场景下,我们可能不需要创建对象,而是想直接调用方法,但是Scala语言并不支持静态成员,Scala通过单例对象来解决该问题.单例对象的创建方式如下: object Student { private var studentNo:Int=0; def uniqueStudentNo()={ studentNo+=1 studentNo } def main(args: Array[String]):

Spark修炼之道系列教程预告

课程内容 Spark修炼之道(基础篇)--Linux基础(15讲).Akka分布式编程(8讲) Spark修炼之道(进阶篇)--Spark入门到精通(30讲) Spark修炼之道(实战篇)--Spark应用开发实战篇(20讲) Spark修炼之道(高级篇)--Spark源码解析(50讲) 部分内容会在实际编写时动态调整,或补充.或删除. Spark修炼之道(基础篇)--Linux大数据开发基础(15讲). Linux大数据开发基础--第一节:Ubuntu Linux安装与介绍 Linux大数据开

Spark修炼之道——Spark学习路线、课程大纲

课程内容 Spark修炼之道(基础篇)--Linux基础(15讲).Akka分布式编程(8讲) Spark修炼之道(进阶篇)--Spark入门到精通(30讲) Spark修炼之道(实战篇)--Spark应用开发实战篇(20讲) Spark修炼之道(高级篇)--Spark源码解析(50讲) 部分内容会在实际编写时动态调整,或补充.或删除. Spark修炼之道(基础篇)--Linux大数据开发基础(15讲). Linux大数据开发基础--第一节:Ubuntu Linux安装与介绍 Linux大数据开

Spark修炼之道(进阶篇)——Spark入门到精通:第十二节 Spark Streaming—— DStream Window操作

作者:周志湖 微信号:zhouzhihubeyond 本节主要内容 Window Operation 入门案例 1. Window Operation Spark Streaming提供窗口操作(Window Operation),如下图所示: 上图中,红色实线表示窗口当前的滑动位置,虚线表示前一次窗口位置,窗口每滑动一次,落在该窗口中的RDD被一起同时处理,生成一个窗口DStream(windowed DStream),窗口操作需要设置两个参数: (1)窗口长度(window length),

Spark修炼之道(进阶篇)——Spark入门到精通:第八节 Spark SQL与DataFrame(一)

本节主要内宾 Spark SQL简介 DataFrame 1. Spark SQL简介 Spark SQL是Spark的五大核心模块之一,用于在Spark平台之上处理结构化数据,利用Spark SQL可以构建大数据平台上的数据仓库,它具有如下特点: (1)能够无缝地将SQL语句集成到Spark应用程序当中 (2)统一的数据访问方式 DataFrames and SQL provide a common way to access a variety of data sources, includ

Spark修炼之道(进阶篇)——Spark入门到精通:第三节 Spark Intellij IDEA开发环境搭建

作者:周志湖 网名:摇摆少年梦 微信号:zhouzhihubeyond 本节主要内容 Intellij IDEA 14.1.4开发环境配置 Spark应用程序开发 1. Intellij IDEA 14.1.4开发环境配置 Intellij IDEA 功能十分强大,能够开发JAVA.Scala等相关应用程序,在依赖管理 智能提示等方面做到了极致,大家可以到:http://www.jetbrains.com/idea/download/下载,目前有两种:Ultimate Edition Free

Spark修炼之道(基础篇)——Linux大数据开发基础:第六节:vi、vim编辑器(二)

本节主要内容 缓冲区的使用 文件的存盘与读盘 文本查找 文本替换 作者:周志湖 微信号:zhouzhihubeyond 网名:摇摆少年梦 1. 缓冲区的使用 在利用vim进行文本编辑时,编辑修改后的文本不会立即保存到硬盘上,而是保存在缓冲区中,如果没有把缓冲区里的文件存盘,原始文件不会被更改.vim在打开文件时将文本内容读到缓冲区中,在进行文本编辑时,修改的文本保存在缓冲区,此时硬盘上的原文件不变.下面让我们来演示一下缓冲区的使用. 假设采用vim 同时打开两个文本文件: root@ubuntu