4

Windows에서 Eclipse를 사용하여 프로젝트를 빌드하고 Linux 클러스터에서 실행하려고합니다. 프로젝트는 Eclipse의 "Export-> Runnable JAR -> Package required library in jar"빌드 옵션을 사용하여 묶은 일부 외부 jar에 의존합니다. 항아리에 폴더 구조 내의 클래스가 들어 있는지 확인하고 외부 항아리가 루트 폴더에 있는지 확인했습니다.Jar는 독립형 Hadoop에서 작동하지만 실제 클러스터에서는 작동하지 않습니다 (java.lang.ClassNotFoundException : org.jfree.data.xy.XYDataset)

Hadoop 독립 실행 형, Cygwin 및 Linux의 경우이 방법은 정상적으로 작동하지만 실제 Hadoop Linux 클러스터에서는 첫 번째 외부 항아리에서 클래스에 액세스하려고 시도 할 때 오류가 발생하여 ClassNotFoundException이 발생합니다.

Hadoop에서 항아리를 강제로 검색 할 수있는 방법이 있을까요? 클러스터의 각 시스템에 별도로 패키지를 설치/당신이해야 할 그래서

을 (클래스 로더는이 문제를 처리 할 수 ​​없습니다)되고, 또는 :

10/07/16 11:44:59 INFO mapred.JobClient: Task Id : attempt_201007161003_0005_m_000001_0, Status : FAILED 
Error: java.lang.ClassNotFoundException: org.jfree.data.xy.XYDataset 
at java.net.URLClassLoader$1.run(URLClassLoader.java:200) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:252) 
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) 
at org.akintayo.analysis.ecg.preprocess.ReadPlotECG.plotECG(ReadPlotECG.java:27) 
at org.akintayo.analysis.ecg.preprocess.BuildECGImages.writeECGImages(BuildECGImages.java:216) 
at org.akintayo.analysis.ecg.preprocess.BuildECGImages.converSingleECGToImage(BuildECGImages.java:305) 
at org.akintayo.analysis.ecg.preprocess.BuildECGImages.main(BuildECGImages.java:457) 
at org.akintayo.hadoop.HadoopECGPreprocessByFile$MapTest.map(HadoopECGPreprocessByFile.java:208) 
at org.akintayo.hadoop.HadoopECGPreprocessByFile$MapTest.map(HadoopECGPreprocessByFile.java:1) 
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50) 
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:358) 
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:307) 
at org.apache.hadoop.mapred.Child.main(Child.java:170) 

답변

3

자바는 다른 단지에있는 항아리를 사용할 수 없습니다 가능한 경우 실행에 jar를 추가하십시오. 이렇게하려면 hadoop jar myjar.jar -libjars mylib.jar을 실행할 때 -libjars mylib.jar 옵션을 추가해야하며 이렇게하면됩니다.

1

Wojtek 님의 답변이 맞습니다. -libjars을 사용하면 외부 Jar 파일을 분산 캐시에 저장하여 모든 Hadoop 노드에서 사용할 수 있습니다.

그러나 외부 항아리가 자주 변경되지 않으면 jar 파일을 노드의 hadoop/lib에 수동으로 복사하는 것이 더 편리 할 수 ​​있습니다. Hadoop을 다시 시작하면 외부 항아리가 작업의 클래스 경로에 추가됩니다.

관련 문제