博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spark源码解析(一) —— Spark-shell浅析
阅读量:4090 次
发布时间:2019-05-25

本文共 2785 字,大约阅读时间需要 9 分钟。

1.准备工作

1.1 安装spark,并配置spark-env.sh

使用spark-shell前需要安装spark,详情可以参考

如果只用一个节点,可以不用配置slaves文件,spark-env.sh文件只需配置为master_ip和local_ip两个属性

spark-env.sh添加如下配置:

export SPARK_MASTER_IP=hadoop1export 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=10207 -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=0 -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作业

转载地址:http://rkcii.baihongyu.com/

你可能感兴趣的文章
15 万个监控摄像头被黑,医院、学校、监狱都被看得一清二楚!
查看>>
防止酒后删库!日本人用 3 小时做了个酒精测试软件
查看>>
97.16%的加班率,给你3倍工资:你愿意去大厂吗?
查看>>
为什么那么多程序员不敢学Python?
查看>>
左手代码,右手带娃,还能发十几篇 paper,程序员女神是如何炼成的?
查看>>
你以为的90% AI 难点,其实都搞错了!正确的学习方式是这些!
查看>>
专访:持续学习收获万名铁粉,看新晋博主如何学习编程
查看>>
“提离职后老板要给我加薪,我应该留下吗?”
查看>>
从Python到AI,这条路好走吗?
查看>>
程序员靠接外包,6个月当了老板,这操作绝了...
查看>>
Python怎么学?数据分析、人工智能、爬虫又该怎么学?一文总结
查看>>
程序员,大晚上不回家你干啥呢???
查看>>
谷歌低调了 5 年的 Fuchsia OS,终于有望面世了!
查看>>
“30以上不配转行”:大龄转行,还来得及吗?
查看>>
进退两难的硅谷程序员们
查看>>
Python入门从哪开始?学习路线是这样的!
查看>>
微信,知道你所有的秘密
查看>>
招行人均年薪65万:想要涨薪,你需要知道这3点
查看>>
乔布斯18岁求职信拍卖价22.24万美元,值吗?
查看>>
为何程序员总喜欢写技术博客,看完恍然大悟...
查看>>