- Spark核心技術與高級應用
- 于俊等
- 51字
- 2019-01-01 01:24:33
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文件,則不必使用。
- MySQL從入門到精通(第3版)
- Learn Unity ML-Agents:Fundamentals of Unity Machine Learning
- Mockito Cookbook
- Oracle高性能自動化運維
- Hadoop大數據實戰權威指南(第2版)
- 數據驅動設計:A/B測試提升用戶體驗
- Scratch 3.0 藝術進階
- 貫通SQL Server 2008數據庫系統開發
- Python數據分析從小白到專家
- openGauss數據庫核心技術
- 大數據時代系列(套裝9冊)
- 數據指標體系:構建方法與應用實踐
- 算力經濟:從超級計算到云計算
- 中國云存儲發展報告
- Hands-On Deep Learning for Games