提交第一个spark应用到集群中运行
bin/spark-submit --master spark://node-5:7077 --class org.apache.spark.examples.SparkPi --executor-memory 2048mb --total-executor-cores 12 examples/jars/spark-examples_2.11-2.2.0.jar 1000
bin/spark-submit --master spark://hdp-nn-01:7077 --class cn.edu360.spark.ScalaWordCount --executor-memory 1024mb --total-executor-cores 4 /root/temp/SparkTest-1.0.jar hdfs://hdp-dn-01:9000/adc hdfs://hdp-dn-01:9000/out11
提交任务时常用的选项如下:
参数说明: spark-submit 脚本
--class: 程序入口,主类
--master: 集群主节点(master)地址 (e.g. spark://23.195.26.187:7077)
--deploy-mode: 部署方式 ,在worker上(cluster) 或者是在客户端上 (client) (default: client) †
--conf: 配置选项
application-jar: 程序以及依赖的地址, URL 必须是在你的集群中全局可见的 ,例如 hdfs:// or a file://
application-arguments: 程序参数
注意参数要在jar包之前指定,这些参数都是sparksubmit传给spark的;最后跟jar包路径及jar包运行参数
- 启动master
- worker通过rpc通信向master注册信息,ha集群中会将worker信息持久化到zk,worker定时向master发送心跳
- 客户端启动driver进程(sparksubmit)提交任务,先向master申请资源 master负责资源调度,即分配资源(也就是在哪些worker上启动excutor)
- master与worker进行rpc通信,让worker启动executor,同时将分区的参数传递给worker
- worker启动executor
- executor与driver进行通信执行任务 executor会主动联系driver(通过master -> worker -> executor知道driver在哪) 真正的计算逻辑是在driver端,driver端生成task,通过网络将任务分发到excutor端执行
spark中master,worker,driver,excutor都负责什么工作
- driver:提交任务,并下发计算任务
- master:负责worker的管理,负责资源调度
- worker:报活、启动和管理worker
- executor:负责执行计算任务
Yarn和Spark的StandAlone调度模式对比
| Header Cell | Header Cell | Header Cell |
|---|---|---|
| ResouceManager | Master | 管理子节点、资源调度、接收任务请求 |
| NodeManager | Worker | 管理当前节点,并管理子进程 |
| YarnChild | Executor | 运行真正的计算逻辑的(Task) |
| Client | SparkSubmit | (Client + ApplicaitonMaster)提交app,管理该任务的Executor |
| ApplicaitonMaster | 并将Task提交到(Executor) |