官术网_书友最值得收藏!

2.3 運行Spark應用程序

運行Spark應用程序主要包括Local模式運行、Standalone模式運行、YARN模式運行、Mesos模式運行(參考官方文檔)。

2.3.1 Local模式運行Spark應用程序

Local模式運行Spark應用程序是最簡單的方式,以計算圓周率的程序為例,進入安裝主目錄,如spark-1.5.0,執行命令:

            # 提交Spark任務的入口
            ./bin/spark-submit \
            #主程序設置本地,local[*],其中*是指設置線程數
            --master local[10] \
          #選擇主類名稱
          --class org.apache.spark.examples.SparkPi \
          #examples Jar包
          /home/hadoop/spark-1.5.0/lib/spark-examples-1.5.0-hadoop2.3.0.jar

執行結果如下:

          *** INFO spark.SparkContext: Starting job: reduce at SparkPi.scala:35
          ……
          *** INFO spark.SparkContext: Job finished: reduce at SparkPi.scala:35, took 0.751093979 s
          Pi is roughly 3.14826 # 計算出Pi值,表明運行成功。

2.3.2 Standalone模式運行Spark應用程序

Spark獨立模式下應用程序的運行以及資源調度、監控和日志等內容會在接下來做簡單的介紹。

1. spark-shell運行應用程序

在Spark集群上運行應用程序,需要將Master的Spark://IP:PORT傳遞給SparkContext構造函數。

在集群上運行交互式的Spark命令spark-shell,該命令將會用spark-env.sh中的SPARK_MASTER_IP和SPARK_MASTER_PORT自動設置Master。

./bin/spark-shell --master spark:// IP:PORT

另外,還可以通過傳遞一個--cores<numCore>來控制spark-shell在集群上使用的核心的數目。

2. spark-submit啟動應用程序

spark-submit腳本提供了一種向集群提交Spark應用程序的最直接的方法,對于一個獨立部署模式的集群,Spark目前支持Client部署模式,即在提交應用的客戶端進程中部署Driver。

如果應用程序通過spark-submit啟動,那么應用程序的Jar包將會自動地分配給所有的Worker節點;對于任何其他運行應用程序時需要依賴的Jar包,可以通過-jar聲明,Jar包名之間用逗號隔開。

以SparkPi為例,提交應用程序命令如下:

          ./bin/spark-submit \
              --class org.apache.spark.examples.SparkPi \
              --master spark://$YOUR_MASTER_IP:7077 \
              --executor-memory 2G \
              --total-executor-cores 2 \
          $YOUR_SPARK_HOME/lib/spark-examples-1.5.0-hadoop2.3.0.jar

其中,spark-submit為提交Spark任務的腳本,--class org.apache.spark.examples.SparkPi為Spark項目包中指定運行的類的全路徑。--master spark://$YOUR_MASTER_IP:7077為主節點的路徑和端口號。$YOUR_SPARK_HOME/lib/spark-examples-1.5.0-hadoop2.3.0.jar是Spark項目程序包的路徑。

直接運行即可驗證Spark在Standalone模式下的計算圓周率的程序。如果啟動上述應用程序成功,則執行結果如下:

            *** INFO client.AppClient$ClientActor: Connecting to master spark://$YOUR_MASTER_
            IP:7077...
            *** INFO spark.SparkContext: Starting job: reduce at SparkPi.scala:35
            ……
            *** INFO spark.SparkContext: Job finished: reduce at SparkPi.scala:35, took
            15.530349566 s
            Pi is roughly 3.14058

當出現Pi is roughly 3.14058,表明計算成功。

3.資源調度

獨立部署模式支持FIFO作業調度策略。不過,為了允許多并發執行,你可以控制每一個應用可獲得的資源最大值。默認情況下,如果集群中一次只運行一個應用程序,它就會獲得所有CPU核。你可以在SparkConf中設置spark.cores.max來配置獲得最多內核的數量,示例如下所示:

            val conf = new SparkConf()
                      .setMaster(...)
                      .setAppName(...)
                      .set("spark.cores.max", "10")
            val sc = new SparkContext(conf)

除此之外,還可以通過配置集群上的spark.deploy.defaultCores來改變應用程序使用的默認值,而不必設置spark.cores.max,需要在spark-env.sh中加入以下內容:

