概述
總體來說,每個(gè)Spark應(yīng)用程序都包含一個(gè)驅(qū)動(dòng)程序,運(yùn)行了用戶的main函數(shù)并且在集群上執(zhí)行多種并行操作。Spark提供的主要抽象就是彈性分布式數(shù)據(jù)集(RDD),它是跨節(jié)點(diǎn)的元素集合,可以并行操作。RDD可以由Hadoop文件系統(tǒng)(或者其它Hadoop支持的文件系統(tǒng))的文件創(chuàng)建,也可以通過轉(zhuǎn)換驅(qū)動(dòng)程序中已存在的Scala集合創(chuàng)建。用戶可以在內(nèi)存中緩存RDD,方便在并行操作之間有效地重用RDD。最后,RDD可以自動(dòng)從節(jié)點(diǎn)錯(cuò)誤中恢復(fù)。
Spark的第二個(gè)抽象是共享變量,可用于并行操作。默認(rèn)情況下,當(dāng)Spark將一個(gè)函數(shù)作為不同節(jié)點(diǎn)上的一組任務(wù)并行執(zhí)行時(shí),會(huì)把函數(shù)中每個(gè)變量副本分發(fā)給各個(gè)任務(wù)。有時(shí)候,變量需要在任務(wù)之間共享,或者在任務(wù)和驅(qū)動(dòng)程序之間共享。Spark支持兩種共享變量:broadcast variables(廣播變量),用于在所有節(jié)點(diǎn)內(nèi)存中緩存變量,accumulators(累加器),只允許"add"操作,如計(jì)數(shù)和求和。
這篇編程指南使用Scala展示Spark的特性。學(xué)習(xí)Spark最簡(jiǎn)單的方式就是使用交互式shell,Scala語言用bin/spark-shell。
與Spark建立連接
Spark 2.1.1默認(rèn)使用Scala2.11。(Spark也可以重新構(gòu)建,適配其它版本的Scala)。用Scala編寫應(yīng)用程序,需要使用兼容版本(如2.11.X)。
編寫Spark應(yīng)用程序,需要添加Spark的Maven依賴。
groupId = org.apache.spark
artifactId = spark-core_2.11
version = 2.1.1
另外,如果想要訪問HDFS集群,需要添加對(duì)應(yīng)HDFS的hadoop-client依賴。
groupId = org.apache.hadoop
artifactId = hadoop-client
version = <your-hdfs-version>
最后,需要在程序中引入一些Spark類。添加下面的內(nèi)容:
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
在Spark 1.3.0之前,需要顯示地添加import org.apache.spark.SparkContext._來啟用隱式轉(zhuǎn)換。
初始化Spark
Spark程序要做的第一件事就是創(chuàng)建一個(gè)SparkContext對(duì)象,Spark用它來訪問集群。創(chuàng)建SparkContext對(duì)象之前要先創(chuàng)建SparkConf對(duì)象,其中包含了應(yīng)用程序的信息。
每個(gè)JVM中只能有一個(gè)活躍的SparkContext。創(chuàng)建新的SparkContext之前必須stop()當(dāng)前活躍的SparkContext。
val conf = new SparkConf().setAppName(appName).setMaster(master)
new SparkContext(conf)
appName參數(shù)是應(yīng)用程序的名字,在集群的UI上顯示。master是一個(gè)Spark, Mesos or YARN cluster URL,或者是一個(gè)特殊的"local"字符串來運(yùn)行本地模式。在實(shí)踐中,當(dāng)在集群上運(yùn)行時(shí),不要在程序中硬編碼master,而是使用spark-submit啟動(dòng)應(yīng)用程序,然后從那里接收master參數(shù)。如果是本地測(cè)試或者單元測(cè)試,可以直接傳"local"運(yùn)行。
使用Shell
在Spark shell中,SparkContext已經(jīng)為你創(chuàng)建好了,變量名字為sc。自己創(chuàng)建SparkContext是不好使的??墒褂?code>--master參數(shù)設(shè)置上下文,使用--jars參數(shù)添加JAR包,后面跟一個(gè)逗號(hào)分隔的list。也可以給shell session添加依賴(如Spark Packages),使用--packages參數(shù)后面跟上逗號(hào)分隔的maven coordinates列表。存在依賴關(guān)系的附加庫(kù)(如Sonatype)可傳給--repositories參數(shù)。例如,在4核上運(yùn)行bin/spark-shell,使用:
$ ./bin/spark-shell --master local[4]
或者,添加code.jar,使用:
$ ./bin/spark-shell --master local[4] --jars code.jar
使用maven coordinates引入依賴:
$ ./bin/spark-shell --master local[4] --packages "org.example:example:0.1"
運(yùn)行spark-shell --help查看所有參數(shù)列表。spark-shell調(diào)用了更通用的spark-submit腳本。