나는 간단한 작업 만 수행했다. 이제 그물에서 발견되는 많은 자습서와 달리 jar 파일을 만들지 않고 실행하고 싶습니다.jar 파일을 만들지 않고 hadoop 작업 실행
나는 hadoop (2.0.0 + 91)의 cloudera CHD4 배포판을 실행하는 우분투 플랫폼의 쉘 스크립트에서 호출하고 있습니다.
작업의 jar 파일을 만들 수 없습니다. 다른 제 3 자 jar 및 내 컴퓨터에서 이미 중앙에 배포되어 있으며 jar 생성시 액세스 할 수없는 구성 파일에 의존하기 때문입니다. 따라서 나는 이러한 사용자 정의 jar 파일과 구성 파일을 포함 할 수있는 방법을 찾고 있습니다.
map-reduce 단계에만 영향을 미치기 때문에 -libjars 및 DistributedCache 옵션도 사용할 수 없지만 드라이버 클래스도 이러한 jar 및 구성 파일을 사용하고 있습니다. 내 일은 중앙에서 배치 된 위치에서 읽을 수있는 액세스 권한을 가진 타사 라이브러리 및 구성 파일을 내부적으로 사용하는 하우스 유틸리티 코드 몇 가지를 사용합니다.
다음은 쉘 스크립트에서 호출하는 방법입니다.
sudo -u hdfs hadoop x.y.z.MyJob /input /output
그것은
Caused by: java.lang.ClassNotFoundException: x.y.z.MyJob
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
내 전화 쉘 스크립트가 성공적으로 하둡 클래스 경로를 설정하고 중앙에 배치 된 위치에서 내 모든 필요한 타사 라이브러리 및 구성 파일이 포함되어 나에게 보여줍니다.
I 나는 내 수업 xyzMyJob 그리고 모든 필요한 라이브러리 및 구성 파일이 $ CLASSPATH 및 $ HADOOP_CLASSPATH 환경 모두에서 발견된다 내가 하둡 작업을 호출하기 전에 설정하고있는 varibales 있는지
스크립트를 실행할 때 내 프로그램이 클래스를 찾을 수없는 이유는 무엇입니까? 작업을 일반 Java 클래스로 실행할 수 없습니까? 내 모든 다른 일반적인 자바 프로그램은 동일한 클래스 경로를 사용하며 클래스와 구성 파일을 아무런 문제없이 찾을 수 있습니다.
배치 된 haddop 작업 코드에 어떻게 액세스하고 실행할 수 있는지 알려주십시오.
편집
:은 여기에 모든 제 3 자 파일을 연결하는 클래스 경로를 파일을CLASSES_DIR=$BASE_DIR/classes/current
BIN_DIR=$BASE_DIR/bin/current
LIB_DIR=$BASE_DIR/lib/current
CONFIG_DIR=$BASE_DIR/config/current
DATA_DIR=$BASE_DIR/data/current
CLASSPATH=./
CLASSPATH=$CLASSPATH:$CLASSES_DIR
CLASSPATH=$CLASSPATH:$BIN_DIR
CLASSPATH=$CLASSPATH:$CONFIG_DIR
CLASSPATH=$CLASSPATH:$DATA_DIR
LIBPATH=`$BIN_DIR/lib.sh $LIB_DIR`
CLASSPATH=$CLASSPATH:$LIBPATH
export HADOOP_CLASSPATH=$CLASSPATH
lib.sh입니다 설정하는 내 코드입니다 : 분리 된 형식과 CLASSES_DIR 내 일 코드 x.y.z.MyJob 클래스가 포함되어 있습니다. 모든 구성 파일의 크기가 CONFIG_DIR보다 작습니다.
CLASSPATH 및 HADOOP_CLASSPATH를 인쇄하면 정확한 값이 표시됩니다. 그러나 작업을 실행하기 직전에 hadoop 클래스 패스를 호출 할 때마다 다음 출력을 보여줍니다.
$ hadoop classpath
/etc/hadoop/conf:/usr/lib/hadoop/lib/*:/usr/lib/hadoop/.//*:myname:/usr/lib/hadoop-hdfs/./:/usr/lib/hadoop-hdfs/lib/*:/usr/lib/hadoop-hdfs/.//*:/usr/lib/hadoop-yarn/lib/*:/usr/lib/hadoop-yarn/.//*:/usr/lib/hadoop-0.20-mapreduce/./:/usr/lib/hadoop-0.20-mapreduce/lib/*:/usr/lib/hadoop-0.20-mapreduce/.//*
$
그것은 분명히 그 이전에 설정 한 $의 CLASSPATH의이 없으며 $ HADOOP_CLASSPATH가 추가 varibales. 이 환경 varibales는 어디에 있습니까?내 쉘 스크립트 내부
클래스 경로의 관련 부분을 추가 할 수 있습니까? 예 : 클래스가 언급 된 부분 – Razvan
@Razvan CLASSPATH 및 HADOOP_CLASSPATH를 설정하는 코드는 다음과 같습니다. –
메모를 서식을 지정할 수는 없지만 질문을 편집하거나 pastebin에 링크 :) – VoronoiPotato