Spark1.0.0 應用程式部署工具spark-submit

weixin_34162629發表於2015-04-28

  原文連結:http://blog.csdn.net/book_mmicky/article/details/25714545

隨著Spark的應用越來越廣泛,對支援多資源管理器應用程式部署工具的需求也越來越迫切。Spark1.0.0的出現,這個問題得到了逐步改善。從Spark1.0.0開始,Spark提供了一個容易上手的應用程式部署工具bin/spark-submit,可以完成Spark應用程式在local、Standalone、YARN、Mesos上的快捷部署。

 
1:使用說明
      進入$SPARK_HOME目錄,輸入bin/spark-submit --help可以得到該命令的使用幫助。
hadoop@wyy:/app/hadoop/spark100$ bin/spark-submit --help
Usage: spark-submit [options] <app jar | python file> [app options]
Options:
  --master MASTER_URL         spark://host:port, mesos://host:port, yarn, or local.
  --deploy-mode DEPLOY_MODE   driver執行之處,client執行在本機,cluster執行在叢集
  --class CLASS_NAME          應用程式包的要執行的class
  --name NAME                 應用程式名稱
  --jars JARS                 用逗號隔開的driver本地jar包列表以及executor類路徑
  --py-files PY_FILES         用逗號隔開的放置在Python應用程式PYTHONPATH上的.zip, .egg, .py檔案列表
  --files FILES               用逗號隔開的要放置在每個executor工作目錄的檔案列表
  --properties-file FILE      設定應用程式屬性的檔案放置位置,預設是conf/spark-defaults.conf
  --driver-memory MEM         driver記憶體大小,預設512M
  --driver-java-options       driver的java選項
  --driver-library-path       driver的庫路徑Extra library path entries to pass to the driver
  --driver-class-path         driver的類路徑,用--jars 新增的jar包會自動包含在類路徑裡
  --executor-memory MEM       executor記憶體大小,預設1G

 Spark standalone with cluster deploy mode only:
  --driver-cores NUM          driver使用核心數,預設為1
  --supervise                 如果設定了該引數,driver失敗是會重啟

 Spark standalone and Mesos only:
  --total-executor-cores NUM  executor使用的總核數

 YARN-only:
  --executor-cores NUM        每個executor使用的核心數,預設為1
  --queue QUEUE_NAME          提交應用程式給哪個YARN的佇列,預設是default佇列
  --num-executors NUM         啟動的executor數量,預設是2個
  --archives ARCHIVES         被每個executor提取到工作目錄的檔案列表,用逗號隔開

      關於以上spark-submit的help資訊,有幾點需要強調一下:
  • 關於--master  --deploy-mode,正常情況下,可以不需要配置--deploy-mode,使用下面的值配置--master就可以了,使用類似 --master spark://host:port --deploy-mode cluster會將driver提交給cluster,然後就將worker給kill的現象。
 Master URL  含義
 local  使用1個worker執行緒在本地執行Spark應用程式
 local[K]  使用K個worker執行緒在本地執行Spark應用程式
 local[*]  使用所有剩餘worker執行緒在本地執行Spark應用程式
 spark://HOST:PORT  連線到Spark Standalone叢集,以便在該叢集上執行Spark應用程式
 mesos://HOST:PORT  連線到Mesos叢集,以便在該叢集上執行Spark應用程式
 yarn-client  以client方式連線到YARN叢集,叢集的定位由環境變數HADOOP_CONF_DIR定義,該方式driver在client執行。
 yarn-cluster  以cluster方式連線到YARN叢集,叢集的定位由環境變數HADOOP_CONF_DIR定義,該方式driver也在叢集中執行。
  • 如果要使用--properties-file的話,在--properties-file中定義的屬性就不必要在spark-sumbit中再 定義了,比如在conf/spark-defaults.conf 定義了spark.master,就可以不使用--master了。關於Spark屬性的優先權為:SparkConf方式 > 命令列引數方式 >檔案配置方式,具體參見Spark1.0.0屬性配置
  • 和之前的版本不同,Spark1.0.0會將自身的jar包和--jars選項中的jar包自動傳給叢集。
  • Spark使用下面幾種URI來處理檔案的傳播:
    • file:// 使用file://和絕對路徑,是由driver的HTTP server來提供檔案服務,各個executor從driver上拉回檔案。
    • hdfs:, http:, https:, ftp: executor直接從URL拉回檔案
    • local: executor本地本身存在的檔案,不需要拉回;也可以是通過NFS網路共享的檔案。
  • 如果需要檢視配置選項是從哪裡來的,可以用開啟--verbose選項來生成更詳細的執行資訊以做參考。

