MapReduce是一種編程模型,使開發人員可以專注于編寫處理數據的代碼,而不必擔心并行執行的細節。
MapReduce需要將要處理的數據建模為鍵值對。 開發人員編寫了map函數和reduce函數的代碼。
MapReduce運行時為每個鍵/值對調用map函數。 映射功能將鍵值對作為輸入,并產生另一個鍵值對的輸出。
MapReduce運行時通過鍵對映射函數的輸出進行排序和分組。 然后,它調用將其傳遞給鍵的reduce函數以及與該鍵關聯的值的列表。 為每個鍵調用reduce函數。 reduce函數的輸出是鍵值對。 該值通常是聚合值或通過處理為輸入鍵傳遞的值列表而計算出的值。 對于由map函數生成的每個中間鍵,調用reduce函數。 reduce函數的輸出是必需的結果。
例如,假設您有大量的日志文件,其中包含某些事件(例如訪問帳戶)的審核日志。 您需要找出過去10年中每個帳戶被訪問了多少次。
假定日志文件中的每一行都是審核記錄。 我們正在逐行處理日志文件,map和reduce函數如下所示:
map(key , value) {// key = byte offset in log file // value = a line in the log fileif ( value is an account access audit log) {account number = parse account from valueoutput key = account number, value = 1}
}reduce(key, list of values) {// key = account number// list of values {1,1,1,1.....}for each valuecount = count + valueoutput key , count
}
每個日志文件中的每一行都會調用map函數。 不相關的行將被忽略。 從相關行中解析出帳號,并輸出一個值1。MapReduce運行時按帳號對輸出進行排序和分組。 為每個帳戶調用reduce函數。 reduce函數匯總每個帳戶的值,這是必需的結果。
MapReduce作業通常在計算機集群上執行。 每臺機器執行一個任務,該任務可以是映射任務,也可以是歸約任務。 每個任務都在處理數據的子集。 在上面的示例中,假設我們從一組大型輸入文件開始。 MapReduce運行時將輸入數據分為稱為分割或碎片的分區。 每個拆分或碎片均由計算機上的映射任務處理。 每個映射任務的輸出均按鍵排序和分區。 來自所有映射的輸出被合并以創建輸入到reduce任務的分區。
可以有多臺計算機,每臺計算機都運行簡化任務。 每個reduce任務都有一個要處理的分區。 該分區可以具有多個鍵。 但是每個鍵的所有數據都在1個分區中。 換句話說,每個鍵只能處理1個縮減任務。
機器數量,映射任務數量,reduce任務數量以及其他幾項都是可配置的。
對于需要對大數據集進行某些處理的問題,MapReduce非常有用。 該算法可以分解為map和reduce函數。 MapReduce運行時負責將處理分配到多臺計算機并匯總結果。
Apache Hadoop是mapreduce的開源Java實現。 請繼續關注有關使用hadoop的有關mapreduce的未來博客/教程。
參考: 什么是MapReduce? 來自我們的JCG合作伙伴在“ Khangaonkar報告”中的報道 。
- Cajo,用Java完成分布式計算的最簡單方法
- Hibernate映射集合性能問題
- Java Code Geeks Andygene Web原型
- Servlet 3.0異步處理可將服務器吞吐量提高十倍
翻譯自: https://www.javacodegeeks.com/2011/05/mapreduce-soft-introduction.html