spark常用的啟動方式
一、Local(本地模式)
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)來並發執行應用程序。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
本地偽集群運行模式:
spark-submit --master local-cluster[2, 3, 1024]
- 1
上面這條命令代表會使用2個executor進程,每個進程分配3個core和1G的內存,來運行應用程序。SparkSubmit依然充當全能角色,又是Client進程,又是driver程序,還有點資源管理的作用。生成的兩個CoarseGrainedExecutorBackend,就是用來並發執行程序的進程。
二、Standalone模式
1.Spark自帶Cluster Manager的Standalone Client模式:
構建一個由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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
2.spark自帶cluster manager的standalone cluster模式(集群):
示例如下:
spark-submit --master spark://mini1:6066 --deploy-mode cluster
- 1
客戶端的SparkSubmit進程會在應用程序提交給集群之后就退出,同時Master會在集群中選擇一個Worker進程生成一個子進程DriverWrapper來啟動driver程序,而該DriverWrapper 進程會占用Worker進程的一個core,所以同樣的資源下配置下,會比第3種運行模式,少用1個core來參與計算。
三、Spark on Yarn模式
1.基於YARN的Resource Manager的Client模式(集群)
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
- 1
- 2
在Resource Manager節點上提交應用程序,會生成SparkSubmit進程,該進程會執行driver程序。
RM會在集群中的某個NodeManager上,啟動一個ExecutorLauncher進程,來做為ApplicationMaster。另外,也會在多個NodeManager上生成CoarseGrainedExecutorBackend進程來並發的執行應用程序。
2.基於YARN的Resource Manager的Custer模式(集群)
使用如下命令執行應用程序:
spark-submit --master yarn --deploy-mode cluster
- 1
在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)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
四、Spark on Mesos模式
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