參考:http://blog.csdn.net/dr_guo/article/details/51150278
Paste_Image.png
重點概念:
輸入分片(Input Split):在進行map計算之前,mapreduce會根據輸入文件計算輸入分片(input split),
每個輸入分片(input split)針對一個map任務,輸入分片(input split)存儲的并非數據本身,而是一個分片長度和一個記錄數據的位置的數組。
場景具體分析:
由于 app click show的日志都是 1M 15M的小文件,在hadoop框架中對小文件做了優化,將多個數據合并成一個分片split ,交給mapper處理。
導致,mapper中 inputSplit.getPath()獲取的是多個文件的列表。而 實時ctr代碼中,直接取列表的第1個,來做判斷,所以出錯。
方案:
將hadoop默認的優化,進行自定義處理,即在job run之前添加 job.setInputFormatClass(TextInputFormat.class);
這樣,每個小文件,將作為一個獨立的分片split, 對應一個獨立的 mapper ,你再用inputSplit.getPath()就能得到唯一確定的路徑了
就解決了”click 、show錯當成對方“ 的情況。