export SPARK_MASTER_OPTS="-Dspark.deploy.defaultCores=<value>"

當用戶不會在共享集群上獨立配置CPU核數最大值的時候,這顯得特別重要。

4.監控和日志

Spark獨立部署模式提供了一個基于Web的用戶接口,監控集群運行狀況。Master和每一個Worker都會有一個WebUI來顯示集群的統計信息。默認情況下,可以通過8080端口訪問Master的WebUI。

另外,每個Slave節點上作業運行的日志也會詳細地記錄到默認的$SPARK_HOME/work目錄下每個作業會對應兩個文件:stdout和stderr,包含了控制臺上所有的歷史輸出。

如圖2-2所示,本書所用數據平臺是通過$YOUR_SPARK_MASTER_IP:8080訪問集群統計信息情況。

圖2-2 Spark集群統計信息

2.3.3 YARN模式運行Spark

Spark 0.6版本以后,加入了對在Hadoop YARN上運行的支持,并在之后發布版本中不斷演進,逐漸發展成Spark應用程序運行的主要模式。

Hadoop與Spark部署完畢后,即可在YARN上運行Spark程序。其任務提交的方式與獨立模式類似,只是工作原理有一些不同。

(1)在YARN上啟動Spark應用

在YARN上啟動Spark應用有兩種模式:yarn-cluster模式和yarn-client模式。

在yarn-cluster模式下,框架會在集群中啟動的Driver程序;

在yarn-client模式中,框架會在client端啟動Driver程序。在YARN中,Resourcemanager的地址是從Hadoop配置中選取的。因此,master參數可以簡單配置為yarn-client或yarn-cluster。

要在yarn-cluster模式下調用Spark應用,示例如下:

          ./bin/spark-submit \
          --class path.to.your.Class \
          --master yarn-cluster [options] <app jar> [app options]

以SparkPi為例,提交應用程序命令如下:

          $ ./bin/spark-submit --class org.apache.spark.examples.SparkPi \
              --master yarn-cluster \
              --num-executors 3 \
              --driver-memory 4g \
              --executor-memory 2g \
            --executor-cores 2 \
            $YOUR_SPARK_HOME/lib/spark-examples-1.5.0-hadoop2.3.0.jar \
            10

首先啟動一個Application Master的客戶程序,之后SparkPi將作為Application Master的一個子進程運行。

Client會周期性地檢查Application Master以獲得狀態更新,當應用程序運行結束時,Client會立刻退出。

要以yarn-client模式啟動一個Spark應用,操作相同,用“yarn-client”替換“yarn-cluster”即可。

在YARN模式下,通過spark-submit提交任務應用程序,示例如下:

            ./bin/spark-submit \
                --class org.apache.spark.examples.SparkPi \
                --master yarn-client \
                --executor-memory 2G \
                --num-executors 3 \
            $YOUR_SPARK_HOME/lib/spark-examples-1.5.0-hadoop2.3.0.jar

直接運行上述程序即可測試Spark在YARN模式下計算圓周率的程序。

(2)添加其他的Jar包

在yarn-cluster模式下,Driver和Client運行于不同的機器,SparkContext.addJar不會作用于Client本地文件。要使SparkContext.addJar可使用Client的本地文件,在啟動指令中的--jars選項中加入文件。

            $ ./bin/spark-submit
            --class my.main.Class \
            --master yarn-cluster \
            --jars my-other-jar.jar,my-other-other-jar.jar
            my-main-jar.jar app_arg1 app_arg2

(3)監控和日志

程序運行完畢后,如果Hadoop集群配置完畢,那么在Hadoop集群Cluster頁面上,也就是在http://$YOUR_MASTER_IP:8088/cluster/apps/FINISHED路徑下可以看到執行完成的Spark程序及其輸出日志,或者在http://$YOUR_MASTER_IP:8080/路徑下可以看到執行的Spark任務。

如圖2-3所示,本書所用數據平臺是通過$YOUR_MASTER_IP:8088訪問集群統計信息情況。

圖2-3 Spark YARN模式任務統計信息

2.3.4 應用程序提交和參數傳遞

提交任務是Spark運行的起步,理解任務提交時不同參數的含義十分重要。

1.應用程序提交過程

