Hadoop的性能問題

數據科學家在面對大規模數據分析時,經常需要面對兩類問題


(1)數據緩存:在應用數據挖掘算法時前,數據往往需要進行預處理操作,對數據中一部分不符合要求的數據進行不斷的清洗過濾。而這些清洗工作又不是可以用簡單的線性操作完成的。同時,算法計算過程中的中間結果也需要保留,以便後續操作使用。

(2)算法迭代:數據科學家需要應用複雜的數據挖掘算法對數據進行分析,而這些算法往往需要複雜的運算邏輯和反覆的迭代過程,以達到求解最優解的目的。例如K-means算法,梯度下降算法等。


由於hadoop天生的設計缺陷,在處理以上兩個問題時顯得有點力不從心。爲了理解其原因,我們先從Hadoop的核心計算模式MapReduce說起。MapReduce計算模式將數據的處理過程分成兩個階段:map和reduce。在map階段,原始數據被輸入mapper進行過濾和轉換,獲得中間數據在reduce階段作爲reducer的輸入。經過reducer的聚合處理,獲得最終處理結果。


爲了適應多樣化的數據環境,MapReduce中採用關鍵字/值數據對(Key-Value Pair)作爲基礎數據單元。關鍵字和值可以使簡單的基本數據類型,例如整數,浮點數,字符串,二進制字節,也可以是複雜的數據結構,例如列表、數組、自定義結構。map階段和reduce階段豆漿關鍵字/值作爲輸入輸出,其公式表達式如下(<...>代表關鍵字/值數據對,[…]代表列表)

map: <k1,v1>--> [<k2,v2>]

reduce:<k2,[v2]>-->[<k3,v3>]

MapReduce的基本處理過程表達如下:

(1)MapReduce應用講一個[<k1,v1>]列表作爲參數傳遞給MapReduce處理模塊,例如[<String fileName, String fileContent>]。MapReduce處理模塊將這個列表拆分爲單獨的<k1,v1>數據對,分發給對應的mapper進行處理。

(2)mapper根據函數定義的處理過程,對<k1,v1>進行處理,生成<k2,v2>列表。由於數據處理過程是無序的,因此,每個<k2,v2>數值對的生成過程必須是自包含的,即不與其他數值對的生產過程相關。所有mapper的處理結果合在一起構成了一個大的<k2,[v2]>,即k2和一系列的v2。reduce按照函數定義的處理過程,對這些新的數據進行處理,獲得最終的處理結果,並以[(k3,v3)]列表的形式輸出。

通過如上對MapReduce的介紹可以看出,MapReduce工作模型非常簡單,他只有兩種基本操作:map和reduce。這種簡化是爲了降低編寫分佈式並行計算程序的複雜度。但是這種簡化也帶來新的問題,就是在進行復雜算法設計和非線性的數據處理的時候,只能通過map+reduce的疊加來實現。一個算法通常需要多個map+reduce的過程才能實現,而每個M+R的過程,hadoop都要單獨啓動一個job來實現。每一個job的啓動都增加了整個算法的開銷。同時,MapReduce計算模式在進行多個job時,必須依賴hadoop的另一項核心技術HDFS交換數據。HDFS最初的設計思想是數據“一次寫入,多次讀寫”。HDFS中一個數據塊會被複制分發到不同的存儲節點中,使用磁盤作爲中間過程交互數據的媒介。多個MapReduce job在銜接時,都需要將數據寫入磁盤,再讀出,因此在進行反覆迭代的計算時會增加大量的網絡開銷和磁盤IO開銷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章