2012-03-27 2 views
3

hadoop map-reduce 작업 jar의 "lib"폴더에 종속 라이브러리를 패키징하는 데 사용되었습니다. 그건 잘 작동합니다. 그러나 이번에는 잘못되었습니다. 어떤 사람이 문제를 해결할 수있는 아이디어를 줄 수 있습니까? 문제는 다음과 같습니다 :hadoop 작업 jar의 "lib"폴더에 패키지 종속 라이브러리가있을 때 ClassNotFoundException이 발생했습니다.

Eclipse "내보내기"기능과 "필요한 라이브러리를 생성 된 JAR로 추출"옵션으로 작업 항아리를 패키징 할 때. 생성 된 작업 항아리가 올바르게 작동합니다.

java.io.IOException: Split class cascading.tap.hadoop.MultiInputSplit not found 
     at org.apache.hadoop.mapred.MapTask.getSplitDetails(MapTask.java:340) 
     at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:365) 
     at org.apache.hadoop.mapred.MapTask.run(MapTask.java:325) 
     at org.apache.hadoop.mapred.Child$4.run(Child.java:270) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at javax.security.auth.Subject.doAs(Subject.java:396) 
     at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1127) 
     at org.apache.hadoop.mapred.Child.main(Child.java:264) 
    Caused by: java.lang.ClassNotFoundException: cascading.tap.hadoop.MultiInputSplit 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
     at java.lang.Class.forName0(Native Method) 
     at java.lang.Class.forName(Class.java:247) 
     at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:943) 
     at org.apache.hadoop.mapred.MapTask.getSplitDetails(MapTask.java:338) 
     ... 7 more 

사람이 몇 가지 아이디어를 제공 할 수 있습니다 : 나는 작업 항아리에서 "LIB"폴더에 의존 라이브러리를 포함하는 개미 스크립트와 함께 작업 항아리를 포장하는 경우

는하지만, 나는 ClassNotFoundException가 발생? 감사!

+0

그리고 당신은 절대적으로 항아리에 lib 폴더에 종속 항아리가 들어 있다고 확신합니다 - jar -tvf myJar.jar이 이것을 알고 있습니까? –

+0

두 항아리 추출 : 이클립스에 의해 만들어진 하나와 개미에 의해 만들어진 다른 ... 어떤 차이가 나타 납니까? 나는이 문제를 일으킬 수있는 개미 파일에 누락 된 것이있을 것이라고 추측합니다. –

+0

그래, 그 수업은 분명 거기있을거야. 계단식 클래스입니다. 나는 여러 번 점검했다. 개미 생성 된 jar 파일에서 계단식 클래스 파일의 압축을 풉니 다. 아직도 문제. – Enlight

답변

0

병은 표지 아래에있는 zip 파일입니다. 따라서, 당신은 왜

  • 가 (너머는,, 등을 WinMerge를 비교)
  • 두 폴더를 추출 비교하는 도구를 비교 그들에게
  • 사용 파일/폴더에 압축을 풉니 다 지퍼에 두 단지 이름을 변경하지 마십시오

    그 차이가 분명하게 나타날 수도 있습니다.

    차이점을 알고 나면 올바른 jar 파일을 생성하도록 빌드 도구를 구성하는 것이 더 쉬울 것입니다. 당신이 캐스 케이 딩을 사용하는 경우

  • 0

    , 당신은

    _props = new Properties(); 
    AppProps.setApplicationJarClass(_props, MyMain.class); 
    

    에 설정된 클래스를 포함하는 JAR 모든 종속성 'lib 디렉토리'폴더가있는 JAR 있는지 확인하십시오.

    때때로, 무슨 일하면 JAR은 MyMain.class은 lib 폴더없이 자신의 병 에 있으며 호출 계단식에서 10 개 개의 다른 것들을 따로 않는 또 다른 '모듈'이 그 포함 (MyWorkflow.jar를 호출 할 수 있습니다)입니다 워크 플로우 이 마스터 모듈 (이 MasterModule.jar을 호출 할 수 있음)에는 Maven 종속성으로 정의 된 MyWorkflow 모듈이 있습니다. 하나를 실행하려고 그럼 언제

    hadoop jar MasterModule.jar <options> 
    

    하나 MasterModule.jar lib 디렉토리 폴더의 모든 단지가 TaskTracker의 클래스 경로에 추가 할 기대 ...하지만 캐스 케이 딩은 MyMain.class 어떤 표시되지 않습니다 &을 MyWorkflow.jar 속한 발견 lib 폴더를 MyWorkflow.jar에 저장하면 ClassNotFoundException을 볼 수 있습니다.

    또한 lib 폴더 종속성은 CDH5에서 지원되지 않습니다. Cloudera Blog

    관련 문제