복붙노트

[HADOOP] 하둡의 매퍼 입력 키 - 값 쌍

HADOOP

하둡의 매퍼 입력 키 - 값 쌍

일반적으로 다음과 같은 형식으로 매퍼를 작성합니다.

public static class Map extends Mapper<**LongWritable**, Text, Text, IntWritable>

여기서 mapper에 대한 입력 키 - 값 쌍은 입니다 - 매퍼가 입력 데이터를 가져올 때마다 줄 단위로 읽습니다. 따라서 매퍼의 Key는 줄 번호를 나타냅니다. 내가 틀렸다면.

내 질문은 : 매퍼에 대한 입력 키 - 값 쌍을 <텍스트, 텍스트>로 제공하면 오류가 발생합니다.

 java.lang.ClassCastException: org.apache.hadoop.io.LongWritable cannot be cast to org.apache.hadoop.io.Text

mapper의 입력 키 - 값 쌍을 로 제공하는 것이 필수입니까? 그렇다면 왜? 그렇다면 오류의 이유는 무엇입니까? 오류의 적절한 추론을 이해하도록 도와 주시겠습니까?

미리 감사드립니다.

해결법

  1. ==============================

    1.mapper에 대한 입력은 사용되는 InputFormat에 따라 다릅니다. InputFormat은 들어오는 데이터를 읽고 Mapper가 기대하는 형식으로 형식을 지정합니다. 기본 InputFormat은 FileInputFormat 를 확장하는 TextInputFormat입니다.

    mapper에 대한 입력은 사용되는 InputFormat에 따라 다릅니다. InputFormat은 들어오는 데이터를 읽고 Mapper가 기대하는 형식으로 형식을 지정합니다. 기본 InputFormat은 FileInputFormat 를 확장하는 TextInputFormat입니다.

    보다 다른 키 - 값 유형 서명이있는 매퍼를 사용하여 InputFormat을 변경하지 않으면이 오류가 발생합니다. 입력을 예상하면 적절한 InputFormat을 선택해야합니다. 작업 설정에서 InputFormat을 설정할 수 있습니다 :

    job.setInputFormatClass(MyInputFormat.class);
    

    그리고 말했듯이, 기본적으로이 설정은 TextInputFormat으로 설정됩니다.

    이제, 입력 데이터가 쉼표로 구분 된 개행 구분 레코드의 묶음이라고 가정 해 봅니다.

    매퍼에 대한 입력 키 ( "A", "value1"), ( "B", "value2")를 원한다면 사용자 정의 InputFormat과 RecordReader를 서명으로 구현해야합니다. 다행히도, 이것은 꽤 쉽습니다. 여기에 예제가 있으며 아마 StackOverflow 주위에 떠있는 몇 가지 예제가 있습니다.

    즉, FileInputFormat 를 확장하는 클래스와 RecordReader 를 확장하는 클래스를 추가합니다. FileInputFormat # getRecordReader 메서드를 재정의하고 사용자 지정 RecordReader의 인스턴스를 반환하도록합니다.

    그런 다음 필요한 RecordReader 논리를 구현해야합니다. 가장 간단한 방법은 사용자 정의 RecordReader에 LineRecordReader의 인스턴스를 만들고 모든 기본 책임을이 인스턴스에 위임하는 것입니다. getCurrentKey 및 getCurrentValue 메소드에서 LineRecordReader # getCurrentValue를 호출하고 쉼표로 분리하여 쉼표로 구분 된 텍스트 컨텐츠를 추출하는 로직을 구현합니다.

    마지막으로 위의 두 번째 단락 뒤에 표시된대로 InputFormat을 Job InputFormat으로 설정하십시오.

  2. ==============================

    2.Tom White의 "Hadoop : The Definitive Guide"책에서 나는 그가 이것에 대한 적절한 대답을 가지고 있다고 생각한다 (197 쪽).

    Tom White의 "Hadoop : The Definitive Guide"책에서 나는 그가 이것에 대한 적절한 대답을 가지고 있다고 생각한다 (197 쪽).

    "TextInputFormat의 키는 단순히 파일 내의 오프셋이므로 일반적으로 그다지 좋지 않습니다. 유능한. 파일의 각 줄은 구분 기호로 구분 된 키 - 값 쌍이되는 것이 일반적입니다. 탭 문자와 같은 예를 들어, 이것은 다음에 의해 생성 된 출력입니다. TextOutputFormat, Hadoop의 기본 출력 형식. 이러한 파일을 올바르게 해석하려면, KeyValueTextInputFormat  적절하다.

    구분 기호는 key.value.separator.in.input.line  재산. 그것 기본적으로 탭 문자입니다. "

  3. ==============================

    3.매퍼 입력을위한 키는 항상 정수형입니다 ... 매퍼 입력 키는 라인의 오프셋 번호를 나타냅니다. 값은 전체 라인을 나타냅니다 ...... 레코드 판독기는 첫 번째 사이클에서 한 줄을 읽습니다. 그리고 mapper의 o / p는 원하는 모든 것이 될 수 있습니다 (그것은 (텍스트, 텍스트) 또는 (텍스트, IntWritable) 일 수 있습니다 ...)

    매퍼 입력을위한 키는 항상 정수형입니다 ... 매퍼 입력 키는 라인의 오프셋 번호를 나타냅니다. 값은 전체 라인을 나타냅니다 ...... 레코드 판독기는 첫 번째 사이클에서 한 줄을 읽습니다. 그리고 mapper의 o / p는 원하는 모든 것이 될 수 있습니다 (그것은 (텍스트, 텍스트) 또는 (텍스트, IntWritable) 일 수 있습니다 ...)

  4. from https://stackoverflow.com/questions/19624607/mapper-input-key-value-pair-in-hadoop by cc-by-sa and MIT license