环境:
spark 2.3.3
scala 2.11.8
Java 1.8.0_141
接上篇【 spark-shell启动命令详细解析1】
下面我们来看下org.apache.spark.repl.Main是如何处理spark-shell中输入的命令的
在org.apache.spark.repl.Main$main方法中,调用doMain方法
通过doMain方法,调用SparkILoop$process方法
SparkILoop是spark交互式shell,继承自ILoop,ILoop是scala的交互式shell。
那scala既然有自己的交换式shell,spark为啥还要再自己实现一个SparkILoop呢?
在Spark的原始论文中有简单提到:
Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing.
由于spark是分布式集群,spark-shell中的代码需要序列化到不同的节点
6.1 Interpreter Integration
SparkILoop直接使用ILoop的process方法
调用SparkILoop的loadFiles方法
在loadFiles方法中,会调用SparkILoop的initializeSpark方法,进行spark/sparkContext的初始化
而initializationCommands变量中存放的就是spark/sparkContext的初始化语句
这些日志即spark-shell启动中的日志:
调用SparkILoop的printWelcome方法:
就是spark-shell启动过程中的欢迎信息
然后调用loop方法,读取一行代码处理