2012-02-13 1 views
0

저는 하둡에 초보자이며 다음과 같은 문제가 있습니다. 내가하려는 것은 데이터베이스의 샤드를 맵핑하는 것입니다 (왜 그런 작업을해야하는지 묻지 말기 바란다). 그리고 나서이 데이터에 대해 특정 작업을 수행하고, 결과를 감속기에 출력하고, 그 출력을 다시 사용한다. 동일한 샤드 형식을 사용하여 동일한 데이터에 대해 두 번째 단계 맵/축소 작업을 수행합니다. Hadoop은 데이터베이스의 샤드를 보내는 입력기를 제공하지 않습니다. LineInputFormat 및 LineRecordReader를 사용하여 한 줄씩 보낼 수 있습니다. 이 경우 NLineInputFormat도 도움이되지 않습니다. 필자 자신의 InputFormat을 작성하기 위해 FileInputFormat 및 RecordReader 클래스를 확장해야합니다. 기본 코드가 FileSplits 및 파일 분할과 관련된 모든 문제를 이미 다루었 기 때문에 LineRecordReader를 사용하는 것이 좋습니다. 지금해야 할 일은 정확히 어떻게 알지는 못하는 nextKeyValue() 메서드를 재정의하는 것입니다.새 API를 사용하는 Hadoop 맞춤 입력 형식

for(int i=0;i<shard_size;i++){ 
      if(lineRecordReader.nextKeyValue()){        lineValue.append(lineRecordReader.getCurrentValue().getBytes(),0,lineRecordReader.getCurrentValue().getLength()); 

}

위의 코드는 쓴하지만, 어떻게 든 잘 작동하지 않는 것입니다. 미리 감사드립니다.

답변

0

입력 파일에 연결 문자열과 샤드를 찾을 수있는 다른 표시를 넣으라고 제안합니다.
Mapper가이 정보를 가져 와서 데이터베이스에 연결하고 작업을 수행합니다. 나는 결과 세트를 hadoop의 쓰기 가능한 클래스로 변환하지 말 것을 제안하지 않을 것이다 - 그것은 성능을 저해 할 것이다.
해결해야 할 문제는 상대적으로 작은 입력을 충분히 분할하는 것입니다. 각각의 샤드 참조가있는 작은 파일을 간단하게 만들거나 입력 포맷을 조정하여 작은 스플릿을 만들 수 있습니다. 두 번째 방법은보다 유연 해집니다.

+0

은 같은 것입니다 this – Ahmedov

0

내가 한 것은 이런 것입니다. 내가

public boolean nextKeyValue() throws IOException, 

예외 : InterruptedException을 한 번에 n 개의 라인을 읽고 입력으로 맵퍼로 보내 내 자신의 기록 판독기를 쓴 {

StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < 5; i++) { 
     if (!lineRecordReader.nextKeyValue()) { 
      return false; 
     } 
     lineKey = lineRecordReader.getCurrentKey(); 
     lineValue = lineRecordReader.getCurrentValue(); 
     sb.append(lineValue.toString()); 
     sb.append(eol); 
    } 
    lineValue.set(sb.toString()); 
    //System.out.println(lineValue.toString()); 

    return true; 

    // throw new UnsupportedOperationException("Not supported yet."); 
} 

어떻게 당신은 얇은 내가 무슨 짓을

+0

여기서 모든 것이 명확하지는 않지만 split을 결정할 때 inputFormat의 작은 부분으로 나눠야하는 것처럼 보입니다. 전체 큰 데이터 블록을 RecordReader에 공급 한 후에는 매퍼에 제공 할 수밖에 없습니다. –

+0

@DavidGruzman은 독자가 5 행 (5는 임의의 숫자로 변경할 수 있음)이며 매퍼로 보냅니다. 매퍼는이 5 줄의 입력을 가져 와서 특정 작업을 수행하고 다른 키와 값을 가진 여러 출력을 생성 한 다음이를 감속기로 보냅니다. 입력이 분할되는 방식은 linRecordReader 객체에 의해 캡슐화됩니다. – Ahmedov

+0

내가 더 명확하게이 방법을 넣어 보자. 고전적인 WordCount 응용 프로그램에서는 각 행을 파일에서 매퍼로 읽습니다. 매퍼는 그냥 출력하고 (단어, 하나), 감속기는이 값을 합산합니다. 맞습니까? 각 매퍼에게 한 줄만이 아닌 파일을 보내고 매퍼 내에서 줄 단위로 읽은 다음 출력 (단어, 한 줄)하는 것이 더 좋지 않겠습니까? 그런 다음 결합기를 사용하여 중간 값을 집계하고 (반복되는 단어가 많을 것이므로) 결과를 축소기에 보냅니다. 그것은 너무 많은 매퍼 인스턴스를 필요로하지 않기 때문에 더 빠를 것이고 cmb – Ahmedov