2012-08-10 4 views
1

나는 간단한 작업 만 수행했다. 이제 그물에서 발견되는 많은 자습서와 달리 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는 어디에 있습니까?내 쉘 스크립트 내부

+0

클래스 경로의 관련 부분을 추가 할 수 있습니까? 예 : 클래스가 언급 된 부분 – Razvan

+0

@Razvan CLASSPATH 및 HADOOP_CLASSPATH를 설정하는 코드는 다음과 같습니다. –

+0

메모를 서식을 지정할 수는 없지만 질문을 편집하거나 pastebin에 링크 :) – VoronoiPotato

답변

1

나는이 코드가 실제로 클래스 경로를 설정하고 언급 한 바와 같이 HADOOP_CLASSPATH가 varibles 된 일반 우분투 사용자와 스크립트에서 호출되고 있었다

sudo -u hdfs hadoop jar x.y.z.MyJob /input /output 

클라우 데라의 HDFS 사용자와 하둡 항아리 명령을 실행했다 위. 그리고 실행시 hadoop jar 명령은 동일한 정규 우분투 사용자를 사용하여 호출되지 않았습니다. 따라서 클래스가 발견되지 않았다는 예외가있었습니다.

그래서 실제로 CLASSPATH 및 HADOOP_CLASSPATH 환경 변수를 설정하는 동일한 사용자로 작업을 실행해야합니다.

감사합니다.

관련 문제