2013-03-01 2 views
1

외부 Jar에서 몇 가지 메소드를 호출하는 간단한 MapReduce 코드를 작성했습니다. hadoop/lib 폴더에이 jar 파일을 추가했고 파일이 선택되었습니다. 단일 노드 클러스터에서는 모두 정상입니다. 동일한 코드를 실행하고자하는 다중 노드 클러스터가 있습니다. 모든 노드에 jars를 수동으로 추가 할 필요가 없도록 dfs에 jar 파일을 복사 할 수있는 방법이 있는지 알고 싶습니다. 다른 폴더 (hadoop/lib가 아님)에 모든 jar 파일을 추가하고 싶습니다. 이것을 달성 할 수 있습니까? 즉 많은 항아리가있는 폴더에 외부 참조를 추가합니다. 나는 같은 것을하기 위해 cloudera blog를 따라 갔다. 그러나 아직도 도움이되지 않았다. 이것에 대한 모든 포인터는 정말 도움이 될 것입니다. 내가 hadoop 1.0.4 버전을 사용하고 있습니다.Hadoop : 외부 jar 폴더 참조

P.S : 주 작업 병 안에 모든 외부 jar를 추가했습니다. 심지어 그때 그것은 집어 들지 않고있다. 작업의 클래스 경로에 다른 단지를 포함한 두 가지 메커니즘이 있습니다

답변

2

:

이미 HDFS에서 그들을 저장하지 않은 경우, 당신은 GenericOptionsParser의 -libjars 인수를 사용할 수 있습니다. 이렇게하면 JobClient가 jars를 HDFS의 임시 디렉토리에 업로드하여 작업을 위해 분산 캐시에 포함시킵니다. 다음과 같이

public class MyJob extends COnfigured implements Tool { 
    public int run(String args[]) { 
    Job job = new Job(getConf()); 
    // configure your job 
    // .. 

    return job.waitForCompletion() ? 0 : 1; 
    } 

    public static void main(String args[]) throws Exception { 
    ToolRunner.run(new MyJob(), args)); 
    } 
} 

그런 다음 당신이 (작업 클래스 패스에 항아리 1-3 추가) 작업을 실행할 것 :이 작업을 수행하려면, 당신은 ToolRunner.run 인터페이스를 통해 작업을 실행해야합니다

당신의 항아리가 HDFS에 이미있는 경우에, 당신은 단지 항아리에게 분산 캐시를 추가 할 필요가
#> hadoop jar myjob.jar MyJob -libjars jar1.jar,jar2.jar,jar3.jar [other args] 

:

public int run(String args[]) { 
    Job job = new Job(getConf()); 
    // configure your job 
    // .. 

    // acquire job configuration 
    Configuration conf = job.getConf(); 

    // create a FileSystem 
    FileSystem fs = FileSystem.get(fs); 

    DistributedCache.addFileToClassPath(new Path("/myapp/jar1.jar"), conf, fs); 
    DistributedCache.addFileToClassPath(new Path("/myapp/jar2.jar"), conf, fs); 
    DistributedCache.addFileToClassPath(new Path("/myapp/jar3.jar"), conf, fs); 

    return job.waitForCompletion() ? 0 : 1; 
} 

이 두 번째 방법의 유일한 단점은 당신이 논문의 항아리에있는 클래스를 참조 할 수 없다는 것입니다 너의 일 conf iguration (클라이언트 측에도 복사본이없고, HADOOP_CLASSPATH 환경 변수를 설정하지 않았다면).

+0

크리스. 나는 이것을 시도하고 그것이 작동하는 경우 업데이 트됩니다. 첫 번째 방법은 폴더에 모든 병을 추가하는 것입니다./tmp/jars/*와 같은 것. 나는 15-20 개가 넘는 의존 항아리가 있기 때문에 그 이후로 묻고있다. 또한 우리가 주 병 안에 lib 폴더가 있으면 lib 폴더 내의 jar 파일이 자동으로 classpath에 추가된다는 블로그를 몇 권 읽었습니다. 그러나 그것은 나를 위해 작동하지 않았다. 이것에 대해 아는 것이 있습니까? – CRS

+0

나는 동일한 문제가있다. 나는 hadoop-2.5.2를 사용하고있다. 나는이 메카니즘을 사용했다. (-libjars 인자를 추가했다.) 그것은 작동하지 않았다. 또한 lib 디렉토리에있는 내 MapReduce jar 파일에 종속 항아리를 추가하려고했습니다. 그것도 그 일을하지 못했습니다. – feroze