Spark的各种运行模式虽然启动方式,运行位置,调度手段有所不同,但它们所要完成的任务基本都是一致的,就是在合适的位置安全可靠的根据用户的配置和Job的需要管理和运行Task,这里粗略的列举一下在运行调度过程中各种需要考虑的问题

  • 环境变量的传递
  • Jar包和各种依赖文件的分发
  • Task的管理和序列化等
  • 用户参数配置
  • 用户及权限控制

环境变量的传递

Spark的运行参数有很大一部分是通过环境变量来设置的,例如Executor的内存设置,Library路径等等。Local模式当然不存在环境变量的传递问题,在Cluster模式下,就需要将环境变量传递到远端JVM环境中去

SparkContext在初始化过程中 需要传递给Executor的环境变量,会在executorEnvs变量中(HashMap)中收集起来

而具体如何将这些变量设置到Executor的环境中,取决于Executor的Launch方式

在Spark Standalone模式中,这些变量被封装在org.apache.spark.deploy.Command中,交给AppClient启动远程Executor,Command经由Spark Master通过Actor再次转发给合适的Worker,Worker通过ExecutorRunner构建Java.lang.Process运行ExecutorBackend,环境变量在ExecutorRunner中传递给java.lang.ProcessBuilder.environment完成整个传递过程

在Mesos相关模式中,这些环境变量被设置到org.apache.mesos.Protos.Environment中,在通过MesosLaunch Task时交给Mesos完成分发工作

在yarn-standalone模式中,这些环境变量首先要通过Yarn Client 设置到Spark AM的运行环境中,基本就是Client类运行环境中以SPARK开头的环境变量全部设置到ContainerLaunchContext中,AM通过WorkerRunnable进一步将它们设置到运行Executor所用的ContainerLaunchContext中

Yarn-client模式与yarn-standalone模式大致相同,虽然SparkContext运行在本地,executor所需的环境变量还是通过ContainerLaunchContext经AM中转发给Executor

可以注意到,在Yarn相关模式中,并没有使用到SparkContext收集的executorEnvs,主要是因为Yarn Standalone模式下Sparkcontext本身就是在远程运行的,因此在Yarn Client中单独实现了相关代码

Jar包和各种依赖文件的分发

Spark程序的运行依赖大致分两类, 一是Spark runtime及其依赖,二是应用程序自身的额外依赖

对于Local模式而言,不存在Jar包分发的问题

对于第一类依赖

在Spark Standalone模式中,整个环境随Spark部署到各个节点中,因此也不存在runtime
Jar包分发的问题

Mesos相关模式下,Mesos本身需要部署到各个节点,SparkRuntime可以和Standalone模式一样部署到各个节点中,也可以上传到Mesos可以读取的地方比如HDFS上,然后通过配置spark.executor.uri通知Mesos相关的SchedulerBackend,它们会将该URL传递给Mesos,Mesos在Launch任务时会从指定位置获取相关文件

而Spark
应用程序所额外依赖的文件,在上述模式中可以通过参数将URL传递给SparkContext,对于本地文件SparkContext将启动一个HttpServer用于其它节点读取相关文件,其它如HDFS和外部HTTP等地址上的文件则原封不动,然后这些额外依赖文件的URL在TaskSetmanager中和Task本身一起被序列化后发送给Executor,Executor再反序列化得到URL并传递给ExecutorURLClassLoader使用

在Yarn相关模式中,Runtime和程序运行所依赖的文件首先通过HDFS
Client API上传到Job的.sparkStaging目录下,然后将对应的文件和URL映射关系通过containerLaunchContext.setLocalResources函数通知Yarn,Yarn的NodeManager在Launch
container的时候会从指定URL处下载相关文件作为运行环境的一部分。上面的步骤对于Spark
AM来说是充分的,而对于需要进一步分发到Executor的运行环境中的文件来说,AM还需要在创建Executor的Container的时候同样调用setLocalResources函数,AM是如何获得对应的文件和URL列表的呢,其实就是SparkYarn
Client将这些文件的相关属性如URL,时间戳,尺寸等信息打包成字符串,通过特定的环境变量(SPARK_YARN_CACHE_XXX
)传递给AM,AM再把它们从环境变量中还原成所需文件列表

Task管理和序列化

Task的运行要解决的问题不外乎就是如何以正确的顺序,有效地管理和分派任务,如何将Task及运行所需相关数据有效地发送到远端,以及收集运行结果

