2012-03-26 2 views
1

실행중인 특정 작업은 일부 대형 HDFS 파일을 처리하기 전에 DB (MySQL과 관련 있음에도 불구하고)에서 일부 메타 데이터를 수집해야합니다. 이 메타 데이터는 파일의 데이터에 추가되어 나중에 map/combine/reduce 단계로 전달됩니다.Hadoop MapReduce와 데이터베이스 쿼리 결합하기

"올바른"이 쿼리를 넣을 위치가 궁금합니다. 매퍼가 시작될 때 사용할 수 있도록 메타 데이터가 필요하지만 모든 매퍼가 동일한 쿼리를 실행하므로 중복되는 것처럼 보입니다. 어떻게하면이 쿼리를 한 번 수행하고 모든 매퍼에서 결과를 공유 할 수 있습니까? 작업을 수행하는 모든 노드간에 데이터를 공유하는 일반적인 방법이 있습니까 (HDFS에 쓰는 것 제외)? 감사.

답변

3

주 기능에서 MYSql 쿼리를 사용할 수 있으며 쿼리 결과를 문자열로 저장할 수 있습니다. 그런 다음 변수를 Hadoop 작업 구성 객체로 설정할 수 있습니다. 구성 객체에 설정된 변수는 모든 매퍼에서 액세스 할 수 있습니다.

publi class Map(...){을 다음과 같이 메타 데이터 값에 액세스 할 수 있습니다
JobConf conf = new JobConf(Driver.class);
String metainfo = <You metadata Info goes here>;
당신이지도 클래스에 따라서 conf.set("metadata",metainfo);



메인 클래스는 다음과 같습니다

....

(210) String sMetaInfo="";

public void configure(JobConf job) {

sMetaInfo= job.get("metadata"); // Getting the metadata value from Job Configureation Object

}
public void map(....){

// Map Function
}

}

+3

또한 메타 데이터가 너무 커서 구성에 저장할 수없는 경우 DistributedCache를 사용해야합니다. 드라이버의 DB에서 메타 데이터를 가져 와서 파일에 저장 한 다음 DistributedCache에 파일을 추가하십시오. 메모리에로드하여 필요할 때 추가 할 수 있도록 각 매퍼에서 파일을 사용할 수 있습니다. –

+0

두 답변 모두 우수합니다. 감사합니다. – sa125

0

당신은 cloude이있는 경우 내가 급습을 사용 ra 배포. 나는 보통 Java에서 계단식으로 프로그램하고 db 소스는 dbmigrate를 소스 "탭"으로 사용하여 일급 시민으로 만듭니다. dbmigrate와 함께 pks를 사용하면 성능이 충분합니다.

+0

https://github.com/Cascading/cascading-dbmigrate –