복붙노트

[HADOOP] 일식에서 mapreduce 일을 시작하십시오

HADOOP

일식에서 mapreduce 일을 시작하십시오

분산 모드에서 실행되는 원격 클러스터에 제출할 수있는 Java로 mapreduce 프로그램을 작성했습니다. 현재 다음 단계를 사용하여 작업을 제출합니다.

프로그램을 실행하려고 할 때 Eclipse에서 직접 작업을 제출하고 싶습니다. 어떻게해야합니까?

현재 CDH3을 사용하고 있으며 내 conf의 요약본은 다음과 같습니다.

conf.set("hbase.zookeeper.quorum", getZookeeperServers());
conf.set("fs.default.name","hdfs://namenode/");
conf.set("mapred.job.tracker", "jobtracker:jtPort");
Job job = new Job(conf, "COUNT ROWS");
job.setJarByClass(CountRows.class);

// Set up Mapper
TableMapReduceUtil.initTableMapperJob(inputTable, scan, 
    CountRows.MyMapper.class, ImmutableBytesWritable.class,  
    ImmutableBytesWritable.class, job);  

// Set up Reducer
job.setReducerClass(CountRows.MyReducer.class);
job.setNumReduceTasks(16);

// Setup Overall Output
job.setOutputFormatClass(MultiTableOutputFormat.class);

job.submit();

Eclipse에서 직접 실행하면 작업이 시작되지만 Hadoop에서는 매퍼 / 축소 기 (mappers / reducers)를 찾을 수 없습니다. 다음과 같은 오류가 발생합니다.

12/06/27 23:23:29 INFO mapred.JobClient:  map 0% reduce 0%  
12/06/27 23:23:37 INFO mapred.JobClient: Task Id :   attempt_201206152147_0645_m_000000_0, Status : FAILED  
java.lang.RuntimeException: java.lang.ClassNotFoundException:   com.mypkg.mapreduce.CountRows$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:602)  
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:323)   
    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)  
...

누구든지 이러한 오류를 극복하는 방법을 알고 있습니까? 이 문제를 해결할 수 있다면 더 많은 MR 작업을 내 스크립트에 통합하여 멋진 스크립트를 만들 수 있습니다!

해결법

  1. ==============================

    1.작업을위한 클래스를 정의하는 Eclipse 프로젝트 내에서 hadoop 작업을 제출하는 경우에는 클래스 경로 문제가있을 가능성이 큽니다.

    작업을위한 클래스를 정의하는 Eclipse 프로젝트 내에서 hadoop 작업을 제출하는 경우에는 클래스 경로 문제가있을 가능성이 큽니다.

    job.setjarByClass (CountRows.class) 호출은 빌드 클래스 경로에서 클래스 파일을 찾지 만 CountRows.jar에서는 빌드되지 않았습니다 (아직 빌드되지 않았거나 클래스 경로에있을 수도 있음).

    job.setjarByClass (..)를 호출 한 후 job.getJar ()의 결과를 인쇄하여 true로 설정하고 jar 파일 경로를 표시하지 않으면 빌드 클래스를 찾습니다. jar'd 클래스보다

  2. ==============================

    2.저에게 도움이되는 것은 실행 가능한 JAR을 내보내는 것입니다 (JAR과 다른 점은 첫 번째 클래스가 기본 메소드를 가졌음을 의미합니다). "추출은 JAR에 패키지 필요 라이브러리"옵션을 선택하는 것입니다. "옵션을 사용하면 중복 오류가 발생하고 jar 파일에서 클래스 파일을 추출해야하므로 결과적으로 클래스를 찾을 수없는 예외가 발생합니다.

    저에게 도움이되는 것은 실행 가능한 JAR을 내보내는 것입니다 (JAR과 다른 점은 첫 번째 클래스가 기본 메소드를 가졌음을 의미합니다). "추출은 JAR에 패키지 필요 라이브러리"옵션을 선택하는 것입니다. "옵션을 사용하면 중복 오류가 발생하고 jar 파일에서 클래스 파일을 추출해야하므로 결과적으로 클래스를 찾을 수없는 예외가 발생합니다.

    그 후에 Chris White가 제안한 것처럼 항아리를 설정할 수 있습니다. Windows의 경우 다음과 같습니다. job.setJar ( "C : \\\ MyJar.jar");

    도움이된다면, MapReduce 프로젝트를 만들고 Windows 7의 Hadoop 2.2.0 (Eclipse Luna에서)에서 실행 한 결과에 대해 발표했습니다.

  3. ==============================

    3.다음 웹 사이트에서이 메소드를 사용하여 Map / Reduce 프로젝트에서 Eclipse를 사용하여 프로젝트를 실행하도록했습니다 (JAR로 프로젝트 내보내기 없음). Hadoop Map / Reduce 프로젝트 실행을위한 Eclipse 구성

    다음 웹 사이트에서이 메소드를 사용하여 Map / Reduce 프로젝트에서 Eclipse를 사용하여 프로젝트를 실행하도록했습니다 (JAR로 프로젝트 내보내기 없음). Hadoop Map / Reduce 프로젝트 실행을위한 Eclipse 구성

    참고 : 프로그램을 디버깅하기로 결정하면 Mapper 클래스와 Reducer 클래스는 디버깅 할 수 없습니다.

    희망이 도움이됩니다. :)

  4. from https://stackoverflow.com/questions/11236305/launch-a-mapreduce-job-from-eclipse by cc-by-sa and MIT license