運行Spark程序的幾種模式
一. local 模式 -- 所有程序都運行在一個JVM中,主要用於開發時測試
無需開啟任何服務,可直接運行 ./bin/run-example 或 ./bin/spark-submit 如:
./bin/run-example SparkPi 10
./bin/spark-submit --class org.apache.spark.examples.SparkPi --master local[4] ./examples/jars/spark-examples_2.11-2.1.1.jar 100
local[4] 代表會有4個線程(每個線程一個core)來並發執行應用程序。
此模式下,
1. 這個SparkSubmit進程又當爹、又當媽,既是客戶提交任務的Client進程、又是Spark的driver程序、還充當著Spark執行Task的Executor角色
2.程序的運行狀態可通過 http://<driver-node>:4040 查看,但是這是臨時的,程序運行完後,這個UI也就失效了。我們可以啟動Spark History Server,這
樣就可以看到歷史運行程序的信息了。
開啟Spark History Server,可以在spark-defaults.conf裏配置如下信息:
spark.eventLog.enabled true
spark.eventLog.dir hdfs://ubuntu1:9000/spark/eventlog
spark.history.fs.logDirectory hdfs://ubuntu1:9000/spark/eventlog
通過: 192.168.137.11:18080 訪問 history server //如果啟動history的話
二. 測試或實驗性質的本地偽集群運行模式(單機模擬集群) -- 在單機啟動多個進程來模擬集群下的分布式場景
無需開啟任何服務,可直接運行如下命令:
./bin/spark-submit --class org.apache.spark.examples.SparkPi --master local-cluster[2,3,512] ./examples/jars/spark-examples_2.11-2.1.1.jar 20
local-cluster[x,y,z]參數:x代表要生成的executor數,y和z分別代表每個executor所擁有的core和memory數。
遇到的問題:sc.executorMemory默認值是1024M,如果我們設置的z的值比1024小的話,就會拋錯。可以在spark-defaults.conf 裏配置sc.executorMemory的大小。如:
spark.executor.memory 512m
設置成512(單位M)的原因是:用的是本地VM,總共內存也沒多少。但是如果設置小於450m的話,還是會報錯。
此模式下:SparkSubmit依然充當全能角色,又是Client進程,又是driver程序,還有點資源管理的作用
三. Spark自帶Cluster Manager的Standalone Client模式(集群)
需要先啟動Spark的Master和Worker守護進程。提交一個任務的命令如下:
./bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://ubuntu1:7077 ./examples/jars/spark-examples_2.11-2.1.1.jar 100
此模式下,1. 會在所有有Worker進程的節點上啟動Executor來執行應用程序。
2. Master進程做為cluster manager,用來對應用程序申請的資源進行管理;
3. SparkSubmit 做為Client端和運行driver程序;
4. 運行結果在Shell裏可見
註意,Worker進程生成幾個Executor,每個Executor使用幾個core,這些都可以在spark-env.sh裏面配置
需要配置項:
1. slaves 文件
2. spark-env.sh
export JAVA_HOME=/opt/programs/jdk1.8.0_131
export SPARK_MASTER_IP=ubuntu1
export SPARK_WORKER_CORES=2
export SPARK_EXECUTOR_MEMORY=512m
export SPARK_WORKER_MEMORY=512m
export SPARK_DRIVER_MEMORY=512m
提交一個Spark程序後,可以通過下面的UI查看任務運行狀態。
UI: 192.168.137.11:8080
192.168.137.11:18080 //如果啟動history的話
四. spark自帶cluster manager的standalone cluster模式(集群)
需要先啟動Spark的Master和Worker守護進程。提交一個任務的命令如下:
./bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://ubuntu1:7077 --deploy-mode cluster ./examples/jars/spark-examples_2.11-2.1.1.jar 50
此模式下,1. 客戶端的SparkSubmit進程會在應用程序提交給集群之後就退出。所以在shell裏,運行結果不可見
2. Master會在集群中選擇一個Worker進程生成一個子進程DriverWrapper來啟動driver程序
3. 而該DriverWrapper 進程會占用Worker進程的一個core,所以同樣的資源下配置下,會比第3種運行模式,少用1個core來參與計算
4. 應用程序的結果,會在執行driver程序的節點的stdout中輸出
需要配置項:同(三)
五. 基於YARN的Resource Manager的Client模式(集群)
需要先啟動 Hadoop 的 YARN。不需要啟動Spark的Master、Worker守護進程。運行如下命令
./bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode client ./examples/jars/spark-examples_2.11-2.1.1.jar 100
此模式下:1. 在Resource Manager節點上提交應用程序,會生成SparkSubmit進程,該進程會執行driver程序。
2. RM會在集群中的某個NodeManager上,啟動一個ExecutorLauncher進程,來做為ApplicationMaster
3. 也會在多個NodeManager上生成CoarseGrainedExecutorBackend進程來並發的執行應用程序
Yarn 集群模式需要配置項:
1. spark-env.sh
export JAVA_HOME=/opt/programs/jdk1.8.0_131
export HADOOP_HOME=/opt/programs/hadoop-2.7.3
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export SPARK_HOME=/opt/programs/spark-2.1.1-bin-hadoop2.7
六. 基於YARN的Resource Manager的Cluster模式(集群)
需要先啟動 Hadoop 的 YARN。不需要啟動Spark的Master、Worker守護進程。運行如下命令
./bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster ./examples/jars/spark-examples_2.11-2.1.1.jar 100
此模式下:1. 在Resource Manager端提交應用程序,會生成SparkSubmit進程,該進程只用來做Client端,應用程序提交給集群後,就會刪除該進程。
2. Resource Manager在集群中的某個NodeManager上運行ApplicationMaster,該AM同時會執行driver程序
3. 緊接著,會在各NodeManager上運行CoarseGrainedExecutorBackend來並發執行應用程序
4. 應用程序的結果,會在執行driver程序的節點的stdout中輸出,而不是打印在屏幕上。
Yarn 集群模式需要配置項:同(五)
運行Spark程序的幾種模式