Spark单机运行,一般用于开发测试。可以通过Local[N]来设置,其中N代表可以使用N个线程,每个线程拥有一个core。如果不指定N,则默认是1个线程(该线程有1个core)。spark-submit 和 spark-submit --master local 效果是一样的,同理spark-shell 和 spark-shell --master local 效果是一样的
运行该模式非常简单,只需要把Spark的安装包解压后,改一些常用的配置即可使用,而不用启动Spark的Master、Worker守护进程,也不用启动Hadoop的各服务(除非需要用到HDFS)
这个SparkSubmit进程既是客户提交任务的Client进程、又是Spark的driver程序、还充当着Spark执行Task的Executor角色。
示例如下:
spark-submit --class JavaWordCount --master local[10] JavaWordCount.jar file:///tmp/test.txt
代码中设置:
spark = SparkSession\
.builder\
.appName("PythonWordCount")\
.master("local")\
.getOrCreate()
sc = spark.sparkContext
parsed =urllib.parse.urlparse("http://www.baidu.com")
print(parsed.netloc)
spark-submit --master local[2] 代表会有2个线程(每个线程一个core)来并发执行应用程序。
spark-submit --master local-cluster[2, 3, 1024]
上面这条命令代表会使用2个executor进程,每个进程分配3个core和1G的内存,来运行应用程序。SparkSubmit依然充当全能角色,又是Client进程,又是driver程序,还有点资源管理的作用。生成的两个CoarseGrainedExecutorBackend,就是用来并发执行程序的进程。
构建一个由Master+Slave构成的Spark集群,Spark运行在集群中。和单机运行的模式不同,这里必须在执行应用程序前,先启动Spark的Master和Worker守护进程。这种运行模式,可以使用Spark的8080 来观察资源和应用程序的执行情况了。
启动示例如下:
spark-submit --master spark://mini1:7077或者 spark-submit --master spark://mini1:7077 --deploy-mode client
spark = SparkSession\
.builder\
.appName("PythonWordCount")\
.master("spark://mini1:7077")\
.getOrCreate()
sc = spark.sparkContext
示例如下:
spark-submit --master spark://mini1:6066 --deploy-mode cluster
客户端的SparkSubmit进程会在应用程序提交给集群之后就退出,同时Master会在集群中选择一个Worker进程生成一个子进程DriverWrapper来启动driver程序,而该DriverWrapper 进程会占用Worker进程的一个core,所以同样的资源下配置下,会比第3种运行模式,少用1个core来参与计算。
Spark客户端直接连接Yarn。不需要额外构建Spark集群。现在越来越多的场景,都是Spark跑在Hadoop集群中,所以为了做到资源能够均衡调度,会使用YARN来做为Spark的Cluster Manager,来为Spark的应用程序分配资源。
按照Spark应用程序中的driver分布方式不同,Spark on YARN有两种模式: yarn-client模式、yarn-cluster模式。当在YARN上运行Spark作业,每个Spark executor作为一个YARN容器运行。Spark可以使得多个Tasks在同一个容器里面运行。
使用如下命令执行应用程序:
spark-submit --master yarn
或者 spark-submit --master yarn --deploy-mode client
在Resource Manager节点上提交应用程序,会生成SparkSubmit进程,该进程会执行driver程序。
RM会在集群中的某个NodeManager上,启动一个ExecutorLauncher进程,来做为ApplicationMaster。另外,也会在多个NodeManager上生成CoarseGrainedExecutorBackend进程来并发的执行应用程序。
使用如下命令执行应用程序:
spark-submit --master yarn --deploy-mode cluster
在Resource Manager端提交应用程序,会生成SparkSubmit进程,该进程只用来做Client端,应用程序提交给集群后,就会删除该进程。
Resource Manager在集群中的某个NodeManager上运行ApplicationMaster,该AM同时会执行driver程序。紧接着,会在各NodeManager上运行
应用程序的结果,会在执行driver程序的节点的stdout中输出,而不是打印在屏幕上。
conf = SparkConf()
conf.setAppName("Spark")
conf.setMaster('yarn') # spark standalone
conf.set('spark.executor.instances', 3) # cluster on yarn
conf.set('spark.executor.memory', '1g')
conf.set('spark.executor.cores', '1')
# conf.set('spark.cores.max', '2')
# conf.set('spark.logConf', True)
conf.set('spark.streaming.blockInterval', 1000*4) # restart receiver interval
sc = SparkContext(conf = conf)
Spark客户端直接连接Mesos。不需要额外构建Spark集群。
启动示例如下
./spark-shell --master mesos://host:port
./spark-shell --master mesos://host:port --deploy-mode client
./spark-shell --master mesos://host:port --deploy-mode cluster