- Spark核心技術與高級應用
- 于俊等
- 101字
- 2019-01-01 01:24:37
3.3 獨立應用程序編程
不同于使用Spark Shell自動初始化SparkContext的例子,獨立應用程序需要初始化一個SparkContext作為程序的一部分,然后將一個包含應用程序信息的SparkConf對象傳遞給SparkContext構造函數。
接下來編寫簡單應用程序SimpleApp,并描述一些簡單的編碼流程。
3.3.1 創建SparkContext對象
編寫一個Spark程序,首先創建SparkConf對象,該對象包含應用的信息。SparkConf對象構建完畢,需要創建SparkContext對象,該對象可以訪問Spark集群。
// 創建SparkConf對象 val conf = new SparkConf().setAppName("Simple Application") // 創建SparkContext對象 val sc = new SparkContext(conf)
3.3.2 編寫簡單應用程序
一個常見的Hadoop數據流模式是MapReduce,Spark可以輕易地實現MapReduce數據流,我們通過Spark API創建一個簡單的Spark應用程序SimpleApp.scala。
import org.apache.spark.SparkContext import org.apache.spark.SparkContext._ import org.apache.spark.SparkConf object SimpleApp { def main(args: Array[String]) { val logFile = "$YOUR_SPARK_HOME/README.md" //測試文件 val conf = new SparkConf().setAppName("Simple Application") val sc = new SparkContext(conf) val logData = sc.textFile(logFile, 2).cache() val numAs = logData.filter(line =>line.contains("a")).count() val numBs = logData.filter(line =>line.contains("b")).count() println("Lines with a: %s, Lines with b: %s".format(numAs, numBs)) } }
這個程序統計了Spark的README.md中含有“a”的行數和含有“b”的行數。實際需要用Spark的安裝路徑替換YOUR_SPARK_HOME。
3.3.3 編譯并提交應用程序
可以采用IDEA生成Jar包的方式,也可以采取sbt或者mvn的方式打成Jar包。以sbt package為例,創建一個包含應用程序代碼的Jar包。
一旦用戶的應用程序被打包,就可以使用$SPARK_HOME./bin/spark-submit腳本啟動應用程序。spark-submit腳本負責建立Spark的類路徑和相關依賴,并支持不同的集群管理(Local、Standalone、YARN)和部署模式(Client、Cluster),通過提交參數進行區別。
1. 使用sbt打成Jar包
使用sbt打成Jar包過程如下:
sbt package ... [info] Packaging {..}/{..}/target/scala-2.10/simple-project_2.10-1.0.jar
2. 應用程序提交模板
應用程序提交模板如下:
./bin/spark-submit \ --class <main-class>\ --master <master-url>\ --deploy-mode <deploy-mode>\ ... # other options <application-jar>\ [application-arguments]
選項解釋說明:
□--class:應用程序入口位置,如org.apache.spark.examples.SparkPi。
□--master:集群的master的URL,如spark://xxx.xxx.xxx.xxx:7077;或使用local在本地單線程地運行,或使用local[N]在本地以N個線程運行。通常應該由運行local進行測試開始。
□--deploy-mode:集群部署模式,Cluster模式和Client模式(默認模式)。
□ application-jar:包含應用程序和所有依賴的Jar包的路徑。該URL必須是在集群中全局可見的,如一個hdfs://路徑或者一個在所有Worker節點都出現的f ile://路徑。
□ application-arguments:傳遞給主類的main函數的參數。
對于Python應用,在<application-jar>的位置傳入一個.py文件代替一個Jar包,并且以-py-f iles的方式在搜索路徑下加入Python.zip、.egg或.py文件。
注意
常見的部署策略是從同一物理位置,即同一個網關的服務器上提交應用程序。在這種設置中,采用Client模式比較合適。在Client模式中,Driver直接在用戶的spark-submit進程中啟動,應用程序的輸入和輸出連接到控制臺(console)。因此,這個模式對于涉及REPL(Read-Eval-Print Loop,“讀取-求值-輸出”循環)的應用程序尤其合適。
另外,如果你的應用程序是從遠離Worker機器的某臺機器上提交的(如你的筆記本電腦上),一般要用Cluster模式,使Drivers和Executors之間的網絡延遲最小化。(目前Standalone部署模式、Mesos集群模式和Python編寫的應用不支持Cluster模式。)
傳遞給Spark的Master URL可以是如表3-1所示的某個格式。
表3-1 Spark的Master URL格式及說明

3.以Local模式提交應用程序
以Local模式在4個CPU核上運行應用程序,命令如下:
$ YOUR_SPARK_HOME/bin/spark-submit \ --class "SimpleApp" \ --master local[4] \ target/scala-2.10/simple-project_2.10-1.0.jar ...
4.以Standalone模式提交應用程序
以Standalone模式運行應用程序,命令如下:
./bin/spark-submit \ --class "SimpleApp" \ --master spark://*.*.*.*:7077 \ --executor-memory 2G \ --total-executor-cores 10 \ target/scala-2.10/simple-project_2.10-1.0.jar
5.以YARN模式提交應用程序
以YARN模式運行應用程序,命令如下:
./bin/spark-submit \ --class "SimpleApp" \ --master yarn-cluster \ # 也可以是 'yarn-client' 模式
--executor-memory 2G \ --num-executors 10 \ target/scala-2.10/simple-project_2.10-1.0.jar