Spark源码解析 - Spark-shell浅析
1.准备工作
1.1 安装spark,并配置spark-env.sh
使用spark-shell前需要安装spark,详情可以参考http://www.cnblogs.com/swordfall/p/7903678.html
如果只用一个节点,可以不用配置slaves文件,spark-env.sh文件只需配置为master_ip和local_ip两个属性
spark-env.sh添加如下配置:
export SPARK_MASTER_IP=hadoop1
export SPARK_LOCAL_IP=hadoop1
注意:hadoop1是这台虚拟机的ip地址,或者用127.0.0.1代替hadoop1也行。spark-shell浅析是基于spark-2.2.0-bin-hadoop2.7版本进行的。
1.2 启动spark-shell
输入spark安装目录的bin下,执行spark-shell命令
cd /opt/app/spark-2.2.0-bin-hadoop2.7/bin/
./spark-shell
最后我们会看到spark启动的过程,如图所示:

2. 执行word count 范例
通过word count例子来感受下spark任务的执行过程,启动spark-shell后,会打开scala命令行,然后按照以下步骤输入脚本。
1) 输入val lines = sc.textFile("../README.md", 2)

2) 输入val words = lines.flatMap(line => line.split(" "))

3) 输入val ones = words.map(w => (w, 1))

4) 输入val counts = ones.reduceByKey(_ + _)

5) 输入counts.foreach(println)

3. 剖析spark-shell
通过word count在spark-shell中执行的过程,看看spark-shell做了什么。spark-shell中有以下一段脚本

我们看到脚本spark-shell里执行了spark-submit脚本,打开spark-submit脚本,发现其中包含以下脚本:

脚本spark-submit在执行spark-class脚本时,给它增加了参数SparkSubmit。打开spark-class脚本,其中包含以下脚本:


读到这里,可知spark-class里面首先加载spark-env.sh里面的配置属性,然后获取jdk的java命令,接着拿到spark_home的jars目录。至此,Spark启动了以SparkSubmit为主类的jvm进程。
为便于在本地对Spark进程使用远程监控,给SPARK_HOME目录conf/spark-defaults.conf配置文件追加以下jmx配置:
#driver端监控
spark.driver.extraJavaOptions=-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port= -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false #executor端监控,暂时注释
#spark.executor.extraJavaOptions=-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port= -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
注意:使用远程监控前,如果spark-shell在运行中需要先停止,配置好监控参数,再需要运行spark-shell命令,否则jvisualvm找不到该线程。上面的两条命令都是一行的,不是两行,两行会导致jvisualvm连接不上,报“无法使用 service:jmx:rmi:///jndi/rmi://192.168.187.201:8009/jmxrmi 连接到 192.168.187.201:8009”错误。
在本地JAVA_HOME/bin目录下打开jvisualvm,添加远程主机,如图;右击已添加的远程主机,添加JMX连接,如图:


单击右侧的“线程”选项卡,选择main线程,然后单击“线程Dump”按钮,如图:
从dump的内容中找到线程main的信息,如图:

main线程dump信息


从main线程的栈信息中可以看出程序的调用顺序:SparkSubmit.main -> repl.Main -> ILoop.process。org.apache.spark.repl.SparkILoop类继承ILoop类,ILoop的process方法调用SparkILoop的loadFiles(settings)与printWelcome()方法。SparkILoop的loadFiles(settings)方法中又调用了自身的initializeSpark方法,initializeSpark的实现如下:

initializationCommands是一个命令集合,见代码:

从代码中可以看到,命令集合中会调用org.apache.spark.repl.Main的createSparkSession()方法创建或者获取sparkSession类,如图:

从上述代码可以看到builder是SparkSession里面的属性,IDEA工具使用“ctrl+鼠标点击”操作,可以进入到builder.getOrCreate()方法里面查看SparkSession如何创建,如图:

从上述代码可以看到SparkContext首先创建,再创建SparkSession。SparkContext的创建代码如下:

