Hadoop 코드 분석(3)

2034 단어 hadoop
LineRecoedReader에 대한 NextKeyValue 코드는 다음과 같습니다.
public boolean nextKeyValue() throws IOException {
    if (key == null) {
      key = new LongWritable();
    }
    key.set(pos);
    if (value == null) {
      value = new Text();
    }
    int newSize = 0;
    while (pos < end) {
      newSize = in.readLine(value, maxLineLength,
                            Math.max((int)Math.min(Integer.MAX_VALUE, end-pos),
                                     maxLineLength));
      if (newSize == 0) {
        break;
      }
      pos += newSize;
      if (newSize < maxLineLength) {
        break;
      }

      // line too long. try again
      LOG.info("Skipped line of size " + newSize + " at pos " + 
               (pos - newSize));
    }
    if (newSize == 0) {
      key = null;
      value = null;
      return false;
    } else {
      return true;
    }
  }

키에 있습니다.set(pos)에서 pos는 이 라인의 위치이고value는 이 라인의 내용입니다. 하나의 예는 권위 있는 안내서의 것입니다.
On the top of the Crumpetty Tree
The Quangle Wangle sat,
But his face you could not see,
On account of his Beaver Hat.
이 레코드는 LINERecordReader에서 4개의 K/V 쌍으로 처리됩니다.
(0, On the top of the Crumpetty Tree)
(33, The Quangle Wangle sat,)
(57, But his face you could not see,)
(89, On account of his Beaver Hat.)
wordcount의 예와 결합하여 매번 마퍼가 처리하는 K/V는value를 처리하고StringTokenizer itr = new StringTokenizer(value.tostring()))는value를 하나하나의 표시로 나누어 마퍼의 처리를 거친다.다음과 같은 형식의 중간체를 생성합니다.
(On,1),(the,1),(top,1),(of,1).....다시 job에서 이 중간체를 Reducer에 전달하여 정렬하고 집합하기;
그래서 job의 input이 입력에서 마퍼로 출력하는 것은 대략 다음과 같다.
FIleInputFormat에서inputPath(args)는 input을 File InputFormat의 get Split()에 제출하여 블록을 나눈다. 이 예에서 Text IputFormat는 줄마다 데이터를 가져오는 Line Record Reader를 사용하고 Line Record로 K/V 쌍을 읽는다. Line Record는 사실 리더와 같다. 구체적인 입력 흐름에서 데이터를 읽는 작업은 마퍼에게 맡긴다.

좋은 웹페이지 즐겨찾기