Spark基本工作流程及YARN cluster模式原理

  在这里主要说明一下再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等。