:
이미 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
환경 변수를 설정하지 않았다면).
크리스. 나는 이것을 시도하고 그것이 작동하는 경우 업데이 트됩니다. 첫 번째 방법은 폴더에 모든 병을 추가하는 것입니다./tmp/jars/*와 같은 것. 나는 15-20 개가 넘는 의존 항아리가 있기 때문에 그 이후로 묻고있다. 또한 우리가 주 병 안에 lib 폴더가 있으면 lib 폴더 내의 jar 파일이 자동으로 classpath에 추가된다는 블로그를 몇 권 읽었습니다. 그러나 그것은 나를 위해 작동하지 않았다. 이것에 대해 아는 것이 있습니까? – CRS
나는 동일한 문제가있다. 나는 hadoop-2.5.2를 사용하고있다. 나는이 메카니즘을 사용했다. (-libjars 인자를 추가했다.) 그것은 작동하지 않았다. 또한 lib 디렉토리에있는 내 MapReduce jar 파일에 종속 항아리를 추가하려고했습니다. 그것도 그 일을하지 못했습니다. – feroze