標籤:spark運行原理和rdd解析
Spark一般基於記憶體,一些情況下也會基於磁碟
Spark優先會把資料放到記憶體中,如果記憶體實在放不下,也會放到磁碟裡面的
不單能計算記憶體放的下的資料,也能計算記憶體放不下的資料
實際如果資料大於記憶體,則要考慮資料放置策略和最佳化演算法,因為Spark初衷是一寨式處理
小到5~10台的分布式大到8000台的規模,Spark都能運行
大資料計算問題:互動式查詢(基於shell、sparkSQL)、批處理、機器學習和計算等等
底層基於RDD,分布式彈性資料級,支援各種各樣的比如流處理、SQL、SparkR等等範式
==========Spark特點============
要理解Spark,從以下方面理解
1、分布式多台機器運行
不同節點會處理其中一部分資料,各個節點資料處理互不干擾,分布式做並行化
Cluster Manager負責分配資源到各個節點中,各節點算完之後,再匯總到Cluster Manager再統一輸出
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
2、記憶體式+磁碟計算
例如:300萬條資料,分配到3台機器,比如每台機器100萬(也可能不是平均),一台機器100萬條記憶體放的下放記憶體,放不下就記憶體
3、迭代式計算是Spark真正的精髓
將計算分成N個過程,一個過程結束再下一個
shuffle是一個節點到另外一個節點
==========開發============
我們寫好程式通過Driver到各個機器
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
為什麼大部分大部分用JAVA寫程式
因為JAVA的人比較多,Scala的人比較少
JAVA和J2EE融合比較方便
後續維護比較方便
缺點:JAVA開發Spark太繁瑣了
後面的例子同時使用Scala和JAVA實現
開發是單獨的機器,提交機器是在另外的機器上
可以處理的資料來源:SparkWorker可以從各種資料,除了HDFS、HBase,還可以從Hive,oracle,mysql
註:Hive資料倉儲,資料引擎,SparkSQL可以實現這個,但是不能完全取代Hive
處理資料輸出:HDFS、HBase、Hive、oracle、s3或者直接返回到用戶端等等
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
==========運行============
一切基於RDD(彈性分布式資料集),
彈性之一:
進行資料分區,預設放在記憶體中的,如果記憶體放不下,一部分會放在磁碟上進行儲存,對使用者來說完全不需要關心它資料是在哪裡的,RDD會自動進行記憶體和磁碟的切換
彈性之二:
基於Lineage的高效容錯,假設一個作業步驟有1000個步驟,假設在901步驟的時候出錯,它會自動從900個步驟進行錯誤修正回複重新計算
彈性之三:
Task如果失敗,會自動進行特定次數的重試,假設一個Task有1000個步驟,假設901步驟出錯,如果從900個步驟開始重試,會有一定次數的重試,還是失敗就真失敗
彈性之四:
Stage如果失敗,會自動特定次數的重試,而且只會計算失敗的分區
註:Stage,其實就是階段
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
==========做緩衝時機 ============
1、特別耗時
2、計算鏈條很長
3、Shuffle之後,如果這之後失敗做過緩衝,就不用再做shuffle了
4、checkpoint之前,前面的步驟都緩衝過了之後,如果checkpoint斷了,之前的就儲存了
==========RDD例子 ============
除了hadoop、spark的start-all
hadoop應該啟動./start-df.sh
spark應該啟動./start-
http://master:18080 看曾經啟動並執行作業的資訊
spark的bin下面./spark-shell --master spark://Master:7077
val data = sc.textFile("/library/wordcount/input/Data")或者sc.textFile("hdfs//Master:9000/library/wordcount/input/Data")
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
Spark自己會建立RDD
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
data.roDebugString看資料依賴關係
可以看出是MapPartitionnsRDD是分區方式,分布在不同機器上的
data.count看資料
http://Master:4040看job
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
資料不動,代碼動,資料都分布在各個機器上的。
一個Block Size一般是128M,實際Partition和Block Size可能會有出入
val flatted = data.flatMap(_.spilit(" "))
又產生的了新的MapPartitionnsRDD
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
val mapped = flatted.map(word=>(word,1))//每個單詞計數為1
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
val reduced = mapped.reduceByKey(_+_)
key相同的相加,產生shuffle
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
reduced .saveAsTextFIle("/library/wordcount/input/Data/output/onclick4")
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
另外:
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
Data2222不存在,開始載入是lazy的,所以不會報錯,只有data.count就會報錯
下一講:eclipse開發JAVA和scala角度開發測試和運行程式
作業:寫一篇部落格,寫你理解的Spark的基本理解
王家林老師名片:
中國Spark第一人
新浪微博:http://weibo.com/ilovepains
公眾號:DT_Spark
部落格:http://blog.sina.com.cn/ilovepains
手機:18610086859
QQ:1740415547
郵箱:[email protected]
本文出自 “一枝花傲寒” 部落格,謝絕轉載!
Spark運行原理和RDD解析(DT大資料夢工廠)