Spark运行模式
理解Spark的运行模式,需要先了解Spark的程序架构
这是一个Master-Slave的架构,Driver(Master)生成分布式执行计划,把执行计划里的各个任务(Task)调度到Executor(Slave)执行,可以启动多个Executor,每个Executor可以运行多个Task。运行的时候是一个Driver,多个Executor。
Spark运行模式包括三种:
- Local(本地模式)
单机运行,将Spark应用以多线程方式,直接运行在本地,通常用于测试,不需要搭建hadoop集群。
本地模式分为:
1)Local:只启动一个Executor
2)Local[K]:启动K个Executor
3)Local[*]:启动跟cpu数目相同的Executor - Standalone(独立模式)
独立运行在一个集群中,集群只支持运行Spark,不支持运行Mapreduce或其他运算
- YARN/mesos
运行在YARN/mesos的资源管理器中,支持分布式运算
Spark on YARN包括两种模式:yarn-client和yarn-clustered
1)yarn-clien
客户端:是提交Spark程序的机器,客户端可以不在集群上,但是可以提交Spark作业到集群。Driver运行在本地客户端,调试方便,方便查看日志,但是容错不好,一旦Driver挂掉,程序就停止。Executor运行在NodeManager上。
这是四个节点的集群和三个客户端,Driver首先在集群上启动一个Application Master(1-3)。Application Master会为应用程序申请资源启动Executor(4-6),Executor启动后会和Driver通讯,领取任务。
2)yarn-clustered
Driver运行在集群里,它运行在哪个节点是由Yarn调度的,如果查看日志会比较麻烦,但是容错会比较好,因为一旦Driver挂掉,Resource Manager会再分配一个NodeManager来运行Driver
一般使用本地模式和Yarn模式
生产环境一般用yarn-clustered
Wordcount实例
import org.apache.spark._
import SparkContext._
object WordCount {
def main(args: Array[String]) {
if (args.length != 3 ){
println("usage is org.test.WordCount <master> <input> <output>")
return
}
val sparkConf = new SparkConf().setAppName(”WordCount") //定义程序名称”WordCount"
val sc = new SparkContext(sparkConf)
val rowRdd= sc.textFile(args(1)) //可以在这里输入数据所在的目录,比如:hdfs://host:port/input/data
val resultRdd = rowRdd.flatMap(line => line.split("\\s+")).map(word => (word, 1)).reduceByKey(_ + _)
resultRdd.saveAsTextFile(args(2))//可以在这里输出数据所在的目录,比如:hdfs://host:port/output/data
}
}
程序通过spark-submit命令提交,通过–master参数来指定运行模式。