Spark應用程序在集群上以獨立進程集合的形式運行,接受用戶Driver程序中main函數SparkContext對象的協調。

確切來說,當任務提交到集群上,SparkContext對象可以與多種集群管理器(Standalone部署、Mesos、YARN模式)連接,這些集群管理器負責為所有應用分配資源。

一旦連接建立,Spark可以在集群的節點上獲得Executor,這些Executor進程負責執行計算和為應用程序存儲數據。

接下來,Spark會將應用程序代碼(傳遞給SparkContext的Jar或Python文件)發送給Executor。

最后,SparkContext將任務發送至Executor執行,圖2-4所示為Spark任務提交流程。

圖2-4 Spark任務提交流程圖

執行過程中,需要注意以下情況:

1)每個應用程序都會獲得自己擁有的Executor進程,這些進程的生命周期持續在整個應用運行期間,并以多線程的方式執行任務。無論是在Driver驅動程序,還是Executor執行進程,都能很好地隔離應用程序,如果沒有將數據寫到外部存儲,該數據就不能被其他Spark應用共享。

2)Spark對集群管理器是不可知的,只要Spark能夠獲取Executor進程,并且這些Executor之間可以相互通信,Spark不關注集群管理器是否支持其他的業務,如YARN同時支持MapReduce程序的運行。

3)因為Driver負責與集群上的任務交互,所以Driver應該運行于距離Worker節點近的地方,最好在同一個本地局域網之中。如果想要給集群發送遠程請求,那么請為Driver安裝RPC協議并從附近提交,而不是在遠離Worker節點的地方運行Driver。

2.配置參數傳遞

在SparkConf中顯式配置的參數具有最高優先級,然后是傳遞給spark-submit的標志位,最后是默認屬性配置文件中的值。

如果沒有在SparkConf中顯示配置,又不想在spark-submit中提交,可以通過默認屬性配置文件獲取值。spark-submit腳本可以從屬性文件中加載Spark配置值,并將它們傳遞給應用程序。

默認情況下,spark-submit腳本將會從Spark目錄下的conf/spark-defaults.conf中讀取配置選項。例如,如果Spark的Master屬性已經設置,spark-submit提交時可以省略--master標志。

如果應用程序代碼依賴于其他的項目,需要將它們與應用程序一起打包,以便應用程序的代碼可以分發到Spark集群之上。為此,需要創建一個包含應用程序代碼和其依賴的Jar包(當創建Jar包時,需要將Spark和Hadoop作為提供依賴項;這兩者不需要被打入包中,在運行時由集群管理器提供加載)。

一旦擁有Jar包,就可以在調用bin/spark-submit腳本時傳遞Jar包。應用程序的Jar包和所有在--jars選項中的Jar包都會被自動地傳遞到集群。Spark使用下面的URL支持按不同的策略散播的Jar包。

□ f ile:Driver的HTTP文件服務器提供了絕對路徑和f ile:// URI,所有的Executor節點從Driver的HTTP服務器處獲得文件。

□ hdfs:從HDFS的URI獲取文件和Jar包。

□ local以每個Worker節點相同的local:/開頭的URI文件。

注意

在Executor節點上的每個SparkContext對象的Jar包和文件會被復制到工作目錄下。這可能會占用大量的空間,并且需要被及時清除。在YARN集群上,清除是自動執行的。在Standalone模式部署集群上,自動清除可以通過spark.worker.cleamup. appDataTtl屬性配置。

當在yarn-cluster模式下對本地文件使用--jars選項時,該選項允許你使用SparkContext. addJar函數。若對于HDFS、HTTP、HTTPS或FTP文件,則不必使用。

主站蜘蛛池模板: 富裕县| 绍兴县| 普兰店市| 辛集市| 永康市| 盱眙县| 福州市| 乌审旗| 铁岭县| 卢湾区| 建湖县| 海晏县| 阿合奇县| 德安县| 南城县| 临沂市| 苏尼特右旗| 余江县| 馆陶县| 长海县| 温泉县| 保山市| 贡嘎县| 崇阳县| 阿拉善盟| 景泰县| 响水县| 武山县| 邵武市| 皋兰县| 文登市| 曲松县| 南和县| 内黄县| 武功县| 集贤县| 上栗县| 永州市| 互助| 蛟河市| 长岛县|