Spark的各种运行模式虽然在启动方式、运行为之、调度手段上有所不同,但它们所要完成的任务基本是一致的,就是在合适的位置安全可靠的根据用户的配置和作业的需要管理和运行任务,在运行调度过程中需要考虑的问题主要为:
环境变量的传递
JAR包和各种依赖文件的分发
任务的管理和序列化等
用户参数配置
用户及权限控制
环境变量的传递Spark的运行参数有很大一部分是通过环境变量来设置的,例如Executor的内存设置、Library路径等。在Cluster模式下就涉及到环境变量在各个Worker节点的传递问题。不同的运行模式有不同的传递方式。需要指出的是,在Local模式下,不存在环境变量的传递问题。
在这里主要说明一下再YARN相关模式下的参数传递。在YARN相关模式中,这些环境变量首先要通过YARN client设置到Spark AM的运行环境中,之后Spark AM在启动Executor时再将环境变量设置到Executor中。
JAR包和依赖文件的分发Spark程序的运行主要有两类依赖:
Spark运行库及其依赖
应用程序自身的额外依赖
在Local模式下,不存在JAR包分发的问题。在这里主要介绍下YARN模式下的文件分发。
在YARN相关模式中,运行库和程序运行所以来的其他文件首先通过HDFS客户端API上传到作业的.sparkStaing目录下,然后将对应的文件和URL映射关系通知YARN,YARN的Node Manager在启动Container的时候会从指定URL处下载相关文件作为运行环境的一部分。
对于需要进一步分发到Executor运行环境的文件,Spark YARN客户端将需要分发的文件的相关属性(例:URL、时间戳、尺寸等)打包成字符串,通过特定的环境变量(SPARK_YARN_CACHE_XXXX)传递给Spark AM,Spark AM在创建Executor的Container时还原特定环境变中的各个文件,并通过调用setLocalResources函数初始化Container。
任务管理和序列化Spark任务的运行要解决的问题为:
以正确的顺序运行任务,有效地管理和分派任务
将任务及运行所需相关数据有效地发送到远端
收集运行结果
Spark任务通过DAGScheduler调用TaskScheduler.submitTasks进行派发,该接口将相关的一组任务一起提交并进行调度。
任务的运行结果在Executor端被序列化并发送回SchedulerBackend,由于受到Akka帧尺寸的限制,如果运行结果数据过大,结果会存储到BlockManager中,这时候发送到SchedulerBackend的是对应数据的BlockID,TaskScheduler最终会调用TaskResultGetter在线程池中以异步的方式读取结果,TaskSetManager再根据运行结果更新任务状态(比如失败重试等)并汇报给DAGScheduler等。
更多Spark相关教程见以下内容:
CentOS 7.0下安装并配置Spark
CentOS 6.2(64位)下安装Spark0.8.0详细记录
Spark简介及其在Ubuntu下的安装使用