2011-11-15 4 views
7

4 줄마다 한 세트가 레코드를 나타내는 파일이 있습니다.Hadoop은 한 번에 여러 행을 읽습니다.

예를 들어, 처음 네 개의 선이 신기록을 나타내고, 다음 네 개의 레코드 2를 대표 등 ..

어떻게 매퍼 입력 한 번에 네 가지 라인을 보장 할 수 있는가?

또한, 나는 ... 기록은 여러 개의 분할 파일에서 범위를하지 않도록 하둡의 파일 분할이 (줄 번호가 4의 배수 여야합니다) 레코드 경계에서 일어날

어떻게이 원하는 끝내라?

답변

11

몇 가지 접근 방식보다 약간 더러운 다른 사람 : 당신은 당신의 자신의 RecordReader, InputSplitInputFormat을 정의 할 수 있습니다


올바른 방법

. 정확히 무엇을하려고하는지에 따라 위의 세 가지 중 기존의 것을 재사용 할 수 있습니다. 키/값 쌍을 정의하기 위해 자신 만의 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 행 레코드가 동일한 맵 작업에 제공된다는 것을 보증하지 않기 때문입니다.

+0

감사에서, 나는 당신이 제시 한 두 번째 방법을 생각했지만, 그 같은 문제 투성이되지 않는 이유는 무엇입니까? 어떻게하면 4 줄을 추가하여 함께 추가하고 한 줄을 만듭니 까? – Gitmo

+0

트릭을 수행 할 수있는 Perl이나 Python으로 작성할 수 있습니다. 그것이 내가 염두에 두었던 것입니다. –

+0

파일의 사전 처리가 완료되면 성능 향상을 위해 [SequenceFile] (http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/io/SequenceFile.html)을 압축하여 사용하십시오 . –

3

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; 
    } 
} 

그리고 orangeoctopus 같은

이 최대 파일 작업 완료 시간을 끌 처리

  • 시간을 다음과 같은 이유로 약간의 오버 헤드가

    In your map function, add your new key/value pair into a list object. If the list object has 4 items in it, do processing, emit something, then clean out the list. Otherwise, don't emit anything and move on without doing anything.

    말했다.

  • 많은 데이터가 데이터 노드간에 전송 될 수 있습니다.
  • # of maps = # of files이므로 클러스터가 제대로 활용되지 않습니다.

는 ** 위의 코드는 답장을 보내 Hadoop : The Definitive Guide

+0

감사! 하지만 새로운 API를 사용하고 있습니다. – Gitmo

+0

이 아이디어는 유망한 것으로 들립니다. NLinesInputFormat을 사용하여 각 매퍼에 줄 수를 지정하는 방법은 어떻습니까? 그렇게하면 가장 큰 파일에 의존하지 않게됩니다. 문제는,이 구현되지 않은 Hadoop 0.20 사용하고 있습니다 .. 어떤 생각? – Gitmo

+0

In 0.20 NLineInputFormat은 새 API에서 구현되지 않습니다. 새로운 API NLinesInputFormat을 다른 릴리스에서 0.20으로 이식 할 수 있습니다. 그렇게 어렵지 않아야하며 Hadoop 병을 컴파일하고 빌드하는 방법을 배우게 될 것입니다. –

관련 문제