MapReduce獲取輸入檔案路徑 全

2021-09-10 02:17:30 字數 2073 閱讀 4257

對於mapreduce而言,在map端經常需要知道處理檔案的輸入路徑,以此來區分不同的處理方式。

我們知道在mapreduce框架中會將輸入的檔案切分成許多(inputsplit)檔案塊,每個檔案塊包含了檔案路徑,起止偏移量等資訊,每乙個檔案塊交給乙個map任務進行處理。而檔案塊的生成是通過inputformat呼叫getsplits方法實現的,不同的inputformat會有不同的切分規則,生成不同型別的檔案塊。

因此不同的inputformat採用不同的獲取檔案路徑的方法:

1、一般fileinputformat

一般的fileinputformat是mapreduce中最常用的一種輸入格式,包括textinputformat,parquetinputformat,sequencefileinputformat等,這些輸入格式切分的檔案塊型別為filesplit。

因此獲取檔案路徑方法為:

@override

public void map(longwritable key, text value, context context)

throws ioexception, interruptedexception

2、combinefileinputformat

combinefileinputformat輸入格式實現的是小檔案合併輸入,使用場景是輸入檔案中有很多小檔案,導致會產生很多的map任務增大了系統的排程、通訊開銷。需要將許多小檔案合併成乙個map任務進行處理,combinefileinputformat詳細使用情況會專門介紹,這裡就不展開了。此輸入格式切分的檔案塊型別為combinefilesplit。由於combinefilesplit包含多個要處理檔案的資訊,所以通過combinefilesplit並不知道當前處理的資料來自哪份檔案。不用擔心,在map任務讀取檔案塊的時候,將資料所在的檔案資訊在上下文context中進行了儲存,獲取方法如下:

@override

public void map(longwritable key, text value, context context)

throws ioexception, interruptedexception

3、multipleinputs(delegatinginputformat)

multipleinputs多檔案輸入:對多種輸入型別的需要編寫不同的map函式進行處理,比如同時處理hdfs上的一般文字資料,hbase資料,mysql資料等,此時就需要用到這種輸入方式。

//普通檔案

//hbase,hbaseinputpath無意義且沒有用到,但是是必傳的,可以任意指定

multipleinputs.addinputpath(job, hbaseinputpath, tableinputformat.class, tablemap.class);

其指定的輸入格式為delegatinginputformat,但是每份數處理用的還是上面指定的輸入格式, 切分出的檔案塊型別也是根據上面指定的輸入格式確定,被封裝在taggedinputsplit類中,這個類訪問修飾符是default的,定義如下:

class taggedinputsplit extends inputsplit implements configurable, writable
這樣我們就不能直接使用這個類,此時需要用反射的機制來獲取輸入檔案路徑:

對於這種格式輸入獲取的是一般文字資料路徑(hbase,mysql沒有檔案路徑的概念)。

@override

public void map(longwritable key, text value, context context)

throws ioexception, interruptedexception else if (realsplit instanceof combinefilesplit)

}

......

}

spark獲取檔案路徑我的另一篇博文

MapReduce資料檔案輸入

資料檔案輸入 mapreduce的資料檔案輸入,需要將本地檔案上傳到hdfs上 hadoop fs put 其中,hadoop fs put 表示上傳檔案,是要上傳的資料夾或者是檔案,是hdfs下的路徑,全部路徑就是 hdfs localhost hadoop的常用檔案操作命令 hdfs dfs r...

Mapreduce的輸入格式

map k1,v1 list k2,v2 reduce k2,list v2 list k3,v3 reduce的輸入型別必須與map函式的輸出型別相同 combine的輸入輸出鍵值型別必須相同,也就是k2,v2 static class reducer extends reudcer partio...

MapReduce獲取分片數目

有的程式會設定map的數目,那麼map數目是如何影響分片的數目的呢?假設檔案大小為0,是否會作為乙個分片傳給map任務?fileinputformat.getsplits返回檔案的分片數目,這部分將介紹其執行流程,後面將貼上其源 並給出凝視 通過liststatus 獲取輸入檔案列表files,當中...