복붙노트

[HADOOP] 한 번에 여러 행을 읽는 Hadoop

HADOOP

한 번에 여러 행을 읽는 Hadoop

나는 4 줄마다 한 세트가 기록을 나타내는 파일을 가지고있다.

예를 들어 처음 네 줄은 레코드 1을 나타내고, 다음 네 줄은 레코드 2를 나타냅니다.

Mapper가이 4 줄을 한 번에 입력하도록하려면 어떻게합니까?

또한, Hadoop에서 파일 분할이 레코드 경계에서 발생하기를 원합니다 (행 번호는 4의 배수 여야 함). 따라서 레코드는 여러 개의 분할 파일에 걸쳐 스팬을 갖지 않습니다.

어떻게 할 수 있습니까?

해결법

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

    1.다른 접근 방식보다 약간 더러운 접근 방식

    다른 접근 방식보다 약간 더러운 접근 방식

    옳은 길

    자신의 RecordReader, InputSplit 및 InputFormat을 정의해야 할 수 있습니다. 정확히 무엇을하려고 하느냐에 따라 위의 세 가지 중 기존의 것을 재사용 할 수 있습니다. 키 / 값 쌍을 정의하기 위해 자신 만의 RecordReader를 작성해야하며 경계를 정의하는 데 도움이되는 고유 한 InputSplit을 작성해야 할 것입니다.

    가능한 또 다른 올바른 방법입니다.

    위의 작업은 상당히 어렵습니다. 데이터 세트를 제어 할 수 있습니까? 어느정도 (사전에 들어 오거나 쉬는 동안) 사전 처리 할 수 ​​있습니까? 그렇다면 Hadoop의 상자에서 읽는 것이 더 쉬운 무언가를 데이터 세트 int로 변환하는 것을 강력히 고려해야합니다.

    같은 것 :

    ALine1
    ALine2            ALine1;Aline2;Aline3;Aline4
    ALine3
    ALine4        ->
    BLine1
    BLine2            BLine1;Bline2;Bline3;Bline4;
    BLine3
    BLine4
    

    아래로 그리고 더러운

    데이터의 파일 크기를 제어 할 수 있습니까? 블록 경계에서 수동으로 데이터를 분리한다면, Hadoop은 스플릿을 스패닝하는 레코드를 신경 쓰지 않아도됩니다. 예를 들어, 블록 크기가 64MB이면 파일을 60MB 청크에 씁니다.

    입력 분할에 대해 걱정하지 않고 더러운 작업을 수행 할 수 있습니다.지도 함수에서 새 키 / 값 쌍을 목록 객체에 추가합니다. 목록 개체에 항목이 4 개있는 경우 처리하고 무언가를 내 보낸 다음 목록을 지 웁니다. 그렇지 않으면 아무 것도하지 않고 아무 것도 방출하지 말라.

    데이터를 수동으로 분할해야하는 이유는 4 행 레코드 전체가 동일한 맵 작업에 제공된다는 것을 보증하지 않기 때문입니다.

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

    2.다른 방법 (쉽지만 효율적이지 않을 수도 있음)은 FileInputFormat # isSplitable ()을 구현하는 것입니다. 그런 다음 입력 파일은 분할되지 않고지도 당 하나씩 처리됩니다.

    다른 방법 (쉽지만 효율적이지 않을 수도 있음)은 FileInputFormat # isSplitable ()을 구현하는 것입니다. 그런 다음 입력 파일은 분할되지 않고지도 당 하나씩 처리됩니다.

    import org.apache.hadoop.fs.*;
    import org.apache.hadoop.mapred.TextInputFormat;
    public class NonSplittableTextInputFormat extends TextInputFormat {
        @Override
        protected boolean isSplitable(FileSystem fs, Path file) {
            return false;
        }
    }
    

    그리고 오렌지 옥토퍼스가 말했듯이

    지도 함수에서 새 키 / 값 쌍을 목록 객체에 추가합니다. 목록 개체에 항목이 4 개있는 경우 처리하고 무언가를 내 보낸 다음 목록을 지 웁니다. 그렇지 않으면 아무 것도하지 않고 아무 것도 방출하지 말라.

    이것은 다음과 같은 이유로 오버 헤드가 있습니다.

    ** 위의 코드는 Hadoop에서 온 것입니다 : The Definitive Guide

  3. from https://stackoverflow.com/questions/8140416/hadoop-read-multiple-lines-at-a-time by cc-by-sa and MIT license