天天看點

《Spark大資料處理:技術、應用與性能優化》——第3章 Spark計算模型3.1 Spark程式模型

本節書摘來自華章計算機《spark大資料處理:技術、應用與性能優化》一書中的第3章,第3.1節,作者:高彥傑 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

創新都是站在巨人的肩膀上産生的,在大資料領域也不例外。微軟的dryad使用dag執行模式、子任務自由組合的範型。該範型雖稍顯複雜,但較為靈活。pig也針對大關系表的處理提出了很多有創意的處理方式,如flatten、cogroup。經典雖難以突破,但作為後繼者的spark借鑒經典範式并進行創新。經過實踐檢驗,spark的程式設計範型在處理大資料時顯得簡單有效。的資料處理與傳輸模式也大獲全勝。

spark站在巨人的肩膀上,依靠scala強有力的函數式程式設計、actor通信模式、閉包、容器、泛型,借助統一資源配置設定排程架構mesos,融合了mapreduce和dryad,最後産生了一個簡潔、直覺、靈活、高效的大資料分布式處理架構。

與hadoop不同,spark一開始就瞄準性能,将資料(包括部分中間資料)放在記憶體,在記憶體中計算。使用者将重複利用的資料緩存到記憶體,提高下次的計算效率,是以spark尤其适合疊代型和互動型任務。spark需要大量的記憶體,但性能可随着機器數目呈多線性增長。本章将介紹spark的計算模型。

下面通過一個經典的示例程式來初步了解spark的計算模型,過程如下。

1)sparkcontext中的textfile函數從hdfs讀取日志檔案,輸出變量file。

val file=sc.textfile("hdfs://xxx")

2)rdd中的filter函數過濾帶“error”的行,輸出errors(errors也是一個rdd)。

3)rdd的count函數傳回“error”的行數:errors.count()。

rdd操作起來與scala集合類型沒有太大差别,這就是spark追求的目标:像編寫單機程式一樣編寫分布式程式,但它們的資料和運作模型有很大的不同,使用者需要具備更強的系統把控能力和分布式系統知識。

從rdd的轉換和存儲角度看這個過程,如圖3-1所示。

《Spark大資料處理:技術、應用與性能優化》——第3章 Spark計算模型3.1 Spark程式模型

https://yqfile.alicdn.com/6223ab45d8c5b95dc2a7b06cd7434292cd9e72e1.png" >

在圖3-1中,使用者程式對rdd通過多個函數進行操作,将rdd進行轉換。block-manager管理rdd的實體分區,每個block就是節點上對應的一個資料塊,可以存儲在記憶體或者磁盤。而rdd中的partition是一個邏輯資料塊,對應相應的實體塊block。本質上一個rdd在代碼中相當于是資料的一個中繼資料結構,存儲着資料分區及其邏輯結構映射關系,存儲着rdd之前的依賴轉換關系。

繼續閱讀