Spark-shell 參數
-
Spark-shell 是以一種交互式命令行方式將Spark應用程序跑在指定模式上,也可以通過Spark-submit提交指定運用程序,Spark-shell 底層調用的是Spark-submit,二者的使用參數一致的,通過- -help 查看參數:
- -master: 指定運行模式,spark://host:port, mesos://host:port, yarn, or local[n].
- -deploy-mode: 指定將driver端運行在client 還是在cluster.
- -class: 指定運行程序main方法類名,一般是應用程序的包名+類名
- -name: 運用程序名稱
- -jars: 需要在driver端和executor端運行的jar,如mysql驅動包
- -packages: maven管理的項目坐標GAV,多個以逗號分隔
- -conf: 以key=value的形式傳入sparkconf參數,所傳入的參數必須是以spark.開頭
- -properties-file: 指定新的conf文件,默認使用spark-default.conf
- -driver-memory: 指定driver端運行內存,默認1G
- -driver-cores:指定driver端cpu數量,默認1,僅在Standalone和Yarn的cluster模式下
- -executor-memory:指定executor端的內存,默認1G
- -total-executor-cores:所有executor使用的cores
- -executor-cores: 每個executor使用的cores
- -driver-class-path: driver端的classpath
- -executor-class-path: executor端的classpath
- --num-executors 10:executor數量
-
sparkconf的傳入有三種方式:
- 1.通過在spark應用程序開發的時候用set()方法進行指定
- 2.通過在spark應用程序提交的時候用過以上參數指定,一般使用此種方式,因為使用較為靈活
- 3.通過配置spark-default.conf,spark-env.sh文件進行指定,此種方式較shell方式級別低
一、Local
Local 模式是最簡單的一種Spark運行方式,它采用單節點多線程(cpu)方式運行,local模式是一種OOTB(開箱即用)的方式,只需要在spark-env.sh導出JAVA_HOME。
不用啟動Spark的Master、Worker守護進程,也不用啟動Hadoop的各服務(除非你要用到HDFS),無需其他任何配置即可使用,因而常用於開發和學習。
./bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master local[8] \ /path/to/examples.jar \ 100
注:local[8]:代表線程數。
二、Standalone
Spark獨立群集模式。Spark可以通過部署與Yarn的架構類似的框架來提供自己的集群模式,該集群模式的架構設計與HDFS和Yarn大相徑庭。
該模式需要在每個機器上部署spark,然后啟動spark集群,分為master和worker節點。不用啟動Hadoop服務(除非你用到了HDFS的內容)。
這種運行模式,可以使用Spark的 http://spark1:8080 來觀察資源和應用程序的執行情況。
配置
通過配置spark-env.sh和slaves文件來部署,可以通過以下配置:
vi conf/spark-env.sh SPARK_MASTER_HOST=192.168.137.200 ##配置Master節點 SPARK_WORKER_CORES=2 ##配置應用程序允許使用的核數(默認是所有的core) SPARK_WORKER_MEMORY=2g ##配置應用程序允許使用的內存(默認是1G)
vi conf/slaves 192.168.137.200 192.168.137.201 192.168.137.202
啟動集群:
sbin/start-all.sh
Web UI:
192.168.137.200:8080
on Standalone的倆種模式
1、Standalone的倆種模式:一種為 client,一種為 cluster,可以通過 --deploy-mode 進行指定。
-
client
以客戶端模式在Spark獨立群集上運行:
# Run on a Spark standalone cluster in client deploy mode ./bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master spark://207.184.161.138:7077 \
--deploy-mode client \
--executor-memory 20G \
--total-executor-cores 100 \
/path/to/examples.jar \
1000
產生的進程:
①. Master進程做為cluster manager,用來對應用程序申請的資源進行管理
②. SparkSubmit 做為Client端和運行driver程序
③. CoarseGrainedExecutorBackend 用來並發執行應用程序
-
cluster
以集群模式在Spark獨立群集上運行,並使用supervisor:
# Run on a Spark standalone cluster in cluster deploy mode with supervise ./bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master spark://207.184.161.138:7077 \ --deploy-mode cluster \ --supervise \ --executor-memory 20G \ --total-executor-cores 100 \ /path/to/examples.jar \ 1000
2、Standalone倆種模式的區別:
①. 客戶端的SparkSubmit進程會在應用程序提交給集群之后就退出
②. Master會在集群中選擇一個Worker進程生成一個子進程DriverWrapper來啟動driver程序
③. 而該DriverWrapper 進程會占用Worker進程的一個core,所以同樣的資源下配置下,會比第3種運行模式,少用1個core來參與計算
④. 應用程序的結果,會在執行driver程序的節點的stdout中輸出,而不是打印在屏幕上
三、Yarn
現在越來越多的場景,都是Spark跑在Hadoop集群中,建議在生產上使用該模式,統一使用YARN對整個集群作業(MR/Spark)的資源均衡調度。
Spark 通過客戶端,負責提交作業到yarn上運行(首先需要啟動Yarn集群)。這個不需要Spark集群(只需要在Hadoop分布式集群中任選一個節點安裝配置Spark即可),
但要啟動Hadoop的各種服務,這里包括 YARN 和 HDFS 都需要啟動,因為在計算過程中 Spark 會使用 HDFS 存儲臨時文件,如果 HDFS 沒有啟動,則會拋出異常。
將Spark應用程序跑在Yarn集群之上,通過Yarn資源調度將executor啟動在container中,從而完成driver端分發給executor的各個任務。
這種運行模式,可以使用Yarn的 http://hadoop001:8088/cluster 來觀察資源和應用程序的執行情況。
配置
提交作業之前需要將HADOOP_CONF_DIR或YARN_CONF_DIR配置到spark-env.sh中:
vi conf/spark-env.sh HADOOP_CONF_DIR=/opt/software/hadoop-2.6.0-cdh5.7.0/etc/hadoop
on Yarn的倆種模式
1、Yarn的倆種模式:一種為 client,一種為 cluster,可以通過 --deploy-mode 進行指定。
-
client
- Driver運行在Client端;
- Client請求Container完成作業調度執行,Client不能退出;
- 日志在Client控制台輸出,方便查看;

