* SparkCore基礎(chǔ)(二)
繼續(xù)探討SparkCore,開門見山,不多廢話。
SparkApplication結(jié)構(gòu)探討
包含關(guān)系:
之前我們運(yùn)行過很多App了,其實(shí)每一個App都包含若干個Job任務(wù);
而Job任務(wù)呢,一般都是由RDD的Action動作發(fā)出的eg:first、count、collect等等;
一個Job任務(wù)包含多個Stage,各個Stage之間是互相依賴的,比如,第一個stage沒有走完,是不會走第二個stage的,對于同一個stage,所有的task的業(yè)務(wù)邏輯相同,而處理的數(shù)據(jù)不同;
一個Stage包含多個Task。
運(yùn)行構(gòu)成:
對于Spark Application的集群運(yùn)行情況來講,都有兩個部分組成
** Driver:每個應(yīng)用都有一個driver,在其中的main方法中實(shí)例化SparkContext,從而創(chuàng)建RDD,然后向Master或者ResourceManager申請資源來運(yùn)行Executor,調(diào)度Job任務(wù)
** Executor:相當(dāng)于MapReduce中的Map Task一樣,是一個JVM進(jìn)程,用于運(yùn)行Task,以線程形式運(yùn)行

下面是Spark集群的一些概念簡述:

RDD進(jìn)一步探討
RDD是什么:
** ?是一系列分區(qū)的數(shù)據(jù)集合,類似于Hadoop中的split
** 每個分區(qū)都可以應(yīng)用某個函數(shù)去運(yùn)算
** RDD之間具有依賴關(guān)系,例如,RDD1 轉(zhuǎn)換為RDD2時,那么RDD2就依賴于RDD1
** 可以指定key-value形式的RDD的分區(qū)規(guī)則,比如hash
** RDD可以選擇最優(yōu)的讀取數(shù)據(jù)的位置,比如:從內(nèi)存讀?從本地讀?或者設(shè)置了多個副本,決定從哪個副本讀數(shù)據(jù)是最優(yōu)的。
IDEA工具開發(fā)Spark
Step1、創(chuàng)建一個Scala項(xiàng)目

Step2、創(chuàng)建項(xiàng)目名稱以及指定路徑后直接Finish

Step3、在File--Project Structure選項(xiàng)的Modules中創(chuàng)建目錄結(jié)構(gòu)如圖,注意文件夾圖標(biāo)樣式,main和test中的resources文件夾圖標(biāo)是有區(qū)別的

Step4、在Libraries中點(diǎn)擊加號導(dǎo)入Spark相關(guān)依賴Jar(這里我導(dǎo)入的Jar是CDH-Spark根目錄下的lib目錄下的Jar,這里不需要導(dǎo)入example相關(guān)Jar)

Step5、將HDFS的兩個配置文件拷入到resources目錄下

Step6、創(chuàng)建一個Scala-object,編寫代碼如下:

IDEA打包SparkJar
我們也可以使用IDEA打包編寫好的SparkJar包然后使用spark-submit命令提交任務(wù)
Step1、點(diǎn)擊Artifacts標(biāo)簽后,點(diǎn)擊加號,選擇JAR-from modules from dependencies

Step2、點(diǎn)擊紅框內(nèi)容后,出現(xiàn)藍(lán)框內(nèi)容

Step3、搞定后,刪除掉關(guān)于Spark和Hadoop的相關(guān)依賴,打包自己的工程時,不需要將Spark和Hadoop的Jar也打包入你的工程里,這樣會增加你的工程的體積(官方描述:The user's jar should never include Hadoop or Spark libraries, however, these will be added at runtime.),點(diǎn)擊減號刪除到如下所示:

Step4、OK后,選擇Build-Build Artifacts-Build,然后去對應(yīng)目錄下,拷貝出Build好的Jar到Linux,什么?不知道生成的Jar在哪?你看看上圖中Output directory屬性
Step5、運(yùn)行你的Jar
$ bin/spark-submit --master spark://z01:7077 /home/z/Desktop/FirstSpark.jar
Spark在Yarn上運(yùn)行
相關(guān)文檔:http://spark.apache.org/docs/1.6.1/running-on-yarn.html
運(yùn)行Spark應(yīng)用有兩種模式:
1、在Client端所在節(jié)點(diǎn)運(yùn)行
這種情況比較適用于調(diào)試應(yīng)用程序,比如:
Yarn:
bin/spark-submit \
--master yarn \
--deploy-mode client \
/home/z/Desktop/FirstSpark.jar
2、在Cluster中運(yùn)行
Yarn:
$ bin/spark-submit \
--master yarn \
--deploy-mode cluster \
/home/z/Desktop/FirstSpark.jar
以上兩種模式的區(qū)別在于:
Client模式:
Spark App的Driver請求ResourceManager,產(chǎn)生一個ApplicationMaster,然后由ApplicationMaster向ResourceManager申請資源,ResourceManager分配Container給NodeManager,然后由NodeManager運(yùn)行其上的Executor。
Cluster模式:
Driver運(yùn)行節(jié)點(diǎn)即ApplicationMaster節(jié)點(diǎn),后面的操作你懂得,跟Client模式差不多了。
注意:spark-shell只能在client模式下運(yùn)行,比如默認(rèn)deploty-mode其實(shí)如下
Standalone:
$ bin/spark-shell?--master spark://z01:7077 --deploy-mode client
Spark的廣播使用
廣播這個概念在不同的計(jì)算機(jī)領(lǐng)域中都有涉及,那么在Spark中,如果你想過濾掉一些特殊符號,在這樣的情境中,就可以使用廣播(不使用行不行?行!但消耗更多。)首先我們先上代碼:

代碼中,注意紅框部分,我們使用廣播過濾掉了一些特殊字符的統(tǒng)計(jì)。如果不適用廣播,意味著list特殊字符集合中的所有信息都需要拷貝到所有的數(shù)據(jù)分區(qū)中,如果使用了廣播,只需要將數(shù)據(jù)廣播到指定的Executor中即可。
Spark中Maven項(xiàng)目的構(gòu)建
在構(gòu)建項(xiàng)目時,可以選擇使用mvn命令構(gòu)建,當(dāng)然也可以使用IDEA的可視化界面構(gòu)建,那么我們下面分別探討兩種方式:
方式一:環(huán)境-Linux(不推薦,當(dāng)然也要看喜好)
方式二:環(huán)境-Windows(推薦)
Step1、打開IDEA工具,選擇Create new project,選擇Maven,點(diǎn)擊Create from archetype,留意紅框內(nèi)容

Step2、Next后,不必解釋過多了吧?如圖:

Step3、選擇你的Maven倉庫地址,默認(rèn)在.m2目錄下,可以自己指定,稍后會自動下載相關(guān)依賴

Step4、Next后,編輯項(xiàng)目的一些基本信息,finish即可,如圖:

Step5、打開pom.xml,配置一些后邊課程我們可能會用到的依賴,剩下的目錄配置等等,和之前的我們學(xué)過的一樣

Step6、最后完成時,你會發(fā)現(xiàn)導(dǎo)入的jar包在左邊的External Libraries中看到如下內(nèi)容

最后,在剛創(chuàng)建好的Maven工程中寫一個WordCount試試?:)
* 總結(jié)
學(xué)會這些基礎(chǔ)操作后,可以進(jìn)行更多的拓展,比如分析一下apache的日志?請參看官方完整案例。
IT全棧公眾號:

QQ大數(shù)據(jù)技術(shù)交流群(廣告勿入):476966007

下一節(jié):SparkSQL基礎(chǔ)