* SparkCore基礎(chǔ)(二)
繼續(xù)探討SparkCore可缚,開門見山,不多廢話。
SparkApplication結(jié)構(gòu)探討
包含關(guān)系:
之前我們運(yùn)行過很多App了成肘,其實(shí)每一個(gè)App都包含若干個(gè)Job任務(wù);
而Job任務(wù)呢斧蜕,一般都是由RDD的Action動(dòng)作發(fā)出的eg:first双霍、count、collect等等批销;
一個(gè)Job任務(wù)包含多個(gè)Stage洒闸,各個(gè)Stage之間是互相依賴的,比如均芽,第一個(gè)stage沒有走完丘逸,是不會(huì)走第二個(gè)stage的,對于同一個(gè)stage掀宋,所有的task的業(yè)務(wù)邏輯相同深纲,而處理的數(shù)據(jù)不同;
一個(gè)Stage包含多個(gè)Task劲妙。
運(yùn)行構(gòu)成:
對于Spark Application的集群運(yùn)行情況來講湃鹊,都有兩個(gè)部分組成
** Driver:每個(gè)應(yīng)用都有一個(gè)driver,在其中的main方法中實(shí)例化SparkContext镣奋,從而創(chuàng)建RDD币呵,然后向Master或者ResourceManager申請資源來運(yùn)行Executor,調(diào)度Job任務(wù)
** Executor:相當(dāng)于MapReduce中的Map Task一樣侨颈,是一個(gè)JVM進(jìn)程余赢,用于運(yùn)行Task掸驱,以線程形式運(yùn)行
下面是Spark集群的一些概念簡述:
RDD進(jìn)一步探討
RDD是什么:
** ?是一系列分區(qū)的數(shù)據(jù)集合,類似于Hadoop中的split
** 每個(gè)分區(qū)都可以應(yīng)用某個(gè)函數(shù)去運(yùn)算
** RDD之間具有依賴關(guān)系没佑,例如毕贼,RDD1 轉(zhuǎn)換為RDD2時(shí),那么RDD2就依賴于RDD1
** 可以指定key-value形式的RDD的分區(qū)規(guī)則蛤奢,比如hash
** RDD可以選擇最優(yōu)的讀取數(shù)據(jù)的位置鬼癣,比如:從內(nèi)存讀?從本地讀啤贩?或者設(shè)置了多個(gè)副本待秃,決定從哪個(gè)副本讀數(shù)據(jù)是最優(yōu)的。
IDEA工具開發(fā)Spark
Step1痹屹、創(chuàng)建一個(gè)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的兩個(gè)配置文件拷入到resources目錄下
Step6、創(chuàng)建一個(gè)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)依賴,打包自己的工程時(shí)莉给,不需要將Spark和Hadoop的Jar也打包入你的工程里毙石,這樣會(huì)增加你的工程的體積(官方描述: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)生一個(gè)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的廣播使用
廣播這個(gè)概念在不同的計(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)目時(shí)悄谐,可以選擇使用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目錄下林说,可以自己指定,稍后會(huì)自動(dòng)下載相關(guān)依賴
Step4屯伞、Next后,編輯項(xiàng)目的一些基本信息珠移,finish即可末融,如圖:
Step5、打開pom.xml勾习,配置一些后邊課程我們可能會(huì)用到的依賴,剩下的目錄配置等等乾颁,和之前的我們學(xué)過的一樣
Step6艺栈、最后完成時(shí),你會(huì)發(fā)現(xiàn)導(dǎo)入的jar包在左邊的External Libraries中看到如下內(nèi)容
最后诅妹,在剛創(chuàng)建好的Maven工程中寫一個(gè)WordCount試試毅人?:)
* 總結(jié)
學(xué)會(huì)這些基礎(chǔ)操作后,可以進(jìn)行更多的拓展丈莺,比如分析一下apache的日志?請參看官方完整案例般此。
IT全棧公眾號:
QQ大數(shù)據(jù)技術(shù)交流群(廣告勿入):476966007
下一節(jié):SparkSQL基礎(chǔ)