前面4篇文章介紹了如何編寫一個簡單的日志提取程序,讀取HDFS share/logs目錄下的所有csv日志文件,然后提取數據后,最終輸出到share/output目錄下。
本篇停留一下,梳理一下主要過程,然后提出新的改進目標。
首先聲明一下,所有的代碼都是maven工程的,沒有使用任何IDE。 這是我一貫的編程風格,用Emacs + JDEE開發。需要使用IDE的只需要學習如何在IDE中使用maven即可。
第一個是序列化,這是各種編程技術中常用的。MapReduce的特別之處在于由于key用來排序,所有它既要支持序列化和反序列化,同時也要支持比較大小的操作。因此通常使用的都是接口WritableComparable<T>,這個接口分別從Writable接口和java.lang.Comparable<T>接口繼承。前者負責序列化,實現的就是類似流(stream)的功能,后者負責比較。
這里只是概括的介紹主要步驟:
1. 通過InputFormat讀取HDFS目錄的日志文件的所有行,進行內容分塊。然后每個塊都會對應一個mapper
2. 調用每個Mapper的map函數, 將內容塊的數據按照行變成<key, value>格式,作為參數傳遞. map函數的代碼由程序員自己實現,通常key是數據,value是整數,便于做統計。這樣,也就將參數<key, value>改成了另一種符合業務邏輯的<key, value>, 通過Context.write方法
寫出去,隨后會被框架交給Reducer.
3. Partitioner目前我的程序中沒有實現自己的類,只是簡單使用了Reducer,后面會增加這部分的說明
4. 框架會根據key進行分組,組成<key, values>對, 調用Reducer的reduce函數,函數接受到Mapper傳遞來的<key, values>后再做統計
5. 輸出成什么樣的格式文件由OutputFormat來控制。
注意上面的幾個粗體字,就是5大MapReduce組件。每個組件都是我們可以繼承的類,然后MapReduce框架通過多態的方式來回調我們的子類實現的方法。
有了上面的實現,還需要配置Job,并且在hadoop命令行中提交。
配置的話,直接new一個Job類,調用set方法進行相應的設置即可。 Job的父類是JobContext。
就在這里可以設置上面的5大組件類,用自己的類來替換。還可以設置Reducer的數量。
分析就到這里,后面會陸續進行更多的編程實踐。
比如,定制自己的3大組件, InputFormat,Partitioner和OutputFormat。
上一篇 幫助文檔(1)