【Spark2.0源码学习】-2.一切从脚本说起
2017-08-22 23:58
381 查看
从脚本说起
在看源码之前,我们一般会看相关脚本了解其初始化信息以及Bootstrap类,Spark也不例外,而Spark我们启动三端使用的脚本如下:
%SPARK_HOME%/sbin/start-master.sh
%SPARK_HOME%/sbin/start-slaves.sh
%SPARK_HOME%/sbin/start-all.sh
%SPARK_HOME%/bin/spark-submit
三端启动脚本中对于公共处理部分进行抽取为独立的脚本,如下:
接下来针对于一些重要的脚本进行一一描述
一. start-daemon.sh
主要完成进程相关基本信息初始化,然后调用bin/spark-class进行守护进程启动,该脚本是创建端点的通用脚本,三端各自脚本都会调用spark-daemon.sh脚本启动各自进程
初始化 SPRK_HOME,SPARK_CONF_DIR,SPARK_IDENT_STRING,SPARK_LOG_DIR环境变量(如果不存在)
初始化日志并测试日志文件夹读写权限,初始化PID目录并校验PID信息
调用/bin/spark-class脚本,/bin/spark-class见下
二. bin/spark-class
master调用举例:bin/spark-class --class org.apache.spark.deploy.master.Master --host $SPARK_MASTER_HOST --port $SPARK_MASTER_PORT --webui-port $SPARK_MASTER_WEBUI_PORT $ORIGINAL_ARGS
初始化 RUNNER(java),SPARK_JARS_DIR(%SPARK_HOME%/jars),LAUNCH_CLASSPATH信息
调用( "$RUNNER" -Xmx128m -cp "$LAUNCH_CLASSPATH" org.apache.spark.launcher.Main "$@")获取最终执行的shell语句
执行最终的shell语句(比如:/opt/jdk1.7.0_79/bin/java -cp /opt/spark-2.1.0/conf/:/opt/spark-2.1.0/jars/*:/opt/hadoop-2.6.4/etc/hadoop/ -Xmx1g -XX:MaxPermSize=256m org.apache.spark.deploy.master.Master --host zqh --port 7077 --webui-port
8080),如果是Client,那么可能为r,或者python脚本
三. start-master.sh
启动Master的脚本,流程如下:
用户执行start-master.sh脚本,初始化环境变量SPARK_HOME (如果PATH不存在SPARK_HOME,初始化脚本的上级目录为SPARK_HOME),调用spark-config.sh,调用load-spark-env.sh
如果环境变量SPARK_MASTER_HOST, SPARK_MASTER_PORT,SPARK_MASTER_WEBUI_PORT不存在,进行初始化7077,hostname -f,8080
调用spark-daemon.sh脚本启动master进程(spark-daemon.sh start org.apache.spark.deploy.master.Master 1 --host $SPARK_MASTER_HOST --port $SPARK_MASTER_PORT --webui-port $SPARK_MASTER_WEBUI_PORT $ORIGINAL_ARGS)
四. start-slaves.sh
启动Worker的脚本,流程如下:
用户执行start-slaves.sh脚本,初始化环境变量SPARK_HOME,调用spark-config.sh,调用load-spark-env.sh,初始化Master host/port信息,
调用slaves.sh脚本,读取conf/slaves文件并遍历,通过ssh连接到对应slave节点,启动 ${SPARK_HOME}/sbin/start-slave.sh spark://$SPARK_MASTER_HOST:$SPARK_MASTER_PORT
start-slave.sh在各个节点中,初始化环境变量SPARK_HOME,调用spark-config.sh,调用load-spark-env.sh,根据$SPARK_WORKER_INSTANCES计算WEBUI_PORT端口(worker端口号依次递增 )并启动Worker进程(${SPARK_HOME}/sbin /spark-daemon.sh start org.apache.spark.deploy.worker.Worker $WORKER_NUM
--webui-port "$WEBUI_PORT" $PORT_FLAG $PORT_NUM $MASTER "$@")
五. start-all.sh
属于快捷脚本,内部调用start-master.sh与start-slaves.sh脚本,并无额外工作
六.bin/spark-submit
任务提交的基本脚本,流程如下:
直接调用spark-class脚本进行进程创建(./spark-submit --class org.apache.spark.examples.SparkPi --master spark://zqh:7077 ../examples/jars/spark-examples_2.11-2.1.0.jar 10)
如果是java/scala任务,那么最终调用SparkSubmit.scala进行任务处理(/opt/jdk1.7.0_79/bin/java -cp /opt/spark-2.1.0/conf/:/opt/spark-2.1.0/jars/*:/opt/hadoop-2.6.4/etc/hadoop/ -Xmx1g -XX:MaxPermSize=256m org.apache.spark.deploy.SparkSubmit --master
spark://zqh:7077 --class org.apache.spark.examples.SparkPi ../examples/jars/spark-examples_2.11-2.1.0.jar 10)
七.总结
三端在的脚本主要进行多方面抽取,使代码更加精炼
公共的环境变量由spark-config.sh,bin/load-spark-env.sh进行统一的处理
扩在由conf/spark-env.sh进行配置读取实现
守护进程由spark-daemon.sh进行创建,进行相关的log,pid前置处理
spark-class.sh是公共的处理入口脚本
Main.java负责对参数的解析组装
最后执行组装好的command,其中支持scala/java/python/r
在看源码之前,我们一般会看相关脚本了解其初始化信息以及Bootstrap类,Spark也不例外,而Spark我们启动三端使用的脚本如下:
%SPARK_HOME%/sbin/start-master.sh
%SPARK_HOME%/sbin/start-slaves.sh
%SPARK_HOME%/sbin/start-all.sh
%SPARK_HOME%/bin/spark-submit
三端启动脚本中对于公共处理部分进行抽取为独立的脚本,如下:
spark-config.sh | 初始化环境变量 SPARK_CONF_DIR, PYTHONPATH |
bin/load-spark-env.sh | 初始化环境变量SPARK_SCALA_VERSION, 调用%SPARK_HOME%/conf/spark-env.sh加载用户自定义环境变量 |
conf/spark-env.sh | 用户自定义配置 |
接下来针对于一些重要的脚本进行一一描述
一. start-daemon.sh
主要完成进程相关基本信息初始化,然后调用bin/spark-class进行守护进程启动,该脚本是创建端点的通用脚本,三端各自脚本都会调用spark-daemon.sh脚本启动各自进程
初始化 SPRK_HOME,SPARK_CONF_DIR,SPARK_IDENT_STRING,SPARK_LOG_DIR环境变量(如果不存在)
初始化日志并测试日志文件夹读写权限,初始化PID目录并校验PID信息
调用/bin/spark-class脚本,/bin/spark-class见下
二. bin/spark-class
master调用举例:bin/spark-class --class org.apache.spark.deploy.master.Master --host $SPARK_MASTER_HOST --port $SPARK_MASTER_PORT --webui-port $SPARK_MASTER_WEBUI_PORT $ORIGINAL_ARGS
初始化 RUNNER(java),SPARK_JARS_DIR(%SPARK_HOME%/jars),LAUNCH_CLASSPATH信息
调用( "$RUNNER" -Xmx128m -cp "$LAUNCH_CLASSPATH" org.apache.spark.launcher.Main "$@")获取最终执行的shell语句
执行最终的shell语句(比如:/opt/jdk1.7.0_79/bin/java -cp /opt/spark-2.1.0/conf/:/opt/spark-2.1.0/jars/*:/opt/hadoop-2.6.4/etc/hadoop/ -Xmx1g -XX:MaxPermSize=256m org.apache.spark.deploy.master.Master --host zqh --port 7077 --webui-port
8080),如果是Client,那么可能为r,或者python脚本
三. start-master.sh
启动Master的脚本,流程如下:
用户执行start-master.sh脚本,初始化环境变量SPARK_HOME (如果PATH不存在SPARK_HOME,初始化脚本的上级目录为SPARK_HOME),调用spark-config.sh,调用load-spark-env.sh
如果环境变量SPARK_MASTER_HOST, SPARK_MASTER_PORT,SPARK_MASTER_WEBUI_PORT不存在,进行初始化7077,hostname -f,8080
调用spark-daemon.sh脚本启动master进程(spark-daemon.sh start org.apache.spark.deploy.master.Master 1 --host $SPARK_MASTER_HOST --port $SPARK_MASTER_PORT --webui-port $SPARK_MASTER_WEBUI_PORT $ORIGINAL_ARGS)
四. start-slaves.sh
启动Worker的脚本,流程如下:
用户执行start-slaves.sh脚本,初始化环境变量SPARK_HOME,调用spark-config.sh,调用load-spark-env.sh,初始化Master host/port信息,
调用slaves.sh脚本,读取conf/slaves文件并遍历,通过ssh连接到对应slave节点,启动 ${SPARK_HOME}/sbin/start-slave.sh spark://$SPARK_MASTER_HOST:$SPARK_MASTER_PORT
start-slave.sh在各个节点中,初始化环境变量SPARK_HOME,调用spark-config.sh,调用load-spark-env.sh,根据$SPARK_WORKER_INSTANCES计算WEBUI_PORT端口(worker端口号依次递增 )并启动Worker进程(${SPARK_HOME}/sbin /spark-daemon.sh start org.apache.spark.deploy.worker.Worker $WORKER_NUM
--webui-port "$WEBUI_PORT" $PORT_FLAG $PORT_NUM $MASTER "$@")
五. start-all.sh
属于快捷脚本,内部调用start-master.sh与start-slaves.sh脚本,并无额外工作
六.bin/spark-submit
任务提交的基本脚本,流程如下:
直接调用spark-class脚本进行进程创建(./spark-submit --class org.apache.spark.examples.SparkPi --master spark://zqh:7077 ../examples/jars/spark-examples_2.11-2.1.0.jar 10)
如果是java/scala任务,那么最终调用SparkSubmit.scala进行任务处理(/opt/jdk1.7.0_79/bin/java -cp /opt/spark-2.1.0/conf/:/opt/spark-2.1.0/jars/*:/opt/hadoop-2.6.4/etc/hadoop/ -Xmx1g -XX:MaxPermSize=256m org.apache.spark.deploy.SparkSubmit --master
spark://zqh:7077 --class org.apache.spark.examples.SparkPi ../examples/jars/spark-examples_2.11-2.1.0.jar 10)
七.总结
三端在的脚本主要进行多方面抽取,使代码更加精炼
公共的环境变量由spark-config.sh,bin/load-spark-env.sh进行统一的处理
扩在由conf/spark-env.sh进行配置读取实现
守护进程由spark-daemon.sh进行创建,进行相关的log,pid前置处理
spark-class.sh是公共的处理入口脚本
Main.java负责对参数的解析组装
最后执行组装好的command,其中支持scala/java/python/r
相关文章推荐
- 【Spark2.0源码学习】-2.一切从脚本说起
- 【Spark2.0源码学习】-6.Client启动
- Spark2.0源码学习-Job提交与Task的拆分
- 【Spark2.0源码学习】-7.Driver与DriverRunner
- 【Spark2.0源码学习】-9.Job提交与Task的拆分
- 【Spark2.0源码学习】-8.SparkContext与Application介绍
- 【Spark2.0源码学习】-10.Task执行与回馈
- 【Spark2.0源码学习】-8.SparkContext与Application介绍
- 【Spark2.0源码学习】-5.Worker启动
- Spark源码学习(一)---Spark的启动脚本
- 【Spark2.0源码学习】-9.Job提交与Task的拆分
- 【Spark2.0源码学习】-1.概述
- Spark学习之路 (十六)SparkCore的源码解读(二)spark-submit提交脚本
- 【Spark2.0源码学习】-1.概述
- 【Spark2.0源码学习】-4.Master启动
- 【Spark2.0源码学习】-4.Master启动
- 【Spark2.0源码学习】-5.Worker启动
- 【Spark2.0源码学习】-9.Job提交与Task的拆分
- 【Spark2.0源码学习】-3.Endpoint模型介绍
- 【Spark2.0源码学习】-6.Client启动