Spark——幾種運行模式與作業提交


 

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,但是這樣維護成本就會變高。  

 

 

引用:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM