zoukankan      html  css  js  c++  java
  • 【Spark2.0源码学习】-6.Client启动

         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)
    消息实例 发起方 接收方 说明
    SubmitDriverResponse Master Client  
    KillDriverResponse   Client  
  • 相关阅读:
    [转]给C++初学者的50个忠告
    [转]代理模式——代理模式的核心思想
    [转]单例模式——C++实现自动释放单例类的实例
    [转]代理模式——何时使用代理模式
    观察者模式——生动的气象信息订阅服务图示
    [转]单例模式——Java中互斥访问单一实例
    [转]C++ const变量使用技巧总结
    [转]用C++设计一个不能被继承的类
    ExtJs2.0学习系列(14)Ext.TreePanel之第三式(可增删改的树)
    ExtJs2.0学习系列(7)Ext.FormPanel之第四式(其他组件示例篇)
  • 原文地址:https://www.cnblogs.com/hframe/p/6897765.html
Copyright © 2011-2022 走看看