生活随笔
收集整理的這篇文章主要介紹了
[Hadoop]MapReduce多路径输入与多个输入
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 多路徑輸入
FileInputFormat是所有使用文件作為其數據源的 InputFormat 實現的基類,它的主要作用是指出作業的輸入文件位置。因為作業的輸入被設定為一組路徑, 這對指定作業輸入提供了很強的靈活性。FileInputFormat 提供了四種靜態方法來設定 Job 的輸入路徑:
public static void addInputPath(Job job,Path path);public static void addInputPaths(Job job,String commaSeparatedPaths);public static void setInputPaths(Job job,Path... inputPaths);public static void setInputPaths(Job job,String commaSeparatedPaths);
1.1?addInputPath
使用FileInputFormat.addInputPath方法,只能指定一個路徑。如果想使用該方法實現多路徑輸入,需要多次調用來加載不同的路徑:
FileInputFormat.addInputPath(job, new Path("result/search/train/pv_log/2016-04-27/"));FileInputFormat.addInputPath(job, new Path("result/search/train/pv_log/2016-04-28/"));FileInputFormat.addInputPath(job, new Path("result/search/train/pv_log/2016-04-29/"));1.2 addInputPaths
使用FileInputFormat.addInputPaths方法,可以指定多個路徑。如果想使用該方法實現多路徑輸入,只需調用一次即可,多個路徑字符串之間用逗號分隔開:
FileInputFormat.addInputPaths(job, "result/search/train/pv_log/2016-04-27/,result/search/train/pv_log/2016-04-28/,result/search/train/pv_log/2016-04-29/"); 1.3?setInputPaths
setInputPaths()方法一次設定完整的路徑列表,替換前面調用中在 Job 上所設置的所有路徑(覆蓋):
FileInputFormat.setInputPaths(job, "result/search/train/pv_log/2016-04-27/,result/search/train/pv_log/2016-04-28/,result/search/train/pv_log/2016-04-29/"); 2. 多個輸入
雖然一個MapReduce作業的輸入可能包含多個輸入文件,但所有的文件都由同一個InputFormat和同一個Mapper來處理,例如上面多路徑輸入。然而,數據格式往往會隨著時間而改變,或者,有些數據源會提供相同的數據,但是格式不同,因此我們必須用不同的mapper來處理不同的數據。
這些問題可以用MultipleInputs類來解決,它允許為每條輸入路徑指定InputFormat 和 Mapper。MultipleInputs提供了兩種用于多個輸入的方法:
public static void addInputPath(Job job, Path path,Class<? extends InputFormat> inputFormatClass);public static void addInputPath(Job job, Path path,Class<? extends InputFormat> inputFormatClass,Class<? extends Mapper> mapperClass);下面兩個方法的的區別在于針對不同輸入路徑文件,是否可以指定不同Mapper進行處理。
前者不需要指定Mapper,所以所有文件都通過一個Mapper進行處理:
MultipleInputs.addInputPath(job, new Path("result/search/train/pv_log/2016-11-29/"), TextInputFormat.class); ?MultipleInputs.addInputPath(job, new Path("result/search/train/pv_log/2016-11-29/"), TextInputFormat.class); ?后者可以針對不同輸入路徑指定不同的Mapper,故可以指定不同Mapper處理不同類型的文件:
MultipleInputs.addInputPath(job, new Path("result/search/train/pv_log/2016-11-29/"), TextInputFormat.class, ?TrainOrderMap.class); ?MultipleInputs.addInputPath(job, new Path("result/search/flight/log/day=20161129"), TextInputFormat.class, ?FlightOrderMap.class); ?這段代碼取代了FileInputFormat.addInputPath() 和 job.setMapperClass() 的常規調用。由于火車票和機票訂單數據都是文本文件,所以對兩者使用TextInputFormat的數據類型。但這兩個數據源的行格式不同,所以我們使用兩個不一樣的Mapper。TrainOrderMapper 讀取火車票訂單的輸入數據并計算訂單信息,FlightOrderMapper?讀取飛機票訂單的輸入數據并計算訂單信息。重要的是兩個Mapper 輸出類型一樣,因此,reducer看到聚合后的map輸出,并不知道這些輸入是由不同的Mapper產生的。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的[Hadoop]MapReduce多路径输入与多个输入的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。