Apache spark 的一些淺見。

1、搬磚 vs. 分佈式計算

一我的搬磚很累,幾我的一塊兒搬就會輕鬆不少,也會快不少:算法

分佈並行計算和幾我的一塊兒搬磚的意思是一致的,一個資源密集型的任務(搬磚或計算),須要 一組資源(小夥伴或計算節點),並行地完成:數據庫

  • 計算任務 => 搬磚數組

  • 計算節點 => 小夥伴分佈式

當計算任務太重時,咱們就把計算任務拆分,而後放到多個計算節點上同時執行,這就是分佈並行計算。函數

2、求文件中包含"包租婆"的行數

從一個總計100行的文件中找出全部包含「包租婆」的行數,咱們不用太動腦筋就有一個算法:spa

  1. 讀一行,判斷這一行有「包租婆」嗎?若是有,全局變量count加1。code

  2. 文件到末尾了嗎?若是沒有,跳轉到第1步繼續執行。orm

  3. 打印count。對象

 

這幾步程序,我打賭在你的計算機上能夠一眨眼的功夫就執行完。可是若是這個文件有100萬行呢? 若是還用剛纔不動腦筋的笨算法,可能就很差交差了......ip

並行分佈計算採用了一個大智若愚的辦法,經過將笨算法丟給一羣機器同時去算,實現規定時間內規定 任務的完成。你要知道,現在流行的Map/Reduce就是這麼幹的,這聽起來不夠高端,也確實引發了一些數據庫專 家(聰明人)的非議。不過,無論黑貓白貓,能抓住老鼠的都是好貓。

3、Spark簡化了分佈式計算的開發

若是要把剛纔的任務進行分佈計算(假設有10臺機器能夠用),須要對原始的笨算法作一些調整:

 

  1. 把100萬條數據分紅10份,每份10萬條。

  2. 在10臺機器上分別執行笨辦法計算包含「包租婆」的行數。

  3. 彙總合併10臺機器的計算結果,即count,打印出來。

Oh...NO.....太...累...了...

好在有Spark的存在!咱們只要把數據和計算程序交給Spark,它會機智地進行數據切分、算法複製、分佈執行、結果合併。

4、Spark的計算範式:數據集上的計算

Spark用起來的確簡單,但有一點特別要注意,你得按照Spark的範式寫算法。

Spark是在數據集的層次上進行分佈並行計算,是的,它只認成堆的數據:

咱們提交給Spark的計算任務,必須知足兩個條件:

  1. 數據是能夠分塊的,每塊構成一個集合。

  2. 算法只能在集合級別執行操做。

好比,對於文本文件,在Spark中,一行就是一條記錄,若干條記錄組成一個集合。咱們 原來的算法直接在每一行上進行計算,就不行了。須要先構建數據集,而後經過數據集的操做, 實現咱們的目的。

5、SQL中的數據集

若是你熟悉SQL,能夠用SQL的思惟考慮下什麼是集合操做:

  1. UPDATE USER SET GENDER='FEMALE'

上面的SQL語句就是一個集合操做,對一個數據集合,執行一條UPDATE操做,整個數據集都被修改了。

UPDATE語句有兩個特色,這也是集合操做的要素:

1.對集合的每一個記錄執行相同的操做

UPDATE更新了集合中的全部記錄,這些記錄的 GENDER 字段值都被更新爲 FEMALE 。

2.這個操做的具體行爲是用戶指定的

UPDATE經過SET子句,指定更新那些字段,怎麼更新。

6、JavaScript中的數據集

JavaScript中數組對象的map方法也是一種集合操做。map方法將一個數組的每個成員變換爲新的成員, 並返回變換後新的集合。

  1. 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方法使用一個匿名函數,指定如何對每個原始數據進行變換。

7、將算法移植到Spark上

如今咱們修改原始的笨算法,使之適用於Spark:

  1. 將數據載入並構造數據集
    在Spark中,這個數據集被稱爲`RDD` :彈性分佈數據集。

  2. 對數據集進行map操做
    指定行爲:若是一行原始記錄包含「包租婆」,該行記錄映射爲新值1,不然映射爲新值0 。

  3. 對map後的數據集進行collect操做,得到合併的結果。

上面的map操做,和前面JavaScript數組的map方法相似,將原始記錄映射爲新的記錄,並返回一個新的RDD。 collect操做提取RDD中的所有數據到本地。

魔術發生在RDD上。Spark的RDD自動進行數據的切分和結果的整合。咱們僞裝不知道就行了, 就像這一切只發生在本地的一臺機器上。

8、Spark操做符

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/

相關文章
相關標籤/搜索