2:測試環境
  • 測試程式來源於使用IntelliJ IDEA開發Spark1.0.0應用程式,將測試其中的WordCount1和WordCount2這兩個Class。
  • 測試資料來源於搜狗的使用者查詢日誌(SogouQ),詳見Spark1.0.0 開發環境快速搭建,雖然用這個資料集測試不是很理想,但由於其完整版足夠大,可以分割其中部分資料進行測試,在加上其他例程需要使用,將就採用了這個資料集。實驗中分別擷取100000行(SogouQ1.txt)和200000行(SogouQ2.txt)做實驗。

3:準備工作
A:叢集
切換到使用者hadoop啟動Spark1.0.0 開發環境快速搭建中搭建的虛擬叢集
[hadoop@hadoop1 ~]$ su - hadoop
[hadoop@hadoop1 ~]$ cd /app/hadoop/hadoop220
[hadoop@hadoop1 hadoop220]$ sbin/start-all.sh
[hadoop@hadoop1 hadoop220]$ cd ../spark100/
[hadoop@hadoop1 spark100]$ sbin/start-all.sh

B:客戶端
在客戶端切換到使用者hadoop並切換到/app/hadoop/spark100目錄,將實驗資料上傳hadoop叢集,然後將使用IntelliJ IDEA開發Spark1.0.0應用程式生成的程式包複製過來。
mmicky@wyy:~/data$ su - hadoop
hadoop@wyy:~$ cd /app/hadoop/hadoop220
hadoop@wyy:/app/hadoop/hadoop220$ bin/hdfs dfs -mkdir -p /dataguru/data
hadoop@wyy:/app/hadoop/hadoop220$ bin/hdfs dfs -put /home/mmicky/data/SogouQ1.txt /dataguru/data/
hadoop@wyy:/app/hadoop/hadoop220$ bin/hdfs dfs -put /home/mmicky/data/SogouQ2.txt /dataguru/data/
檢查SogouQ1.txt的塊分佈,以後資料本地性分析的時候會用到
hadoop@wyy:/app/hadoop/hadoop220$ bin/hdfs fsck /dataguru/data/SogouQ1.txt -files -blocks -locations -racks
Connecting to namenode via http://hadoop1:50070
FSCK started by hadoop (auth:SIMPLE) from /192.168.1.111 for path /dataguru/data/SogouQ1.txt at Sat Jun 14 03:47:39 CST 2014
/dataguru/data/SogouQ1.txt 108750574 bytes, 1 block(s):  OK
0. BP-1801429707-192.168.1.171-1400957381096:blk_1073741835_1011 len=108750574 repl=1 [/default-rack/192.168.1.171:50010]

檢查SogouQ2.txt的塊分佈,以後資料本地性分析的時候會用到
hadoop@wyy:/app/hadoop/hadoop220$ bin/hdfs fsck /dataguru/data/SogouQ2.txt -files -blocks -locations -racks
Connecting to namenode via http://hadoop1:50070
FSCK started by hadoop (auth:SIMPLE) from /192.168.1.111 for path /dataguru/data/SogouQ2.txt at Sat Jun 14 03:48:07 CST 2014
/dataguru/data/SogouQ2.txt 217441417 bytes, 2 block(s):  OK
0. BP-1801429707-192.168.1.171-1400957381096:blk_1073741836_1012 len=134217728 repl=1 [/default-rack/192.168.1.173:50010]
1. BP-1801429707-192.168.1.171-1400957381096:blk_1073741837_1013 len=83223689 repl=1 [/default-rack/192.168.1.172:50010]

切換到spark目錄並複製程式包
hadoop@wyy:/app/hadoop/hadoop220$ cd ../spark100
hadoop@wyy:/app/hadoop/spark100$ cp /home/mmicky/IdeaProjects/week2/out/artifacts/week2/week2.jar .

4:實驗
下面給出了幾種實驗CASE的命令,具體的執行架構會抽取幾個例子在Spark1.0.0 on Standalone 執行架構例項解析說明。

在使用spark-submit提交spark應用程式的時候,需要注意以下幾點:
  • 叢集外的客戶機向Spark Standalone部署Spark應用程式時,要注意事先實現該客戶機和Spark Standalone之間的SSH無密碼登入。
  • 向YARN部署spark應用程式的時候,注意executor-memory的大小,其記憶體加上container要使用的記憶體(預設值是1G)不要超過NM可用記憶體,不然分配不到container來執行executor。
  • 關於python程式的部署可以參考Spark1.0.0 多語言程式設計之python實現 和 Spark1.0.0 on YARN 模式部署 。

相關文章