Apache Spark简明教程

1 Spark集群物理结构

注:Spark的运行不一定依赖于Spark集群,还支持本地、YARN、MESOS。Spark集群只是Apache Spark提供的一种分布式计算环境。

(1)Master

  • (1)监听Worker,看Worker是否正常工作
  • (2)接收worker的注册并管理所有的worker
  • (3)接收和调度client提交的application,并向worker分派任务

(2)Worker

  • (1)通过RegisterWorker注册到Master
  • (2)定时发送心跳给Master
  • (3)根据master分派的application配置进程环境,并启动执行Task所需的进程(StandaloneExecutorBackend)

2 系统运行时结构

(1)Client角色

  • 提交任务者

(2)Driver角色

  • Driver是执行开发程序中main方法的进程

  • 功能

    • (1)把application转为task
    • (2)跟踪Executor的运行状况
    • (3)为Executor节点分派任务
    • (4)UI展示应用运行状况

(3)Executor角色

  • Executor为工作进程,负责运行Task

  • 功能

    • (1)运行application中的task,并将状态信息返回给driver进程
    • (2)为用户application中要求缓存的RDD提供内存式存储。RDD是直接缓存在Executor进程内的,因此任务可以在运行时充分利用缓存数据加速运算。

(4)ResourceManager角色

  • 在集群上为Application获取资源的外部服务
  • 例如:Local、Standalone、Mesos或Yarn等资源管理系统,对应四种作业模式

(5)运行视图

3 系统运行模式

Spark根据可用资源及其调度系统,对应了四种运行(或者作业)模式:

  • Local模式:本地运行模式,主要用于开发者在本地开发调试
  • StandAlone模式:在spark集群上运行程序的模式
  • Spark On YARN模式:在Hadoop集群上部署和运行程序的模式
  • Spark On Mesos模式:在Mesos资源管理器上运行程序的模式

4 Local运行模式

  • 本地多线程并发,提交任务时通过–master参数指定

  • 三种模式

    • Local

      • 所有计算在一个进程中进行,没有并行计算
    • Local[K]

      • 运行K个Worker线程,通常CPU有几个Core就执行几个线程,以便最大化利用CPU计算能力

        • cat /proc/cpuinfo | grep ‘processor’ | wc -l
    • Local[*]

      • 直接根据CPU核数量来设置线程数,如果提交任务时不指定master参数,则默认为本模式

5 Standalone运行模式

  • 模式特点

    • 采用Spark集群作为部署与运行环境,需要部署spark集群,并使用集群的Master作为资源调度器
  • 根据Driver角色部署位置的不同,分为client和cluster两种模式

  • Standalone-cluster模式

    • Driver由Spark集群分配,适用于生产环境

    • 任务提交方式

      1
      2
      3
      4
      5
      6
      7
      8
      9
      bin/spark-submit \
      --class ${APP_MAIN_CLASS} \
      --master spark://${MASSTER}:7077 \
      --deploy-mode cluster \
      --executor-memory 1G \
      --total-executor-cores 2 \
      ${APP_JAR}
      ${INPUT}
      ${OUTPUT}
  • Standalone-client

    • Driver在Client端,适用于开发环境中的交互和调试

    • 任务提交方式(默认模式)

1
2
3
4
5
6
7
8
9
bin/spark-submit \
--class ${APP_MAIN_CLASS} \
--master spark://${MASSTER}:7077 \
--deploy-mode client
--executor-memory 1G \
--total-executor-cores 2 \
${APP_JAR}
${INPUT}
${OUTPUT}
Standalone-client运行模式

6 Spark on YARN运行模式

  • 采用Hadoop的YARN作为资源调度器,无需额外构建Spark集群

  • 根据drvier的部署位置不同,分为client和cluster两种模式

  • YARN-cluster

  • Driver由YARN在集群中找一个节点自动分配,适用于生产环境

  • 任务提交方式

1
2
3
4
5
6
7
8
9
10
11
12
spark-submit 
--queue dc\
--class ${APP_MAIN_CLASS} \
--master yarn\
--deploy-mode client\
--executor-memory 30g\
--driver-memory 10g\
--num-executors 200\
--executor-cores 16\
${APP_JAR}
${INPUT}
${OUTPUT}

  • YARN-client
    • Driver运行在Client端,适用于开发环境中的交互和调试

    • 任务提交方式

1
2
3
4
5
6
7
8
9
bin/spark-submit \
--class ${APP_MAIN_CLASS} \
--master yarn\
--deploy-mode cluster\
--executor-memory 1G \
--total-executor-cores 2 \
${APP_JAR}
${INPUT}
${OUTPUT}

7 Spark on Mesos运行模式

采用Mesos作为资源调度器,Spark客户端直接连接Mesos,无需构建Spark集群,国内运用较少

8 IDEA中的开发调试设置

(1)本地调试

  • 运行模式设置为loca[*]即可启动本地多线程并发调试

(2)远程调试

  • 第1步:提交任务时,启动Driver的JVM调试

    • 提交任务时设置driver远程调试参数

      • spark-submit --driver-java-options “-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005”
  • 第2步:IDE增加远程调试配置

    • 以IDEA为例,Run/Edit Configuration…

      • 添加Remote JVM Debug调试配置,设置好driver的地址和端口,参数应与上述drvier端的JVM参数一致
  • 第3步:运行调试配置

    • 以IDEA为例,debug上述RemoteJVM配置,IDEA的debugger会自动连接driver的5005端口,并返回调试数据

【注意】

  • 必须先提交任务,才能启动第二、三步中的本地debugger远程连接和调试

  • 当deploy-mode为cluster时,driver的IP地址是动态分配的,IDE的Remote JVM Debug的远程主机地址应当根据集群中分配的driver地址做相应修改,两种方式避免频繁地修改JVM Debug配置

    • 方法1:deploy-mode设置为client,则driver在本地,IP地址设置为localhost即可
    • 方法2:spark-submit提交任务时,deploy-mode设置为cluster,并增加参数 conf “spark.drvier.host” "某个worker的地址"来禁止自动调度drvier所在的主机,而采用指定的地址