2013-04-27 1 views
0

다음은 텍스트 파일을 처리하는 hadoop 프레임 워크에 대한 것입니다. 내가 어딘가에 잘못 가고 있다면 나를 바로 잡으십시오.DBRecordReader는 몇 번 만들어지고 있습니까?

각 매퍼는 일부 레코드가 포함 된 입력 분할에서 작동합니다. 입력 분할마다 입력 판독에서 레코드 읽기를 시작하는 레코드 판독기가 생성됩니다. 입력 분할에 n 개의 레코드가있는 경우 맵퍼의 map 메소드는 n 번 호출되며 레코드 판독기를 사용하여 키 - 값 쌍을 읽습니다.

이제 데이터베이스 관점으로 이동합니다. 단일 원격 노드에 데이터베이스가 있습니다. 이 데이터베이스의 테이블에서 일부 데이터를 가져 오려고합니다. DBConfigure를 사용하여 매개 변수를 구성하고 DBInputFormat을 사용하여 입력 테이블을 언급합니다. 이제 내 테이블에 100 개의 레코드가 있고, 출력에서 ​​70 개의 레코드를 생성하는 SQL 쿼리를 실행한다고 가정 해보십시오.

내가 알고 싶습니다 :

어떻게 InputSplits은 위의 경우 (데이터베이스)에 만들어지고?

입력 분할 작성, 내 sql 쿼리가 생성하는 레코드 수 또는 테이블 (데이터베이스)의 총 레코드 수는 무엇입니까?

위의 경우 (데이터베이스)에서 생성되는 DBRecordReader의 수는 얼마나됩니까?

답변

2

가 어떻게 InputSplits가 위의 경우 (데이터베이스)에 만들어지고?

// Split the rows into n-number of chunks and adjust the last chunk 
// accordingly 
    for (int i = 0; i < chunks; i++) { 
    DBInputSplit split; 
    if ((i + 1) == chunks) 
     split = new DBInputSplit(i * chunkSize, count); 
    else 
     split = new DBInputSplit(i * chunkSize, (i * chunkSize) 
      + chunkSize); 
    splits.add(split); 
    } 

거기 방법은, 그러나 이제 chunksize 영역에서 살펴 보자에 따라 이해하기 :

statement = connection.createStatement(); 
results = statement.executeQuery(getCountQuery()); 
results.next(); 

long count = results.getLong(1); 

int chunks = job.getConfiguration().getInt("mapred.map.tasks", 1); 
long chunkSize = (count/chunks); 

그래서 chunksize 영역이 수를 필요 = SELECT COUNT(*) FROM tableName을 청크 = mapred.map.tasks 또는 1의 경우로이 분할 구성에 정의되어 있지 않습니다.

마지막으로 각 입력 분할은 읽는 데이터베이스 유형을 처리하기 위해 생성 된 RecordReader이됩니다 (예 : MySQLDBRecordReader, MySQL 데이터베이스의 경우).

추가 정보를 위해 source

+0

그래서 내 테이블에 100 개의 레코드가 있고 맵 작업 수가 3이라고 설정되면 청크의 수와이 경우 생성되는 입력 스플릿의 수는 3입니다. 33 번째 청크 33 번째 레코드가있는 두 번째 청크, 34 개 레코드가있는 세 번째 청크가 있습니다. 따라서 각 청크/inputsplit에 대해 하나씩, 즉 3 개의 레코드 판독기를 만들 것입니다. –

+0

맞습니다. 위에있는 첫 번째 코드 블록의 주석을 확인하십시오. _ 행을 n 개의 청크로 분할하고 마지막 청크를 적절하게 조정하십시오. 따라서 chunkSize = 33 및 chunk = 3을 사용하여 코드를 작업하면 위에 설명 된 것으로 끝날 것입니다 . 마지막지도 (지도 번호 3)는 (i + 1) == 청크를 트리거하고 최종 분할은 (chunkSize = 33 times i = 2) = 66 (시작)에서 100 (끝)까지의 기록을 길게합니다. 34! 예 수학! – Engineiro

+0

귀하의 질문에 만족합니까? 그렇다면 내 대답을 선택하십시오. – Engineiro

1

체크 아웃이 @Engineiro 실제 하둡 소스를 복용하여 잘 설명이 나타납니다. 그냥 대답하기 위해, DBRecordReader의 수는지도 작업의 수와 같습니다.

더 자세히 설명하면 Hadoop Map 측 프레임 워크는 자식 JVM이 추가 맵 작업을 위해 재사용되지 않는 경우 각 맵 작업에 대해 DBRecordReader 인스턴스를 생성합니다. 즉, DBInputFormat의 경우 입력 분할 수는 map.reduce.tasks의 값과 같습니다. 따라서 각지도 작업의 레코드 판독기에는 테이블에서 데이터의 하위 집합을 가져 오기 위해 쿼리를 구성하는 메타 정보가 있습니다. 각 레코드 판독기는 아래와 비슷한 페이지 매김 유형의 SQL을 실행합니다.두 번째지도 작업은 입력 형식의 모든 유형의 일반화 6

(13) 사이에 행을 반환 할

SELECT * FROM (SELECT a.*,ROWNUM dbif_rno FROM (select * from emp) a WHERE rownum <= 6 + 7) WHERE dbif_rno >= 6 

위의 SQL은, 기록 독자의 수는지도 작업의 수와 동일 .

+0

이 메타 데이터를 알 수있는 방법과 예제 쿼리를 작성하는 방법이 있습니까? 큰 도움이 될 것입니다 ... –

+0

DBInputFormat의 입력 분할은 시작 및 끝 행과 같은 페이지 매김 키와 매우 유사한 시작 및 끝 행을 포함합니다. 이 정보를 사용하고 SQL을 생성하고 실행하는 MapTask의 DBRecordReader에 제공되는 메타 정보입니다. 자세한 내용은 org.apache.hadoop.mapreduce.lib.db.DBRecordReader의 nextKeyValue() 메소드를 참조하십시오. –

관련 문제