Task的派发源起于DAGScheduler调用TaskScheduler.submitTasks将一个Stage相关的一组Task一起提交调度。

在TaskSchedulerImpl中,这一组Task被交给一个新的TaskSetManager实例进行管理,所有的TaskSetManager经由SchedulableBuilder根据特定的调度策略进行排序,在TaskSchedulerImpl的resourceOffers函数中,当前被选择的TaskSetManager的ResourceOffer函数被调用并返回包含了序列化任务数据的TaskDescription,最后这些TaskDescription再由SchedulerBackend派发到ExecutorBackend去执行

系列化的过程中,上一节中所述App依赖文件相关属性URL等通过DataOutPutStream写出,而Task本身通过可配置的Serializer来序列化,当前可配制的Serializer包括如JavaSerializer
,KryoSerializer等

Task的运行结果在Executor端被序列化并发送回SchedulerBackend,由于受到Akka
Frame Size尺寸的限制,如果运行结果数据过大,结果会存储到BlockManager中,这时候发送到SchedulerBackend的是对应数据的BlockID,TaskScheduler最终会调用TaskResultGetter在线程池中以异步的方式读取结果,TaskSetManager再根据运行结果更新任务状态(比如失败重试等)并汇报给DAGScheduler等

用户参数配置

Spark的用户参数配置途径很多,除了环境变量以外,可以通过Spark.conf文件设置,也可以通过修改系统属性设置
"spark.*"

而这些配置参数的使用环境也很多样化,有些在Sparkcontext本地使用(除了yarn-standalone模式),有些需要分发到Cluster集群中去

在SparkContext中解析和使用,比如spark.master,spark.app.names,
spark.jars等等,通常用于配置SparkContext运行参数,创建Executor启动环境等

发送给Executor的参数又分两部分

一部分在ExecutorBackend初始化过程中需要使用的系统变量,会通过SparkContext在初始化过程中读取并设置到环境变量中去,在通过前面所述的方式,使用对应的底层资源调度系统设置到运行容器的环境变量中

另一部分在Executor中才使用的以"spark.*"开头的参数,则通过ExecutorBackend向SchedulerBackend的注册过程,在注册确认函数中传递给ExecutorBackend再在Executor的初始化过程中设置到SparkConf中

总体看来,这些参数配置的方式和分发途径有些不太统一,稍显混乱,大概还有改进的余地

用户及权限控制

Spark的Task在Executor中运行时,使用hadoop的UerGroupInfomation.doAs
函数将整个Task的运行环境包装起来以特定的sparkUser的身份运行。这样做的目的主要是使得Spark的task在与Hadoop交互时,使用特定的用户而不是Executor启动时所用的用户身份,这有利于在集群中区分Spark
Cluster的运行用户和实际使用集群的APP用户身份,以及HDFS等权限控制

用户名在Executor中通过SPARK_USER环境变量获取

对于Local模式来说,SPARK_USER环境变量就是当前JVM环境下设定的值,当然对Local模式来说实际上也是不需要doAs的,Executor中如果SPARK_USER变量未设定或者与当前用户名一致,会跳过doAs直接执行task
launch相关函数

传递用户身份的问题容易解决,比较麻烦的是身份的认证,例如将Spark运行在通过Kerberos管理权限的Hadoop集群中,这需要完成客户端的身份认证,Security
相关秘钥或Token的获取,分发,更新,失效等工作,在保证效率的同时,还要确保整个过程的安全性,目前的Spark代码对这一方面还没有完善的实现方案,但是有一些提案和Patch正在进行中。

