복붙노트

[HADOOP] Hadoop MapReduce에서 바이너리 파일 용 사용자 정의 InputFormat 및 RecordReader 만들기

HADOOP

Hadoop MapReduce에서 바이너리 파일 용 사용자 정의 InputFormat 및 RecordReader 만들기

저는 이진 형식으로 작성된 커다란 시계열 데이터 파일을 처리하는 M / R 작업을 작성하고 있습니다.이 파일은 다음과 같습니다 (가독성을 위해 여기에 새로운 행이 있으며 실제 데이터는 분명히 연속적입니다).

TIMESTAMP_1---------------------TIMESTAMP_1
TIMESTAMP_2**********TIMESTAMP_2 
TIMESTAMP_3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%TIMESTAMP_3
.. etc

여기서 타임 스탬프는 단순히 8 바이트 구조체이며 처음 2 바이트만큼 식별 할 수 있습니다. 실제 데이터는 위에 표시된 것처럼 중복 값 타임 스탬프 사이에 한정되며 하나 이상의 미리 정의 된 구조체를 포함합니다. mappers에 키 / 값 쌍을 방출하는 사용자 정의 InputFormat을 작성하려고합니다.

< TIMESTAMP_1, --------------------- >
< TIMESTAMP_2, ********** >
< TIMESTAMP_3, %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% >

논리적으로, 나는 현재 TIMESTAMP를 추적하고, TIMESTAMP가 다시 감지 될 때까지 모든 데이터를 모으고 싶습니다. 그런 다음 내 쌍을 레코드로 보냅니다. 내 문제는 RecordReader 내부의 분할간에 동기화되므로 특정 판독기가 다음 분할을 수신하는 경우

# a split occurs inside my data
reader X: TIMESTAMP_1--------------
reader Y: -------TIMESTAMP_1 TIMESTAMP_2****..

# or inside the timestamp
or even: @@@@@@@TIMES
         TAMP_1-------------- ..

이것에 접근하는 좋은 방법은 무엇입니까? 내 CustomRecordReader가 데이터를 잃지 않고 분할간에 동기화 할 수 있도록 파일 오프셋에 액세스하는 쉬운 방법이 있습니까? 나에게는 분할이 어떻게 처리되는지에 대한 개념적 차이가 있으므로 이러한 설명이 도움이 될 수 있습니다. 감사.

해결법

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

    1.일반적으로 분할을 지원하는 입력 형식을 만드는 것은 간단하지 않습니다. 일관된 레코드를 얻기 위해 분할 경계에서 이동할 위치를 찾을 수 있어야하기 때문입니다. XmlInputFormat은 이렇게하는 형식의 좋은 예입니다. 실제로 분할 가능 입력이 필요한지 먼저 고려해 보시기 바랍니다. 입력 형식을 분할 가능하지 않은 것으로 정의 할 수 있으며 이러한 모든 문제가있는 것은 아닙니다. 일반적으로 파일 크기가 블록 크기보다 크지 않으면 아무 것도 없습니다. 그들이하는 경우 - 당신은 데이터 지역의 일부를 풀 것입니다.

    일반적으로 분할을 지원하는 입력 형식을 만드는 것은 간단하지 않습니다. 일관된 레코드를 얻기 위해 분할 경계에서 이동할 위치를 찾을 수 있어야하기 때문입니다. XmlInputFormat은 이렇게하는 형식의 좋은 예입니다. 실제로 분할 가능 입력이 필요한지 먼저 고려해 보시기 바랍니다. 입력 형식을 분할 가능하지 않은 것으로 정의 할 수 있으며 이러한 모든 문제가있는 것은 아닙니다. 일반적으로 파일 크기가 블록 크기보다 크지 않으면 아무 것도 없습니다. 그들이하는 경우 - 당신은 데이터 지역의 일부를 풀 것입니다.

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

    2.FileInputFormat의 구상 서브 클래스 (예 : SeqenceFileAsBinaryInputFormat)를 서브 클래스 화하고 isSplitable () 메서드를 재정 의하여 false를 반환 할 수 있습니다.

    FileInputFormat의 구상 서브 클래스 (예 : SeqenceFileAsBinaryInputFormat)를 서브 클래스 화하고 isSplitable () 메서드를 재정 의하여 false를 반환 할 수 있습니다.

    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.mapred.SequenceFileAsBinaryInputFormat;
    
    public class NonSplitableBinaryFile extends SequenceFileAsBinaryInputFormat{
    
      @Override
      protected boolean isSplitable(FileSystem fs, Path file) {
          return false;
      }
    
      @Override
      public RecordReader getRecordReader(InputSplit split, JobConf job,
      Reporter reporter) throws IOException {
        //return your customized record reader here
      }
    }
    
  3. from https://stackoverflow.com/questions/10531007/creating-custom-inputformat-and-recordreader-for-binary-files-in-hadoop-mapreduc by cc-by-sa and MIT license