这里使用SparkConf、SparkContext和SparkSession来完成初始化,代码分析中涉及的repl主要用于与Spark实时交互。
4.Spark-shell的整体流程
至此,Spark-shell解析完毕。
参考资料:
《深入理解Spark核心思想与源码分析》
https://www.iteblog.com/archives/1349.html 使用jvisualvm监控Spark作业
Spark源码解析 - Spark-shell浅析的更多相关文章
- Spark 源码解析:TaskScheduler的任务提交和task最佳位置算法
上篇文章< Spark 源码解析 : DAGScheduler中的DAG划分与提交 >介绍了DAGScheduler的Stage划分算法. 本文继续分析Stage被封装成TaskSet, ...
- Spark 源码解析 : DAGScheduler中的DAG划分与提交
一.Spark 运行架构 Spark 运行架构如下图: 各个RDD之间存在着依赖关系,这些依赖关系形成有向无环图DAG,DAGScheduler对这些依赖关系形成的DAG,进行Stage划分,划分的规 ...
- Scala实战高手****第4课:零基础彻底实战Scala控制结构及Spark源码解析
1.环境搭建 基础环境配置 jdk+idea+maven+scala2.11.以上工具安装配置此处不再赘述. 2.源码导入 官网下载spark源码后解压到合适的项目目录下,打开idea,File-&g ...
- spark源码解析大全
第1章 Spark 整体概述 1.1 整体概念 Apache Spark 是一个开源的通用集群计算系统,它提供了 High-level 编程 API,支持 Scala.Java 和 Pytho ...
- Scala实战高手****第7课:零基础实战Scala面向对象编程及Spark源码解析
/** * 如果有这些语法的支持,我们说这门语言是支持面向对象的语言 * 其实真正面向对象的精髓是不是封装.继承.多态呢? * --->肯定不是,封装.继承.多态,只不过是支撑面向对象的 * 一 ...
- spark源码解析之基本概念
从两方面来阐述spark的组件,一个是宏观上,一个是微观上. 1. spark组件 要分析spark的源码,首先要了解spark是如何工作的.spark的组件: 了解其工作过程先要了解基本概念 官方罗 ...
- spark源码解析之scala基本语法
1. scala初识 spark由scala编写,要解析scala,首先要对scala有基本的了解. 1.1 class vs object A class is a blueprint for ob ...
- spark源码解析总结
========== Spark 通信架构 ========== 1.spark 一开始使用 akka 作为网络通信框架,spark 2.X 版本以后完全抛弃 akka,而使用 netty 作为新的网 ...
- Scala实战高手****第6课 :零基础实战Scala集合操作及Spark源码解析
本课内容1.Spark中Scala集合操作鉴赏2.Scala集合操作实战 --------------------------------------------------------------- ...
随机推荐
- NEW —— Code
http://ai.baidu.com/ 百度AI开放平台
- MT【304】反射路径长度比
(高考压轴题改编)如图,长方体$ABCD-A_1B_1C_1D_1$中,$AB=11,AD=7,AA_1=12.$一质点从顶点$A$设向$E(4,3,12)$遇到长方体的面反射(服从光的反射原理),将 ...
- Mysql 操作技巧
复制表结构 + 表数据Mysql> create tables t2 like t1;Mysql> insert into t2 select * from t1; mysql 索引a.A ...
- [luogu5003]跳舞的线【动态规划】
题目描述 线现在在一个地图上,它正在(1,1)上(左上角),最终要去到(M,N)上.它不但只能往下或往右走,还只能在整数格子上移动. Imakf有的时候想要炫技,又有时想偷懒,所以他会告诉你这张地图的 ...
- [2017-7-28]Android Learning Day7
View动画效果 透明动画效果 旋转动画效果 移动动画效果 缩放动画效果 混合动画效果 1.透明动画效果(AlphaAnimation) 有两种方法 第一种在活动中设置,不需要xml文件 public ...
- linux server 产生大量 Too many open files CLOSE_WAIT激增
情景描述:系统产生大量“Too many open files” 原因分析:在服务器与客户端通信过程中,因服务器发生了socket未关导致的closed_wait发生,致使监听port打开的句柄数到了 ...
- [luogu4626][一道水题2]
题目链接 思路 这个首先想到质因数分解.然后发现只要对于每个质数将ans乘以这个质数在从1到n中出现过的最高指数次就行了. 这个\(10^8\)令人发指.一直tle,最后发现吸口氧才能过.. 代码 # ...
- Django 配置数据库
Django提到配置那大多数都是在settings.py配置文件 在配置文件里的 DATABASES 内进行设置 # 数据库配置 DATABASES = { #连接mysql 'default': { ...
- Django(二十)model中的 class Meta
https://www.cnblogs.com/tongchengbin/p/7670927.html class Main(models.Model): img = models.CharField ...
- 第三十四节,目标检测之谷歌Object Detection API源码解析
我们在第三十二节,使用谷歌Object Detection API进行目标检测.训练新的模型(使用VOC 2012数据集)那一节我们介绍了如何使用谷歌Object Detection API进行目标检 ...
