【Spark2.0源码学习】-6.Client启动

本文详细介绍了Spark Submit的工作流程及参数解析过程,包括启动参数的解析与验证、配置项的处理等。同时深入探讨了Client的启动流程,以及启动完成后的OnStart监听事件处理逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     Client作为Endpoint的具体实例,下面我们介绍一下Client启动以及OnStart指令后的额外工作

一、脚本概览
     下面是一个举例:
/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
 
二、SparkSubmit启动流程
     SparkSubmit的启动流程如下:
  
  • SparkSubmitArguments:
    • 解析Client启动的参数
      • --name --master --class --deploy-mode
      • --num-executors --executor-cores --total-executor-cores --executor-memory
      • --driver-memory --driver-cores --driver-class-path --driver-java-options --driver-library-path
      • --properties-file
      • --kill --status --supervise --queue
      • --files  --py-files
      • --archives --jars --packages --exclude-packages --repositories
      • --conf(解析存入Map : sparkProperties中)
      • --proxy-user --principal --keytab --help --verbose --version --usage-error
    • 合并--properties-file(没有配置默认为conf/spark-defaults.conf)文件配置项(不在--conf中的配置 )至sparkProperties
    • 删除sparkProperties中不以spark.开头的配置项目
    • 启动参数为空的配置项从sparkProperties中合并
    • 根据action(SUBMIT,KILL,REQUEST_STATUS)校验各自必须参数是否有值
  • Case Submit:
    • 获取childMainClass
      • [--deploy-mode] = clent(默认):用户任务启动类mainClass(--class)
      • [--deploy-mode]  = cluster &  [--master] = spark:* & useRest:                                                                                                                                            org.apache.spark.deploy.rest.RestSubmissionClient
      • [--deploy-mode]  = cluster &  [--master] = spark:*  & !useRest :  org.apache.spark.deploy.Client
      • [--deploy-mode]  = cluster &  [--master] = yarn: org.apache.spark.deploy.yarn.Client
      • [--deploy-mode] = cluster &  [--master] = mesos:*: org.apache.spark.deploy.rest.RestSubmissionClient
    • 获取childArgs(子运行时对应命令行组装参数)
      • [--deploy-mode]  = cluster &  [--master] = spark:* & useRest: 包含primaryResource与mainClass
      • [--deploy-mode]  = cluster &  [--master] = spark:*  & !useRest :  包含--supervise --memory --cores  launch 【childArgs】, primaryResource, mainClass
      • [--deploy-mode]  = cluster &  [--master] = yarn:--class  --arg --jar/--primary-py-file/--primary-r-file
      • [--deploy-mode] = cluster &  [--master] = mesos:*: primaryResource
    • 获取childClasspath
      • [--deploy-mode] = clent:读取--jars配置,与primaryResource信息(../examples/jars/spark-examples_2.11-2.1.0.jar)
    • 获取sysProps
      • 将sparkPropertie中的所有配置封装成新的sysProps对象,另外还增加了一下额外的配置项目
    • 将childClasspath通过当前的类加载器加载中
    • 将sysProps设置到当前jvm环境中
    • 最终反射执行childMainClass,传参为childArgs
 
 
     下面仅针对于org.apache.spark.deploy.Client进行解读
 
三、Client启动流程
     Client的启动流程如下:
   
  • SparkConf:加载key以spark.开头的系统属性(Utils.getSystemProperties)
  • ClientArguments:
    • 解析Client启动的参数
      • --cores  -c --memory -m --supervise -s --verbose -v
      • launch  jarUrl master mainClass
      • kill master driverId
    • 将--properties-file(没有配置默认为conf/spark-defaults.conf)中spark.开头的配置存入SparkConf
    • 在没有配置情况下,cores默认为1核
    • 在没有配置情况下,memory默认为1G
    • NettyRpcEnv中的内部处理遵循RpcEndpoint统一处理,这里不再赘述
  • 最终守护进程会一直存在等待结束信awaitTermination
 
四、Client的OnStart监听事件
     Client的启动完成后异步执行工作如下:
   
  • 如果是发布任务(case launch),Client创建一个DriverDescription,并向Master发起RequestSubmitDriver请求
    • Command中的mainClass为: org.apache.spark.deploy.worker.DriverWrapper
    • Command中的arguments为: Seq("{{WORKER_URL}}", "{{USER_JAR}}", driverArgs.mainClass)
  • Master接受RequestSubmitDriver请求后,将DriverDescription封装为一个DriverInfo,
    • startTime与submitDate都为当前时间
    • driverId格式为:driver-yyyyMMddHHmmss-nextId,nextId是全局唯一的
  • Master持久化DriverInfo,并加入待调度列表中(waitingDrivers),触发公共资源调度逻辑(公共资源调度详解见下一节内容)
  • Master公共资源调度结束后,返回SubmitDriverResponse给Client
 
五、RpcMessage处理(receiveAndReply)
 
