Apache Spark简明教程
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
9bin/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 | bin/spark-submit \ |
6 Spark on YARN运行模式
-
采用Hadoop的YARN作为资源调度器,无需额外构建Spark集群
-
根据drvier的部署位置不同,分为client和cluster两种模式
-
YARN-cluster
-
Driver由YARN在集群中找一个节点自动分配,适用于生产环境
-
任务提交方式
1 | spark-submit |
- YARN-client
-
Driver运行在Client端,适用于开发环境中的交互和调试
-
任务提交方式
-
1 | bin/spark-submit \ |
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所在的主机,而采用指定的地址