[英]mapreduce.TextInputFormat hadoop
您需要了解TextInputFormat
的實現才能找到答案。
讓我們深入研究代碼。 我將談論新的mapreduce API,但“舊的” mapred API非常相似。
如您所說,從用戶的角度來看, TextInputFormat
根據一些換行符將拆分拆分為記錄。 讓我們檢查一下實現 。
您可以看到該類幾乎為空。 關鍵功能是createRecord
,由InputFormat
定義
@Override
public RecordReader<LongWritable, Text> createRecordReader(
InputSplit split,
TaskAttemptContext context
) {
return new LineRecordReader();
}
一般的約定是使用InputFormat獲取RecordReader。 如果您在Mapper
和MapContextImpl
內部查看,您將看到該映射器僅使用RecordReader來獲取下一個鍵和值。 他什么都不知道。
映射器:
public void run(Context context) throws IOException, InterruptedException {
setup(context);
while (context.nextKeyValue()) {
map(context.getCurrentKey(), context.getCurrentValue(), context);
}
cleanup(context);
}
MapContextImpl:
@Override
public boolean nextKeyValue() throws IOException, InterruptedException {
return reader.nextKeyValue();
}
現在,請仔細閱讀您提供的此鏈接。 您將看到:
NLinesInputFormat
擴展了TextInputFormat
並且僅覆蓋createRecordReader
。 基本上,使用LineReader
可以提供自己的RecordReader
。 您想擴展TextInputFormat
而不是擴展層次結構中更高的另一個類,因為它已經處理了在此級別上完成的所有事情,並且您可能需要(壓縮,不可拆分格式等)。 NLinesRecordReader
做真正的工作。 在initialize
它做了什么工作,才能從提供的InputSplit
的正確偏移處獲取InputStream
。 它還創建一個LineReader
,與TextInputFormat
所使用的相同 nextKeyValue
方法中,您將看到LineReader.readLine()
被調用三次以獲得三行(加上一些邏輯來正確處理一些LineReader.readLine()
情況,例如太大的記錄,行尾,拆分尾) 希望對您有幫助。 關鍵是要了解API的總體設計以及每個部分之間如何交互。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.