MapReduce初級案例——數據排序
“ 數據排序”是許多實際任務執行時要完成的第一項工作,比如學生成績評比、 數據建立索引等。這個實例和數據去重類似,都是先對原始數據進行初步處理,為進一步的數據操作打好基礎。下面進入這個示例。
1 實例描述
對輸入文件中數據進行排序。 輸入文件中的每行內容均為一個數字, 即一個數據。要求在輸出中每行有兩個間隔的數字,其中, 第一個代表原始數據在原始數據集中的位次, 第二個代表原始數據。
樣例輸入:
(1) file1:
(2) file2:
(3) file3:
樣例輸出:
2 設計思路
這個實例僅僅要求對輸入數據進行排序,熟悉 MapReduce 過程的讀者會很快想到在MapReduce 過程中就有排序,是否可以利用這個默認的排序,而不需要自己再實現具體的排序呢?答案是肯定的。
但是在使用之前首先需要了解它的默認排序規則。它是按照 key 值進行排序的,如果key 為封裝 int 的 IntWritable 類型,那么 MapReduce 按照數字大小對 key 排序,如果 key為封裝為 String 的 Text 類型,那么 MapReduce 按照字典順序對字符串排序。
了解了這個細節,我們就知道應該使用封裝 int 的 IntWritable 型數據結構了。也就是在map 中將讀入的數據轉化成 IntWritable 型,然后作為 key 值輸出( value 任意)。 reduce 拿到之后,將輸入的 key 作為 value 輸出,并根據 value-list 中元素的個數決定輸出的次數。輸出的 key(即代碼中的 linenum)是一個全局變量,它統計當前 key 的位次。
需要注意的是這個程序中沒有配置 Combiner,也就是在 MapReduce 過程中不使用 Combiner。這主要是因為使用 map 和 reduce 就已經能夠完成任務了。
3 程序代碼
程序代碼如下所示:



4 代碼結果
(1)準備測試數據
通過 Eclipse 下面的“ DFS Locations”在“ /user/hadoop”目錄下創建輸入文件“ sort_in”文件夾( 備注:“ sort_out”不需要創建。)如圖 2.4-1 所示,已經成功創建。
然后在本地建立三個 txt 文件,通過 Eclipse 上傳到“ /user/hadoop/sort_in”文件夾中,三個 txt 文件的內容如“實例描述”那三個文件一樣。如圖 2.4-2 所示,成功上傳之后。從 SecureCRT 遠處查看“ Master.Hadoop”的也能證實我們上傳的三個文件。
查看兩個文件的內容如圖 2.4-3 所示:
(2)查看運行結果
這時我們右擊 Eclipse 的“ DFS Locations”中“ /user/hadoop”文件夾進行刷新,這時會發現多出一個“ sort_out”文件夾,且里面有 3 個文件,然后打開雙其“ part-r-00000”文件,會在 Eclipse 中間把內容顯示出來。如圖 2.4-4 所示。