大數據之MapReduce分布編程模型

導讀: 計算機科學是算法與算法變換的科學,算法是計算機科學的基石。 任何一個計算問題的分析與建模,幾乎都可以歸為算法問題。 MapReduce算法模型是由Google公司針對大規模群組中的海量數據處理而提出的分佈編程模型,主要應用於大規模數據集{大於1TB}的分佈並行運算。

在MapReduce模型中的Map{映射}和Reduce{化簡}創意來自函數型編程語言,同是也繼承了向量型編程語言的特性。 MapReduce模型能夠使程序員在不瞭解分佈式並行編程的情況下,將自己書寫的程序在分佈式系統上運行。MapReduce模型主要實現了映射與化簡兩個核心功能,分別由Map和Reduce完成,這兩個函數也是函數型語言中常用的函數,由用戶負責實現。

Map函數應用於集合中的所有成員,然後返回一個基於這個處理的結果集。而Reduce函數是從兩個或更多個Map結果中,通過多個線程、進程或者獨立系統並行執行處理的結果進行分類和歸納。 一個Map函數用來把對映象成一組新的鍵值對,Reduce函數用來對同一個鍵的值進行合併。

下面給大家著重介紹一下函數式編程範式,函數式編程是一種編程範式,在這種編程範式中,更多地使用了函數運算。

函數型語言與函數式編程

函數型語言是一種典型的程序設計語言。函數型語言的特點是把問題求解過程表示成塊結構,對調用塊的調用者來說,每個塊都有輸入數據和經過加工處理後的輸出數據。每個塊的功能就如同函數的功能,例如LISP語言、ML語言等都屬於函數型語言。

利用函數型語言編程就是一種函數式編程,函數式編程使用一系列的函數解決問題。任何一個函數僅接受輸入數據併產生輸出函數值,不包含任何能影響產生輸出的內部狀態。任何情況下,使用相同的參數調用函數始終能得到一致的結果。

在一個函數式的程序中,輸入數據要通過一系列的函數,每個函數根據它的輸入產生輸出。函數式編程位於面向對象編程的對立面。面向對象編程通常包含內部狀態{字段}和許多能修改這些狀態的函數,程序運行中則不斷的修改狀態。 函數式編程則極力避免狀態改動。對於複雜的系統,可以同時使用函數式編程和麵向對象編程,在這種混合應用中,既採用了面向對象技術建模,還獲得了函數式編程風格的優點。

函數式編程的優點

函數式編程具有如下優點:

1,邏輯可證

由於沒有邊界效應,所以更容易從邏輯上證明程序正確性,而不是僅通過測試完成。

2,模塊化

函數式編程以簡單為原則,一個函數只做一件事,將大的功能模塊拆分成儘可能小的功能模塊。小的功能模塊更易於閱讀和檢查錯誤。

3,組件化

更容易利用簡單的小函數加以組合形成新的功能更強的函數,體現了組件化的特點。

4,易於調試

細化的、定義清晰的函數能夠使得調試更加簡單,當程序運行不正常時,每個函數都是檢查數據是否正確的連接口,能更快速地排除沒有問題的代碼,定位到出現問題的地方。

5,易於測試

函數不依賴於系統狀態,無須在測試前構造測試樁,更加容易編寫單元測試的代碼。

6,更高的生產率

函數式編程產生的代碼比其他技術更簡潔,往往是其他技術的一半左右,並且更容易閱讀和維護。

函數式編程的特徵

1,沒有副作用

函數程序由一系列函數對數據的變換構成,因為函數式編程中的每個符號都是最終的,所以從來沒有在某個地方修改過值,也沒有函數修改過在其作用域之外的量並被其他函數使用。這表明函數求值的結果只是其返回值,而唯一影響其返回值的就是函數的參數,函數操作數據,所以函數沒有產生副作用。

2,無狀態的編程

在現實情況中,狀態不可能一直保持不變,而狀態必然需要改變與傳遞,那麼在函數式編程中的則是將其保存在函數的參數中,作為函數的附屬品來傳遞。

3,輸入值和輸出值

在函數式編程中,只有輸入值和輸出值。函數式基本單位,幾乎被用作所有部分,包括最簡單的計算,甚至連變量都被計算所取代。變量只是一個名稱,而不是一個儲存單元,這是函數式編程與傳統的命令式編程最經典的不同之處。

在面向對象編程中,將對象傳來傳去。在函數式編程中,是將函數傳來傳去,又將這個函數稱為高階函數。在數學和計算機科學中,高階函數是至少滿足下列一個條件的函數:

@ 接受一個或多個函數作為輸入。

@輸出一個函數值。

好了,今天就分享到這,下次將給大家分享映射函數與化簡函數,希望大家多多關注哦!


分享到:


相關文章: