텐, 맵리 듀스 - InputFormat과 추상 클래스 RecordReader

첫째, 기본 원칙

지도를 수행하기 전에 데이터를 슬라이스 할 필요가 각 조각은지도 작업에 해당합니다. 그리고 각 맵 작업은 KV의 과정이 슬라이스 데이터를 직접 처리하지 않는 것입니다. 슬라이스 KV가 처리를지도로 변환하는 방법을 데이터 슬라이스 및 방법 : 그래서 두 가지 문제가있다.
이 두 개의 추상 클래스, InputFormat 및 RecordReader을 포함한다. 왜보기 전에이 두 가지 특정 추상 클래스, 입력 소스 코드 분석입니다

1 InputFormat

public abstract class InputFormat<K, V> {
    public InputFormat() {
    }

    public abstract List<InputSplit> getSplits(JobContext var1) throws IOException, InterruptedException;

    public abstract RecordReader<K, V> createRecordReader(InputSplit var1, TaskAttemptContext var2) throws IOException, InterruptedException;
}

우리는 두 가지 방법의에이 추상 클래스 볼
이름에서의 조각으로 데이터를 처리하는 데 사용됩니다 getSplits가
createRecordReader을 : RecordReader 개체를 만드는 데 사용됩니다.
그래서이 기본 기능 InputFormat입니다

2, RecordReader

public abstract class RecordReader<KEYIN, VALUEIN> implements Closeable {
    public RecordReader() {
    }

    //初始化,一般就是读取切片的数据
    public abstract void initialize(InputSplit var1, TaskAttemptContext var2) throws IOException, InterruptedException;

    //检查是否还有下一对KV,并且如果有,实际上会将其处理成KV,并赋值给this.key和this.value
    public abstract boolean nextKeyValue() throws IOException, InterruptedException;

    //返回一个key
    public abstract KEYIN getCurrentKey() throws IOException, InterruptedException;

    //返回一个value
    public abstract VALUEIN getCurrentValue() throws IOException, InterruptedException;

    //返回是否在处理
    public abstract float getProgress() throws IOException, InterruptedException;

    //关闭reader
    public abstract void close() throws IOException;
}

이 추상 클래스는 데이터 조각을 읽는 포함, 구조는 KV로 처리됩니다. 이 분석에 관해서 입력 소스에서 context.getCurrentKey에 의해 mapper.run 방법 () 메소드가 비슷한 호출이 키 사실을 얻으려면, 이러한 방법은 얻을 RecordReader.

3 InputFormat과 관계 RecordReader

우리는 위의 소스에서 볼 수 있습니다.
InputFormat : 슬라이스 계획 정보에 대한 책임 및 RecordReader을 만들기 개체
현재 매퍼 슬라이스 계획에 따라 후 문맥 매퍼로 전달 KV의 형태로 처리 데이터 처리를 담당하는 부분을 읽어 : RecordReader한다.

두, InputFormat 일반적인 구현 클래스와 RecordReader

일반적으로 사용되는이 있습니다 TextInputFormat는, KeyValueTextInputFormat, NLineInputFormat, CombineTextInputFormat 및 사용자 정의 InputFormat은 (사용자 정의에 대한 또 다른 기사가있다)

1 TextInputFormat

이것은 InputFormat의 기본 모드 데이터 블록 모드를 얇게 절단되고, 블록 크기의 기본 크기입니다. 파일은 적어도 하나 개의 슬라이스 (그러나 작은)입니다. 이 클래스는 상위 클래스 정의 getsplit () 슬라이싱 방식을 사용하기 때문에 FileInputFormat 상속.
RecordReader는 LineRecordReader를 사용하여. 슬라이스 가공 KV, 각 레코드는 단일 라인이다. K는 라인 전체 파일에 저장된 결합 LongWritable 타입 바이트 오프셋이다. 이 값은 라인의 내용입니다, 어떤 라인 종결 자 (캐리지 리턴과 라인 피드)를 포함하지 않는다.

2, KeyValueTextInputFormat

이 클래스는 또한 getsplit FileInputFormat 상위 클래스 () 메소드가 분리되면, 상기 슬라이스와 일관된 방식으로 사용된다.
RecordReader는 KeyValueLineRecordReader를 사용하여. 기록되는 각 행의 하나는, 구분 키 값으로 나누어 져 있습니다. 구분 설정, 드라이브 클래스에 conf.set (KeyValueLineRecordReader.KEY_VALUE_SEPERATOR를, "")로 설정하면. 기본 구분 기호는 탭 (\의 t)이다.

3 NLineInputFormat

이 클래스는 FileInputFormat을 상속하지만 그녀는 getSplit 방법을 재 작성하는 것이 있지만, 슬라이스 다른 방법을 사용합니다. 이러한 관계없이 데이터 사이즈의 라인 (5), 그 조각 같은 라인 (5) 등의 조각을 행의 수에 의해 지정된다. 라인의 수는 mapreduce.input.lineinputformat.linespermap을 통해이 매개 변수를 썬다.
RecordReader는 LineRecordReader를 사용하여. 그리고 유사한 위에서 반복되지 않습니다.

4 CombineTextInputFormat

이 클래스는 부모 클래스 FileInputFormat에서 상속, CombineFileInputFormat에서 상속됩니다. 에서 getSplits 방법 CombineFileInputFormat를 다시 작성합니다. 기본 FileInputFormat 아무리 작은 파일, 파일은 적어도 하나 개의 조각이기 때문이다. 당신이 작은 파일을 많이가 발생하면, 그것은 조각의 많은 원인이됩니다. 그리고 여기에 슬라이스 슬라이스의 크기에 따라 엄격 방법이다, 작은 파일이 함께 할 것입니다, 단지 슬라이스로 지정된 크기에 도달합니다.
RecordReader는 CombineFileRecordReader를 사용하여. 취급 및 유사 LineRecordReader하지만, 섹션은 하나 개 이상의 파일에서 할 수있다, 방법에 약간의 문제를 참조하십시오.

셋째, 규정 지정된 inputformat

job.setInputFormatClass(xxxInputFormat.class);

추천

출처blog.51cto.com/kinglab/2445188