消息实例发起方接收方说明
    
 
六、OneWayMessage处理(receive)
消息实例发起方接收方说明
SubmitDriverResponseMasterClient 
KillDriverResponse Client 

转载于:https://www.cnblogs.com/hframe/p/6897765.html

---1.启动Spark: starting org.apache.spark.deploy.master.Master, logging to /opt/modules/spark/spark3.5.2/logs/spark-bigdata-org.apache.spark.deploy.master.Master-1-hadnn.out failed to launch: nice -n 0 /opt/modules/spark/spark3.5.2/bin/spark-class org.apache.spark.deploy.master.Master --host hadnn --port 7077 --webui-port 8888 /opt/modules/spark/spark3.5.2/bin/spark-class:行71: /opt/modules/jdk/jdk-1.8.0_411/bin/java: 没有那个文件或目录 /opt/modules/spark/spark3.5.2/bin/spark-class:行97: CMD: 坏的数组下标 full log in /opt/modules/spark/spark3.5.2/logs/spark-bigdata-org.apache.spark.deploy.master.Master-1-hadnn.out hadnn: starting org.apache.spark.deploy.worker.Worker, logging to /opt/modules/spark/spark3.5.2/logs/spark-bigdata-org.apache.spark.deploy.worker.Worker-1-hadnn.out hadnn: failed to launch: nice -n 0 /opt/modules/spark/spark3.5.2/bin/spark-class org.apache.spark.deploy.worker.Worker --webui-port 8082 spark://hadnn:7077 hadnn: /opt/modules/spark/spark3.5.2/bin/spark-class:行71: /opt/modules/jdk/jdk-1.8.0_411/bin/java: 没有那个文件或目录 hadnn: /opt/modules/spark/spark3.5.2/bin/spark-class:行97: CMD: 坏的数组下标 hadnn: full log in /opt/modules/spark/spark3.5.2/logs/spark-bigdata-org.apache.spark.deploy.worker.Worker-1-hadnn.out haddn: starting org.apache.spark.deploy.worker.Worker, logging to /opt/modules/spark/spark3.5.2/logs/spark-bigdata-org.apache.spark.deploy.worker.Worker-1-haddn.out haddn: failed to launch: nice -n 0 /opt/modules/spark/spark3.5.2/bin/spark-class org.apache.spark.deploy.worker.Worker --webui-port 8082 spark://hadnn:7077 haddn: /opt/modules/spark/spark3.5.2/bin/spark-class:行71: /opt/modules/jdk/jdk-1.8.0_411/bin/java: 没有那个文件或目录 haddn: /opt/modules/spark/spark3.5.2/bin/spark-class:行97: CMD: 坏的数组下标 haddn: full log in /opt/modules/spark/spark3.5.2/logs/spark-bigdata-org.apache.spark.deploy.worker.Worker-1-haddn.out hadnns: starting org.apache.spark.deploy.worker.Worker, logging to /opt/modules/spark/spark3.5.2/logs/spark-bigdata-org.apache.spark.deploy.worker.Wo
最新发布
03-08
### Spark启动失败分析 对于Spark 3.5.2版本,在启动过程中遇到`java 文件不存在错误 ‘没有那个文件或目录’ 和‘坏的数组下标’`的情况,通常涉及环境配置以及依赖库的问题。 #### 环境变量未正确设置 如果在 `$SPARK_HOME/conf/spark-env.sh` 中设置了某些变量仅限于终端Shell环境下生效,则可能导致Java运行时找不到必要的路径。例如 `JAVA_HOME is not set` 的提示表明 Java 安装位置未被识别[^1]。这会进一步影响到其他依赖项的位置解析,造成类似“文件不存在”的异常。 #### 启动命令执行失败 当尝试通过特定方式启动Spark服务时,如使用 `nice -n 0 /soft/spark/bin/spark-class org.apache.spark.deploy.worker` 命令,若发生权限不足或其他系统级限制也可能引发类似的无法找到指定文件或程序入口点的报错信息[^2]。 为了排查此类问题: - **确认所有必需软件已安装并可访问** - 验证 JDK 是否已经正确安装,并且可以通过命令行工具正常调用。 - **检查文件系统的完整性** - 使用操作系统的实用工具来扫描是否有损坏的链接或者丢失的关键组件。 - **验证脚本语法无误** - 特别注意 shell 脚本内的逻辑结构,比如循环、条件判断语句等地方容易出现越界访问等问题,即所谓的“坏的数组下标”。 针对上述情况建议采取如下措施: 1. 修改 `.bashrc`,`.zshrc` 或者相应的 Shell 初始化文件加入正确的 `export JAVA_HOME=/path/to/java` 设置; 2. 对 `/soft/spark/bin/` 下的相关二进制文件赋予适当的读取和执行权限; 3. 查看具体的堆栈跟踪日志获取更多关于缺失资源的信息以便精确定位问题所在。 ```bash chmod +x /soft/spark/bin/* ``` 4. 如果怀疑是由于递归函数引起的索引超出范围,可以审查源码中涉及到的数据处理部分确保边界条件得到妥善处理[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值