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

一、脚本概览
     下面是一个举例:
/opt/jdk1..0_79/bin/java
-cp /opt/spark-2.1./conf/:/opt/spark-2.1./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  

【Spark2.0源码学习】-6.Client启动的更多相关文章

  1. 【Spark2.0源码学习】-1.概述

          Spark作为当前主流的分布式计算框架,其高效性.通用性.易用性使其得到广泛的关注,本系列博客不会介绍其原理.安装与使用相关知识,将会从源码角度进行深度分析,理解其背后的设计精髓,以便后续 ...

  2. spark2.0源码学习

    [Spark2.0源码学习]-1.概述 [Spark2.0源码学习]-2.一切从脚本说起 [Spark2.0源码学习]-3.Endpoint模型介绍 [Spark2.0源码学习]-4.Master启动 ...

  3. 【Spark2.0源码学习】-2.一切从脚本说起

    从脚本说起      在看源码之前,我们一般会看相关脚本了解其初始化信息以及Bootstrap类,Spark也不例外,而Spark我们启动三端使用的脚本如下: %SPARK_HOME%/sbin/st ...

  4. 【Spark2.0源码学习】-3.Endpoint模型介绍

         Spark作为分布式计算框架,多个节点的设计与相互通信模式是其重要的组成部分.   一.组件概览      对源码分析,对于设计思路理解如下:            RpcEndpoint: ...

  5. 【Spark2.0源码学习】-8.SparkContext与Application介绍

             在前面的内容,我们针对于RpcEndpoint启动以及RpcEndpoint消息处理机制进行了详细的介绍,在我们的大脑里,基本上可以构建Spark各节点的模样.接下来的章节将会从Sp ...

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

         Master作为Endpoint的具体实例,下面我们介绍一下Master启动以及OnStart指令后的相关工作   一.脚本概览      下面是一个举例: /opt/jdk1..0_79/ ...

  7. 【Spark2.0源码学习】-5.Worker启动

         Worker作为Endpoint的具体实例,下面我们介绍一下Worker启动以及OnStart指令后的额外工作   一.脚本概览      下面是一个举例: /opt/jdk1..0_79/ ...

  8. 【Spark2.0源码学习】-9.Job提交与Task的拆分

          在前面的章节Client的加载中,Spark的DriverRunner已开始执行用户任务类(比如:org.apache.spark.examples.SparkPi),下面我们开始针对于用 ...

  9. ThinkPHP5.0源码学习之框架启动流程

    ThinkPHP5框架的启动流程图如下: ThinkPHP5的启动流程按照文件分为三步: 1.请求入口(public/index.php) 2.框架启动(thinkphp/start.php) 3.应 ...

随机推荐

  1. Java Stream API性能测试

    已经对Stream API的用法鼓吹够多了,用起简洁直观,但性能到底怎么样呢?会不会有很高的性能损失?本节我们对Stream API的性能一探究竟. 为保证测试结果真实可信,我们将JVM运行在-ser ...

  2. java基础--动态代理实现与原理详细分析

    关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 一.代理模式                     ...

  3. 深入tornado中的协程

    tornado使用了单进程(当然也可以多进程) + 协程 + I/O多路复用的机制,解决了C10K中因为过多的线程(进程)的上下文切换 而导致的cpu资源的浪费. tornado中的I/O多路复用前面 ...

  4. css常用技巧集合

    1 不想让按钮touch时有蓝色的边框或半透明灰色遮罩(根据系统而定) /*解决方式一*/ -webkit-tap-highlight-color:rgba(0,0,0,0); -webkit-use ...

  5. socket.io的编程实现

    socket.io实例 一.环境要求 客户端需要引用socket.io.js文件 服务端需要按照node环境,以及npm install socket.io用来安装服务端的socket.io 二.客户 ...

  6. Go语言及Web框架Beego环境

    Go语言及Web框架Beego环境无脑搭建 [原]Go语言及Web框架Beego环境无脑搭建 本文涉及软件均以截至到2013年10月12日的最新版本为准 1. 相关软件准备: 1) go1.2rc1. ...

  7. 使用Three.js的材质

    1.three.js提供哪些材质? MeshBasicMaterial(网格基础材质)/基础材质,,可以用它富裕几何体一种简单的亚瑟,或者显示几何体的线框 MeshDepthMaterial(网格深度 ...

  8. cmapx 保存绘制好的图层

    研究了两天,如何保存一绘制好的图层,大致意思都说要使用mapInfo表,然后确定了可定和.TAB表有关.然而网上说的全是垃圾,也不能说全是垃圾,好歹我从中得到了一点点有用的信息,使用mapManage ...

  9. codeforces 757F Team Rocket Rises Again

    链接:http://codeforces.com/problemset/problem/757/F 正解:灭绝树. mdzz倍增lca的根节点深度必须是1..我因为这个错误调了好久. 我们考虑先求最短 ...

  10. linux的大小端、网络字节序问题 .

    1.80X86使用小端法,网络字节序使用大端法. 2.二进制的网络编程中,传送数据,最好以unsigned char, unsigned short, unsigned int来处理, unsigne ...