2010-12-06 8 views
5

지도 축소 작업 체인을 실행하여 가장 쉬운 해결책은 jobcontroller 인 것 같습니다. 나는 두 가지 직업, job1과 job2를 가지고 있다고 말한다. job1 다음에 job2를 실행하고 싶습니다. 글쎄, 그것은 몇 가지 문제에 직면했다. 내가 코드를 실행할 때이 출력을 점점 계속hadoop에서 여러 MapReduce 작업 실행

JobConf jobConf1 = new JobConf(); 
JobConf jobConf2 = new JobConf(); 
System.out.println("*** Point 1"); 
Job job1 = new Job(jobConf1); 
System.out.println("*** Point 2"); 
Job job2 = new Job(jobConf2); 
System.out.println("*** Point 3"); 

:

*** Point 1  
10/12/06 17:19:30 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId= 
*** Point 2  
10/12/06 17:19:30 INFO jvm.JvmMetrics: Cannot initialize JVM Metrics with processName=JobTracker, sessionId= - already initialized 
*** Point 3 

내가 생각하는 내 문제는 어떻게 든 관련이 있다는 것입니다 "를 디버깅 시간 후, 나는이 라인에 코드를 좁혀 JMV를 초기화 할 수 없습니다 .... "라인. 그게 뭐야? JobController에 넘겨주기 위해서 하나 이상의 작업을 어떻게 인스턴스화 할 수 있을까요?

10/12/07 11:28:21 INFO jvm.JvmMetrics: Cannot initialize JVM Metrics with processName=JobTracker, sessionId= - already initialized 
Exception in thread "main" org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: file:/home/workspace/WikipediaSearch/__TEMP1 
     at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(FileInputFormat.java:224) 
     at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.getSplits(FileInputFormat.java:241) 
     at org.apache.hadoop.mapred.JobClient.writeNewSplits(JobClient.java:885) 
     at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:779) 
     at org.apache.hadoop.mapreduce.Job.submit(Job.java:432) 
     at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:447) 
     at ch.ethz.nis.query.HadoopQuery.run(HadoopQuery.java:353) 
     at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65) 
     at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79) 
     at ch.ethz.nis.query.HadoopQuery.main(HadoopQuery.java:308) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.apache.hadoop.util.RunJar.main(RunJar.java:156) 

__Temp1는 첫 번째 작업의 출력 폴더입니다, 난에 입력되고 싶어 : 나는 두 번째 작업을 초기화하기 전에 (사실) job1.waitForTheCompletion를 추가 할 때

, 그것은 나에게 오류를 준 두 번째 것. 그리고 비록 내 waitForCompletion 라인 내 코드에서, 그것은 여전히이 경로가 존재하지 않는 불평이야.

답변

5

디버깅 이틀 후, 문제가 hadoop 내부 디렉토리 이름 규칙과 관련되어 있음이 밝혀졌습니다. 겉으로보기에, 입력 또는 출력의 map-reduce 디렉토리에서는 밑줄 "_"로 시작하는 이름을 선택할 수 없습니다. 그 멍청한! 경고와 오류는 전혀 도움이되지 않았습니다.

+0

Hadoop 설명서는 완벽하지 않습니다. InputSplit의 서브 클래스가 Writable을 구현해야한다는 것을 배우는 것이 영원히 필요하다는 것을 기억합니다. 당신은 그들이 InputSplit 문서에서 어딘가에 대해 언급 할 것이라고 생각할 것입니다. 나는 항아리에 포장하지 않고서도 성공적으로 작업을 수행하지 못했습니다. – dspyz

0

다른 작업이 완료되지 않은 상태에서 작업을 만들 수 있습니까? hadoop 0.20.2를 사용합니다 (JobConf는 더 이상 지원되지 않습니다. 하와 이어는 이전 버전과의 호환성을 지원한다고 주장하지만, 실제로는 그렇지 않습니다). job2가 생성되기 전에 job1.waitForCompletion (true)을 추가하면 여전히 문제가 발생합니까?

+0

안녕하세요, 사실 저는이 시나리오를 포함하여 모든 시나리오를 테스트했습니다. for (int i = 0; i <2; i ++) {Job job = new Job (getConf(), "iteration"); Job을 초기화하십시오. job.wait.waitForCompletion (true); } 그리고 여전히 나는 같은 경고를 계속 받는다. 그런 다음 새로운 일이 일어났습니다. 문제를 볼 수 있도록 주요 질문 게시물을 업데이트했습니다. – narengi

관련 문제