2013-06-14 2 views
3

가끔 내 MR 업무가 MyMapper 클래스를 찾을 수 없다는 불만을 나타냅니다. 그리고 나는 그 일을해야합니다 .setJarByClass (MyMapper.class); 내 jar 파일에서로드하도록 지시합니다.매퍼 클래스가 없습니다.

클라우 데라의 @의 클라우 데라-VM :/tmp를/번역기 $ 하둡 항아리 MapReduceJobs.jar 번역기 13/06/13 3시 36분 57초이 mapred.JobClient 경고/입/Portuguese.txt 번역기/출력 : 없음 작업 jar 파일 세트. 사용자 클래스를 찾을 수 없습니다. JobConf (Class) 또는 JobConf # setJar (String)을 참조하십시오. 13/06/13 03:36:57 INFO input.FileInputFormat : 처리 할 총 입력 경로 : 1 13/06/13 03:36:57 INFO mapred.JobClient : 실행중인 작업 : job_201305100422_0043 13/06/13 03 : 36 : 58 정보 mapred.JobClient : map 0 % reduce 0 % 13/06/13 03:37:03 INFO mapred.JobClient : 작업 ID : 시도 _201305100422_0043_m_000000_0, 상태 : FAILED java.lang.RuntimeException : java.lang. ClassNotFoundException : com.mapreduce.variousformats.keyvaluetextinputformat.MyMapper at org.apache.hadoop.conf.Configuration.getClass (Configuration.java:996) at org.apache.hadoop.mapreduce.JobContext.getMapperClass (JobContext.java:212)) at org.apache.hadoop.mapred.MapTask.runNewMapper (MapTask.java:601)

질문 : 왜 그런 일이 발생합니까? 왜 내 항아리 파일에서로드하는지 항상 알려주지 않습니다. 이러한 종류의 문제를 해결하기위한 모범 사례가 있습니까? 또한 일부 제 3 자 라이브러리를 사용하는 경우, 내가 그들을 위해 이렇게해야합니다. 합니다 (예) 현재와 lib 디렉토리에서 모든 항아리 종속성을 추가하려면 다음

사용 :

답변

6

하면 다음 예제와 같은 작업을 제출시 모두 HADOOP_CLASSPATH-libjars에 종속성을 추가해야합니다

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:`echo *.jar`:`echo lib/*.jar | sed 's/ /:/g'` 

hadoop jar을 통해 작업을 시작할 때 당신은 또한 -libjars의 사용을 통해 그것을 종속성의 항아리를 전달해야한다는 생각이다. 내가 사용하려면 :

hadoop jar <jar> <class> -libjars `echo ./lib/*.jar | sed 's/ /,/g'` [args...] 

참고 :sed 명령은 다른 구분 문자를 필요로; HADOOP_CLASSPATH:으로 분리되고 -libjars,으로 분리되어야합니다.

+0

죄송하지만 기계 액세스 권한이 없습니다. hadoop jar -libjars'echo ./lib/*.jar | " 내 jar 파일 안에 모든 외부 jar 파일을 묶는 중이라면 여전히 job.setJarByClass를 사용해야합니다. 그렇지 않으면 hadoop이 그것을 처리합니다. –

5

예, job.setJarByClass이 필요합니다. 그래서 그 hadoop 귀하의 병을 작업 추적기에 복사합니다. job.setJarByClass을 호출하지 않으면 hadoop은 jar 파일이 작업 추적기의 classpath에 있다고 생각하므로 jar 파일을 복사하지 않습니다.

+0

동의하지만 그 이유는 무엇입니까? 때때로 나는 job.setJarByClass를 사용할 필요조차 없다. jar 파일에서 해당 클래스를로드해야한다는 것을 자동으로 알게되는 이유는 무엇인지 궁금하다. –

+0

아시다시피, 단일 노드 클러스터에서'setJarByClass' 없이도 작동합니다. 노드가 여러 개인 경우이 메서드를 호출해야합니다. – Marboni

관련 문제