Spark internal - 多样化的运行模式 (下)的更多相关文章

  1. Spark internal - 多样化的运行模式(上)

    Spark的运行模式多种多样,在单机上既可以以本地模式运行,也可以以伪分布式模式运行.而当以分布式的方式运行在Cluster集群中时,底层的资源调度可以使用Mesos 或者是Hadoop Yarn , ...

  2. 大话Spark(5)-三图详述Spark Standalone/Client/Cluster运行模式

    之前在 大话Spark(2)里讲过Spark Yarn-Client的运行模式,有同学反馈与Cluster模式没有对比, 这里我重新整理了三张图分别看下Standalone,Yarn-Client 和 ...

  3. Unity非运行模式下实现动画播放/回退工具

    实现效果 核心功能 支持选定模型(带Animator)在非运行模式下,播放/暂停/停止动作. 支持动作单帧前进,单帧回退(帧时间默认0.05f,可以代码设置). 支持滚动条拖拽,将动作调整到指定时间. ...

  4. 2 Spark角色介绍及运行模式

    第2章 Spark角色介绍及运行模式 2.1 集群角色 从物理部署层面上来看,Spark主要分为两种类型的节点,Master节点和Worker节点:Master节点主要运行集群管理器的中心化部分,所承 ...

  5. 【原】Spark不同运行模式下资源分配源码解读

    版权声明:本文为原创文章,未经允许不得转载. 复习内容: Spark中Task的提交源码解读 http://www.cnblogs.com/yourarebest/p/5423906.html Sch ...

  6. 【Spark深入学习-11】Spark基本概念和运行模式

    ----本节内容------- 1.大数据基础 1.1大数据平台基本框架 1.2学习大数据的基础 1.3学习Spark的Hadoop基础 2.Hadoop生态基本介绍 2.1Hadoop生态组件介绍 ...

  7. Spark的几种运行模式

    1.local单机模式,结果xshell可见:./bin/spark-submit --class org.apache.spark.examples.SparkPi --master local[1 ...

  8. 【Spark】Spark-shell案例——standAlone模式下读取HDFS上存放的文件

    目录 可以先用local模式读取一下 步骤 一.先将做测试的数据上传到HDFS 二.开发scala代码 standAlone模式查看HDFS上的文件 步骤 一.退出local模式,重新进入Spark- ...

  9. WebDriver 运行模式下使用rc 代码

    selenium2 对之前的rc 代码提供了兼容性接口,如果你之前的code 都是用rc 写,而现在又想摆脱要每次启动server,你只需要 略做修改即可.代码如下: public class Tes ...

随机推荐

  1. Windows运行命令集锦

    开始菜单中的“运行”(Win+R)是通向程序的快捷途径,输入特定的命令后,即可快速的打开Windows的大部分程序,熟练的运用它,将给我们的操作带来诸多便捷. winver 检查Windows版本  ...

  2. python下很帅气的爬虫包 - Beautiful Soup 示例

    先发一下官方文档地址.http://www.crummy.com/software/BeautifulSoup/bs4/doc/ 建议有时间可以看一下python包的文档. Beautiful Sou ...

  3. TCP之二:TCP的三次握手与四次分手

    一.TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文章时,我想你也知道TCP的概念了,想要更深入的了解TCP的工作,我们就继续.它只是一个超级麻烦的协议,而它又是互联网的基础 ...

  4. Solr入门和实践以及我对Solr的8点理解

    友情提示Solr的内容还是比较多的,一篇文章只能讲解一部分.全面介绍,没兴趣,没时间,也没能力,回报还不大.本文只写点我认为比较重要的知识点,独特的个人想法.仅供参考哦,更多细节需要自己去琢磨. 概述 ...

  5. [转]SVN 乱码问题

    以下来自:http://godchenmeng.iteye.com/blog/797727 最近研究SVN.发现在创建补丁包的时候出现这种情况. 在文件顶部不论是什么代码都会变成乱码.在文件中如果有注 ...

  6. Web应用层协议---HTTP

    处于协议栈顶层的应用层协议定义了运行在不同端系统的应用程序进程如何相互传递报文.定义内容如下: 1.交换的报文类型.请求报文和响应报文. 2.各种报文类型的语法,如报文中的各个字段及这这些字段是如何描 ...

  7. php中将数组转换为指定符号分割的字符串

    如想将一个数组转换为以“,”分割的字符串,只需如下: implode(',', arr);

  8. 【UVa】1374 Power Calculus(IDA*)

    题目 题目     分析 IDA*大法好,抄了lrj代码.     代码 #include <cstdio> #include <cstring> #include <a ...

  9. 优化笔记:jsyhjkzqxx_D_20140916.gz

    有几张表没有权限,所以跑不起来. 目测黄色部分比较坑爹,死了n多脑细胞才看懂,又死了n多脑细胞才改出来.对5034进行了2次扫描,并多次分组排序求和.(分组和排序算法相对来说比较耗性能) 改为只扫描一 ...

  10. svn使用常用错误

    描述 :SVN更新提交显示文件被锁异常: Working copy XXXXXXXX locked Please execute "Cleanup" command 原因 : 待查 ...