본문 바로가기
Study/Bigdata

Hadoop MapReduce 여러개 Map, Reduce 실행하기 [JobControl 이용시 Stop이 안될때]

by redyuika 2014. 4. 2.

현재 MapReduce관련 작업을 하고 있습니다.


기본적으로 MapReudce는 Map작업과 Reduce작업으로 이루어져있습니다.


만약 Map 이 1개 , Reduce가 1개 일때는 문제가 안되지만, Map 작업이 2개 이상이 되거나 Reduce작업이 2개 이상되어야 할경우가 문제가 됩니다.


지금 책을 보면서, 여러가지를 공부하고 있는데, 인터넷검색결과 이럴경우, 3가지 해결방법이 제시가 됩니다.


첫번째는 jobconf를 여러개 생성해서, jobclient를 실행해서 하는 방법입니다.

두번째는 책에 가장 많이 나와있는 케이스인데, ChainMapper를 사용해서 여러개의 Map과 Reduce 작업을 하는 방법입니다.


지금 현재 MapRedue를 이용해서 만들고 있는데 저한테는 아직 적합한것 같지 않네요. 제가 잘못찾을수도 있고.. .

마지막 방법은 JobControl 을 이용해서 작업하는 방법입니다 ..


레파토리는 다음과 같습니다. 


               JobConf jobconf = new JobConf(conf);

 ... 해당하는 JOB의 설정

JobConf jobconf2 = new JobConf(conf);

... 해당하는 JOB의 설정


            JobControl jobControl = new JobControl("TestModule");

Job wrapperJob =  new Job(jobconf);

Job wraaperJob2 = new Job(jobconf2);

wraaperJob2.addDependingJob(wrapperJob);

jobControl.addJob(wrapperJob);

jobControl.addJob(wraaperJob2);

   jobControl.run();


먼저 할려는 작업을 jobconf를 통해서 정의 합니다. 저는 여러번의 map작업이 있어야 하기 때문에 2개를 정의한다고 가정합니다. 아직 Reduce나 그이후작업에 대한 정의는 안된상태입니다. 일단 여러개 작업을 이어붙이는 것이 목적이기 때문에


JobControl 을 만들고, Job 클래스를 이용해서 위에서 만든 jobconf를 만든다음 생성합니다.

그다음 저는 첫번째 잡을 wraapperJob으로 만들고 두번째 잡을 wrapperJob2로 만들었습니다.

여기서 WrapperJob2.AddDependingJob 이라는 메소드가 있는데, 의존한다는 의미로 job2가 실행되기 위해서 Job1의 결과값을 받아오겠다? 이정도로 이해하시면 됩니다.

그리고 만든 JobControl.addJob 메소드를 이용해서 잡을 추가하고

JobControl.run을 하시면 됩니다. 


그다음이 문제인데 이렇게 해서 하둡에서 MapReduce작업을 합니다. 웹 모니터링 창에는 작업이 끝났다고 하는데, 계속 제 작업은 돌아갔습니다. (책에도 안나오고 난감...)


역시 구글과 스택오버플로 신께서 도움을 주시네요. 몇몇 인터넷을 찾아보니 , 쓰레드를 생성해서 저 잡이 끝났는지 안끝났는지를 체크해야합니다. 


http://grokbase.com/t/hadoop/common-user/097hs9h2rz/using-jobcontrol-in-hadoop

http://wangzejie.iteye.com/blog/2035640


제가 참고한 페이지는 두 페이지 입니다. 그래서 드라이버 클래스에 쓰레드를 별도로 만들어서 잡의 진행상황을 확인해서 작업을 Jobcontrol을 종료하도록 했습니다. 


                Thread jcThread = new Thread(jobControl);

jcThread.start();

while(true){

if(jobControl.allFinished()){

jobControl.stop();

break;

}

if(jobControl.getFailedJobs().size()>0){

jobControl.stop();

break;

}

}


인터넷을 보시다 보면 return 할때 0,1 하시는건 보실수 있는데, 저는 잘모르겠지만 맵리듀스 드라이버 클래스를 만들때 libtool인가 하는 클래스를 상속받아서 만드시는 분들이 있습니다. 그런 예제들을 보면 0 ,1 리턴 받은 값을 이용해서 제대로 작업이 실행되었는지 확인한것 같습니다. 


아직 학생신분이다보니.. 하다가 생긴 짤막한 지식을 적었습니다.. 혹시 저하고 같은 고민을 하시는 분에게 도움이 되길..


또는 맵리듀스를 하시는 실무자께서 보고계신다면, 제가 잘못알고 있거나, 혹은 도움되는내용이 있으시면 코멘트 해주시면 감사합니다 !!