WINDOWS에서 분산 Hadoop의 작동 문제에 대해
Windows의 Eclipse 프로젝트에서 직접 mapreduc 프로그램을 시작하는 경우 먼저 hadoop 클러스터의 구성 디렉터리에 있는 모든 xml을 src 디렉터리에 복사해야 프로그램이 자동으로 읽을 수 있습니다. 클러스터의 주소를 지정한 다음 실행합니다(자체 Java 코드를 작성하여 작업의 구성 속성을 설정할 수도 있음).
복사하지 않고 프로젝트의 bin 디렉터리에 완전한 xml 구성 파일이 없는 경우 Windows에서 실행되는 모든 mapreduce 프로그램은 로컬 jvm을 통해 실행되며 작업 이름도 a가 됩니다. job_local2062122004_0001 과 같이 "local"이라는 단어가 포함된 작업입니다. 이것은 진정한 분산 맵리듀스 프로그램이 아닙니다.
org.apache.hadoop.conf.Configuration의 소스 코드를 연구해야 할 것 같습니다. 어쨌든 xml 구성 파일은 mapreduce를 실행하는 데 사용되는 파일 시스템이 로컬 Windows 파일 시스템인지 아니면 원격 hdfs 시스템에도 영향이 있습니다. mapreduce의 매퍼와 리듀서가 로컬 jvm에 의해 실행되는지 아니면 클러스터에 있는 머신의 jvm에 의해 실행되는지 여부
II. p>첫 번째 요점은 Windows에서 mapreduce를 실행하려면 jar를 설치해야 한다는 것입니다. 모든 슬레이브 노드가 포함되어야만 mapreduce 프로그램이 분산 방식으로 올바르게 실행될 수 있습니다. (Windows에서 mapreduce 분산 작업을 트리거해야 한다는 요구 사항이 있습니다.)
두 번째 요점은 Linux에서는 jar 파일을 클러스터 마스터에 복사하고 hadoop jarPackage.jar MainClassName 명령을 실행한다는 것입니다. 프로그램을 분산 방식으로 제공합니다.
세 번째 점은 jar 패키지를 자동으로 빌드 및 업로드하고 분산 실행을 수행하는 mapreduce 프로그램을 구현한 첨부 1을 사용하는 것이 좋습니다.
첨부 1. 다음 방법을 사용하는 것이 좋습니다: 자동 jar 패키지 구현 및 업로드, 분산 실행 mapreduce 프로그램:
먼저 5개의 블로그 게시물을 참조하세요:
Hadoop 작업 제출 분석 (1)~~ (5)
블로그 게시물 첨부 파일의 EJob.java를 프로젝트에 인용한 후 다음 메소드와 코드를 기본에 추가합니다.
public static File createPack()이 IOException을 발생시킵니다. {
File jarFile = EJob.createTempJar("bin");
ClassLoader classLoader = EJob.getClassLoader() ;
Thread.currentThread().setContextClassLoader(classLoader);
return jarFile;
}
작업 시작 코드에 사용됨 패키징 :
작업 작업 = Job.getInstance(conf, "testAnaAction")
추가:
String jarPath = createPack().getPath(); /p>
job.setJar(jarPath);
jar 파일을 수동으로 업로드하지 않고도 Java 애플리케이션으로 직접 실행하여 Windows에서 분산 MapReduce 프로그램을 실행할 수 있습니다.
별첨 2. 결론을 도출하기 위한 테스트 과정
(책 읽을 시간이 없어서 멍청한 테스트 방법으로만 결론을 도출할 수 있음)
1. Windows에서 Eclipse를 통해 기본 프로그램의 java 파일을 직접 마우스 오른쪽 버튼으로 클릭한 다음 "응용 프로그램으로 실행"하거나 hadoop 플러그인 "hadoop에서 실행"을 선택하여 MapReduce 프로그램 테스트를 시작합니다.
1. jar 패키지가 클러스터의 Linux 시스템에 설치되어 있지 않으면 다음 오류가 보고됩니다.
[work] 2012-06-25 15:42: 47,360 - org .apache.hadoop.mapreduce.Job -10244 [main] INFO org.apache.hadoop.mapreduce.Job - 맵 0 감소 0
[작업] 2012-06-25 15:42: 52,223 - org.apache.hadoop.mapreduce.Job -15107 [main] INFO org.apache.hadoop.mapreduce.Job - 작업 ID: try_1403517983686_0056_m_000000_0, 상태: FAILED
오류: java.lang.RuntimeException: java .lang.ClassNotFoundException: org.apache.hadoop.conf.Configuration.getClass(Configuration.java:1720)
에서 bookCount.BookCount$BookCountMapper 클래스를 찾을 수 없습니다.
apache .hadoop.mapreduce.task.JobContextImpl.getMapperClass(JobContextImpl.java:186)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:721)
org.apache.hadoop.mapred.MapTask.run(MapTask.java:339)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:162)
java.security.AccessController.doPrivileged(네이티브 메소드)
javax.security.auth.Subject.doAs(Subject.java:415)
org. apache .hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1491)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:157)
발생 by : java.lang.ClassNotFoundException: 클래스 bookCount.BookCount$BookCountMapper를 찾을 수 없음
at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:1626)
at org.apache.hadoop.conf.Confi
guration.getClass(Configuration.java:1718)
... 8개 더
# 오류: 세 번 반복됨
2012-06-25 15:44 : 53, 234 - org.apache.hadoop.mapreduce.Job -37813 [main] INFO org.apache.hadoop.mapreduce.Job - 맵 100 감소 100
현상은 다음과 같습니다: 오류, 진행 없음, 실행 결과가 없습니다.
2. Windows의 Eclipse "애플리케이션으로 실행"과 hadoop 플러그를 통해 jar 패키지를 "유일한" 클러스터 마스터의 $HADOOP_HOME/share/hadoop/mapreduce/ 디렉터리에 복사합니다. "run on hadoop"에서 실행을 트리거하려면 위와 동일한 오류를 보고합니다.
현상은 오류 보고, 진행 없음, 실행 결과 없음입니다.
3. Windows의 Eclipse "애플리케이션으로 실행"과 hadoop 플러그인을 통해 직접 jar 패키지를 클러스터에 있는 일부 슬레이브의 $HADOOP_HOME/share/hadoop/mapreduce/ 디렉토리에 복사합니다. hadoop에서 실행" 트리거 실행
및 오류:
오류: java.lang.RuntimeException: java.lang.ClassNotFoundException: 클래스 bookCount.BookCount$BookCountMapper를 찾을 수 없음
org.apache.hadoop.conf.Configuration.getClass(Configuration.java:1720)
org.apache.hadoop.mapreduce.task.JobContextImpl.getMapperClass(JobContextImpl.java:186)
그리고 오류:
오류: java.lang.RuntimeException: java.lang.ClassNotFoundException: 클래스 bookCount.BookCount$BookCountReducer를 찾을 수 없음
현상은 다음과 같습니다. 오류가 발생했지만 여전히 진행 상황이 있고 실행 중인 결과가 있습니다.
4. jar 패키지를 클러스터에 있는 모든 슬레이브의 $HADOOP_HOME/share/hadoop/mapreduce/ 디렉토리에 복사하고 Windows의 Eclipse "애플리케이션으로 실행" 및 hadoop 플러그를 통해 직접 트리거합니다. -in "run on hadoop" 실행:
현상은 오류 없음, 진행 및 작업 결과입니다.
첫 번째 결론은 Windows에서 mapreduce를 실행하려면 모든 슬레이브 노드에 jar 패키지를 설치해야 mapreduce 프로그램이 분산 방식으로 올바르게 실행된다는 것입니다.
2. 다음 명령을 사용하여 Linux에서 MapReduce 프로그램 테스트를 시작하세요.
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/bookCount.jar bookCount.BookCount
1, 마스터에만 복사되고 마스터에서 실행됩니다.
현상은 오류가 없고 진행이 되고 실행 결과가 나옵니다.
2. 슬레이브 노드를 복사하여 슬레이브에서 실행합니다.
현상은 오류가 없고 진행이 되고 실행 결과가 나옵니다.
단, 일부 노드에서 실행 시 아래와 같은 오류가 보고되며, 실행 결과는 다음과 같습니다.
:
14/06/25 16:44:02 INFO mapreduce.JobSubmitter: 스테이징 영역 정리 /tmp/hadoop-yarn/staging/hduser/.staging/job_1403517983686_0071
스레드 "main" java.lang.NoSuchFieldError의 예외: DEFAULT_MAPREDUCE_APPLICATION_CLASSPATH
at org.apache.hadoop.mapreduce.v2.util.MRApps.setMRFrameworkClasspath(MRApps.java: 157)
org.apache.hadoop.mapreduce.v2.util.MRApps.setClasspath(MRApps.java:198)
org.apache.hadoop.mapred.YARNRunner.createApplicationSubmissionContext(YARNRunner.java:443)
org.apache.hadoop.mapred.YARNRunner.submitJob(YARNRunner.java:283)
org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:415) )
org.apache.hadoop.mapreduce.Job$10.run(Job.java:1268)
org.apache.hadoop.mapreduce.Job$10.run(Job .java:1265)
java.security.AccessController.doPrivileged(네이티브 메소드)
javax.security.auth.Subject.doAs(Subject.java:415)
p> p>
org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1491)
org.apache.hadoop.mapreduce.Job.submit(Job.java: 1265)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1286)
at com.etrans.anaSpeed.AnaActionMr.run(AnaActionMr.java: 207)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at com.etrans.anaSpeed.AnaActionMr.main(AnaActionMr.java: 44)
sun.reflect.N에서
ativeMethodAccessorImpl.invoke0(네이티브 메소드)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43 )
java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.util.RunJar.main(RunJar.java:212 )
두 번째 결론은 다음과 같습니다. Linux에서는 jar 파일을 클러스터 마스터에 복사하고 hadoop jarPackage.jar MainClassName 명령을 실행하여 mapreduce 프로그램을 분산 방식으로 실행하기만 하면 됩니다.