運行結果附圖
本節課程主要內容為學習MapReduc設計模式,并編寫java程序對日志文件進行處理。
課本上介紹的MapReduce的設計模式主要包含:計數(Counting),分類(Classification),過濾處理(Filtering),排序(Sorting),去重計數(Distinct Counting),相關計數(Cross-Correlation).
本次作業選取了其中兩個設計模式進行練習:排序(Sorting) ,去重計數(Distinct Counting)
排序(Sorting)
(1) 設計模式思想:
map對每條記錄的排序屬性進行計算,得出排序屬性的值
reduce對同一分組下的記錄按照排序屬性值進行排序(2) 目標問題:
對access.log中的每個用戶的每條記錄的總數據流量(上行流量+下行流量)按照從小到大的順序輸出
(3) java代碼主要思路:
問題中的排序屬性值為數據總流量,故在map階段計算出每條數據的總流量,又因為是要對每個用戶的總流量進行排序,
故map的輸出key為userid,value為原始數據記錄以及排序屬性(即總流量)
reduce階段就是對同一用戶的所有記錄按照其總流量進行排序,java代碼中具體實現是將同一用戶的所有帶有總流量的記錄存放到一個ArrayList中,
然后使用Collections.sort(list,comparactor)進行排序,在comparactor中override的compare方法中依據總流量進行了升序排序(4) java代碼截圖如下:
(5) 運行結果如下:
去重計數(Distinct Counting)
(1) 設計模式思想:
分為兩個步驟,步驟一中map輸出屬性組合為key,計數1為value的結果,reduce僅輸出屬性組合,相當于完成了去重工作
步驟二中map對屬性組合中的一個屬性進行1的計數,reduce階段將計數累加,完成了計數工作
(2) 目標問題:
對access.log文件中的網址的不同用戶訪問數進行計數
(3) java代碼主要思路:
使用了兩個job實現的,每一個job中一個map一個reduce.
第一階段的map輸出以userid與hostname組成的屬性組合為key,計數1為value;reduce輸出的就是屬性組合
第二階段的map輸出以hostname為key,計數1為value;reduce對每個hostname下的計數1累加完成計數
(4) java代碼截圖如下:
因為使用了兩個job完成任務,所以在main函數中有一系列配置工作完成連個job的設置和連接
(5)運行結果如下:
問題記錄
在第二個設計模式的實現過程中因為涉及到兩個job,所以要完成一系列的配置工作,通過上網查找學習
基本的配置步驟如下:
(1)分別創建兩個Job對象job1,job2 為兩個job配置好相應的Map類,Reduce類,輸出類型,以及輸入路徑和輸出路徑,注意job2的輸入路徑為job1的輸出路徑,即job2直接處理job1的結果
(2)分別創建兩個ControlledJob對象ctrljob1和ctrljob2,利用setJob()方法設置其job分別為job1和job2
(3)設置ctrljob1和ctrljob2的依賴關系,保證job2的啟動依賴與job1的完成
ctrljob2.addDependingJob(ctrljob1);
(4)創建主控制JobControl對象 jobCtrl,并將ctrljob1,ctrljob2加入進去
jobCtrl.addJob(ctrljob1);jobCtrl.addJob(ctrljob2);
(5)創建線程,執行jobCtrl,直至jobCtrl完成所有任務,停止jobCtrl