一我的搬磚很累,幾我的一塊兒搬就會輕鬆不少,也會快不少:算法
分佈並行計算和幾我的一塊兒搬磚的意思是一致的,一個資源密集型的任務(搬磚或計算),須要 一組資源(小夥伴或計算節點),並行地完成:數據庫
計算任務 => 搬磚數組
計算節點 => 小夥伴分佈式
當計算任務太重時,咱們就把計算任務拆分,而後放到多個計算節點上同時執行,這就是分佈並行計算。函數
從一個總計100行的文件中找出全部包含「包租婆」的行數,咱們不用太動腦筋就有一個算法:spa
讀一行,判斷這一行有「包租婆」嗎?若是有,全局變量count加1。code
文件到末尾了嗎?若是沒有,跳轉到第1步繼續執行。orm
打印count。對象
這幾步程序,我打賭在你的計算機上能夠一眨眼的功夫就執行完。可是若是這個文件有100萬行呢? 若是還用剛纔不動腦筋的笨算法,可能就很差交差了......ip
並行分佈計算採用了一個大智若愚的辦法,經過將笨算法丟給一羣機器同時去算,實現規定時間內規定 任務的完成。你要知道,現在流行的Map/Reduce就是這麼幹的,這聽起來不夠高端,也確實引發了一些數據庫專 家(聰明人)的非議。不過,無論黑貓白貓,能抓住老鼠的都是好貓。
若是要把剛纔的任務進行分佈計算(假設有10臺機器能夠用),須要對原始的笨算法作一些調整:
把100萬條數據分紅10份,每份10萬條。
在10臺機器上分別執行笨辦法計算包含「包租婆」的行數。
彙總合併10臺機器的計算結果,即count,打印出來。
Oh...NO.....太...累...了...
好在有Spark的存在!咱們只要把數據和計算程序交給Spark,它會機智地進行數據切分、算法複製、分佈執行、結果合併。
Spark用起來的確簡單,但有一點特別要注意,你得按照Spark的範式寫算法。
Spark是在數據集的層次上進行分佈並行計算,是的,它只認成堆的數據:
咱們提交給Spark的計算任務,必須知足兩個條件:
數據是能夠分塊的,每塊構成一個集合。
算法只能在集合級別執行操做。
好比,對於文本文件,在Spark中,一行就是一條記錄,若干條記錄組成一個集合。咱們 原來的算法直接在每一行上進行計算,就不行了。須要先構建數據集,而後經過數據集的操做, 實現咱們的目的。
若是你熟悉SQL,能夠用SQL的思惟考慮下什麼是集合操做:
UPDATE USER SET GENDER='FEMALE'
上面的SQL語句就是一個集合操做,對一個數據集合,執行一條UPDATE操做,整個數據集都被修改了。
UPDATE語句有兩個特色,這也是集合操做的要素:
1.對集合的每一個記錄執行相同的操做
UPDATE更新了集合中的全部記錄,這些記錄的 GENDER 字段值都被更新爲 FEMALE 。
2.這個操做的具體行爲是用戶指定的
UPDATE經過SET子句,指定更新那些字段,怎麼更新。
JavaScript中數組對象的map方法也是一種集合操做。map方法將一個數組的每個成員變換爲新的成員, 並返回變換後新的集合。
var a=[1,2,3,4]; a.map(function(d){return d*2;}); console.log(a);
上面的JavaScript代碼對一個數組執行map方法,將每個成員進行倍乘。結果是得到一個新的 數組,好比在這裏,將獲得[2,4,6,8]。
這個例子也說明了集合操做的兩個要素:
1.對集合的每一個記錄執行相同的操做
在map方法執行中,每一個數組成員都被轉換爲原始值的2倍。
2.這個操做的具體行爲是用戶指定的
map方法使用一個匿名函數,指定如何對每個原始數據進行變換。
如今咱們修改原始的笨算法,使之適用於Spark:
將數據載入並構造數據集
在Spark中,這個數據集被稱爲`RDD` :彈性分佈數據集。
對數據集進行map操做
指定行爲:若是一行原始記錄包含「包租婆」,該行記錄映射爲新值1,不然映射爲新值0 。
對map後的數據集進行collect操做,得到合併的結果。
上面的map操做,和前面JavaScript數組的map方法相似,將原始記錄映射爲新的記錄,並返回一個新的RDD。 collect操做提取RDD中的所有數據到本地。
魔術發生在RDD上。Spark的RDD自動進行數據的切分和結果的整合。咱們僞裝不知道就行了, 就像這一切只發生在本地的一臺機器上。
Spark提供了80多種操做符對集合進行操做。咱們列舉經常使用的一些供你創建一點基本概念, 以便了解Spark能夠支持什麼:
變換操做老是得到一個新的RDD:
map(func) : 將原始數據集的每個記錄使用傳入的函數func ,映射爲一個新的記錄,並返回新的RDD。
filter(func) : 返回一個新的RDD,僅包含那些符合條件的記錄,即func返回true 。
flatMap(func) : 和map相似,只是原始記錄的一條可能被映射爲新的RDD中的多條。
union(otherDataset) : 合併兩個RDD,返回一個新的RDD 。
intersection(otherDataset):返回一個新的RDD,僅包含兩個RDD共有的記錄。
動做操做老是得到一個本地數據,這意味着控制權回到你的程序了:
reduce(func) : 使用func對RDD的記錄進行聚合。
collect() : 返回RDD中的全部記錄
count() : 返回RDD中的記錄總數
對spark中Scala語言快速掃盲、交互分析、RDD動做、RDD變換的介紹以下:
http://www.hubwiz.com/course/5449c691e564e50960f1b7a9/