以客戶端模式在Yarn集群上運行:
export HADOOP_CONF_DIR=XXX ./bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master yarn \ --deploy-mode client \
--executor-memory 20G \ --num-executors 50 \ /path/to/examples.jar \ 1000
產生的進程:
①. 在Resource Manager節點上提交應用程序,會生成SparkSubmit進程,該進程會執行driver程序。
②. RM會在集群中的某個NodeManager上,啟動一個ExecutorLauncher進程,來做為ApplicationMaster。
③. RM也會在多個NodeManager上生成CoarseGrainedExecutorBackend進程來並發的執行應用程序。
-
cluster
- 在Resource Manager端提交應用程序,會生成SparkSubmit進程,該進程只用來做Client端,應用程序提交給集群后,就會刪除該進程(就可以關掉?)
- Resource Manager在集群中的某個NodeManager上運行ApplicationMaster,該AM同時會執行driver程序。緊接着,會在各NodeManager上運行CoarseGrainedExecutorBackend來並發執行應用程序
- 應用程序的結果,會在執行driver程序(即ApplicationMaster)的節點的stdout中輸出,也可通過 yarn logs -applicationId <application_id> 查看

以集群模式在Yarn集群上運行:
export HADOOP_CONF_DIR=XXX ./bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master yarn \ --deploy-mode cluster \
--executor-memory 20G \ --num-executors 50 \ /path/to/examples.jar \ 1000
2、Yarn倆種模式的區別:
①. 在於driver端啟動在本地(client),還是在Yarn集群內部的AM中(cluster)。
②. client提交作業的進程是不能停止的,否則作業就掛了;cluster提交作業后就斷開了,因為driver運行在AM中。
③. client提交的作業,日志在客戶端看不到,因為作業運行在yarn上,可以通過 yarn logs -applicationId <application_id> 查看。
④. Cluster適合生產環境,Client適合交互和調試。
四、Mesos
# Run on a Mesos cluster in cluster deploy mode with supervise ./bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master mesos://207.184.161.138:7077 \ --deploy-mode cluster \ --supervise \ --executor-memory 20G \ --total-executor-cores 100 \ http://path/to/examples.jar \ 1000
具體參見:http://spark.apache.org/docs/latest/running-on-mesos.html
五、Kuberneters
# Run on a Kubernetes cluster in cluster deploy mode ./bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master k8s://xx.yy.zz.ww:443 \ --deploy-mode cluster \ --executor-memory 20G \ --num-executors 50 \ http://path/to/examples.jar \ 1000
具體參見:http://spark.apache.org/docs/latest/running-on-kubernetes.html
六、總結
這幾種分布式部署方式各有利弊,通常需要根據實際情況決定采用哪種方案。進行方案選擇時,往往要考慮公司的技術路線(采用Hadoop生態系統還是其他生態系統)、相關技術人才儲備等。
- 如果你只是測試Spark Application,你可以選擇Local模式。
- 如果你數據量不是很多,屬於小規模計算集群,Standalone 是個不錯的選擇。
- 當你需要統一管理集群資源(Hadoop、Spark等),那么你可以選擇Yarn或者Mesos,但是這樣維護成本就會變高。
引用:
