복붙노트

[HADOOP] 돼지 UDF java.lang.NoClassDefFoundError가 함께 AWS EMR에서 실행 : 조직 / 아파치 / 돼지 / LoadFunc을

HADOOP

돼지 UDF java.lang.NoClassDefFoundError가 함께 AWS EMR에서 실행 : 조직 / 아파치 / 돼지 / LoadFunc을

나는 S3의 달러에 저장된 로그 파일을 읽고 탄성 맵리 듀스를 사용하여 분석을 시도하는 응용 프로그램을 개발하고있다. 현재 로그 파일 형식은 다음과

------------------------------- 
COLOR=Black 
Date=1349719200 
PID=23898 
Program=Java 
EOE 
------------------------------- 
COLOR=White 
Date=1349719234 
PID=23828 
Program=Python 
EOE 

그래서 난 내 돼지 스크립트로 파일을로드하려고하지만, 빌드 - 돼지 로더 내 데이터를로드 할 수있을 것 같습니다하지 않는, 그래서 난 내 자신의 UDF를 만들어야합니다. 나는 돼지와 하둡 꽤 새로운 오전 이후, 나는 얼마나 UDF 작품의 teast를 얻기 위해, 난 내 자신을 쓰기 전에 다른 사람에 의해 작성된 스크립트를 시도합니다. 나는 SimpleTextLoader가 여기에 http://pig.apache.org/docs/r0.10.0/udf.html에서 하나를 발견했다. 이 SimpleTextLoader를 컴파일하기 위해, 나는 같은 몇 가지의 수입을 추가해야

import java.io.IOException; 
import java.util.ArrayList;
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; 
import org.apache.hadoop.mapreduce.InputFormat; 
import org.apache.hadoop.mapreduce.RecordReader; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigSplit; 
import org.apache.pig.backend.executionengine.ExecException; 
import org.apache.pig.data.Tuple; 
import org.apache.pig.data.TupleFactory;
import org.apache.pig.data.DataByteArray; 
import org.apache.pig.PigException; 
import org.apache.pig.LoadFunc;

그 후, 나는이 파일을 컴파일 할 필요가 발견. 나는 SVN과 돼지 실행을 다운로드해야

sudo apt-get install subversion 
svn co http://svn.apache.org/repos/asf/pig/trunk 
ant

지금은 pig.jar 파일을 가지고, 나는이 파일을 컴파일하려고합니다.

javac -cp ./trunk/pig.jar SimpleTextLoader.java 
jar -cf SimpleTextLoader.jar SimpleTextLoader.class 

그것은 성공적으로 컴파일하고 난 사용하여 파일을로드하려고 돼지가 꿀꿀 거리는 소리에 불평 소리를 입력에 입력

grunt> register file:/home/hadoop/myudfs.jar
grunt> raw = LOAD 's3://mys3bucket/samplelogs/applog.log' USING myudfs.SimpleTextLoader('=') AS (key:chararray, value:chararray); 

2012-12-05 00:08:26,737 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 2998: Unhandled internal error. org/apache/pig/LoadFunc Details at logfile: /home/hadoop/pig_1354666051892.log

pig_1354666051892.log 내부가있다

Pig Stack Trace
---------------
ERROR 2998: Unhandled internal error. org/apache/pig/LoadFunc

java.lang.NoClassDefFoundError: org/apache/pig/LoadFunc

또한 http://wiki.apache.org/pig/UDFManual에서 다른 UDF (UPPER.java)를 사용하려고, 난 여전히 UPPER 방법을 사용하는 시도하여 같은 오류가 발생하고있다. 당신이 나 좀 도와 주실 래요, 문제는 여기에 무엇입니까? 많은 감사합니다!

업데이트 : EMR이 /home/hadoop/lib/pig/pig.jar에서 빌드 - Pig.jar, 같은 문제를 얻을 시도했다.

해결법

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

    1.은 / 가정 / 하둡 / lib 디렉토리 / 돼지 디렉토리에 UDF 항아리를 넣어 또는 복사 돼지 - * - lib 디렉토리 / 홈 / 하둡 /에 amzn.jar 파일과 작동합니다.

    은 / 가정 / 하둡 / lib 디렉토리 / 돼지 디렉토리에 UDF 항아리를 넣어 또는 복사 돼지 - * - lib 디렉토리 / 홈 / 하둡 /에 amzn.jar 파일과 작동합니다.

    당신은 아마 다음 중 하나를 수행하기 위해 부트 스트랩 동작을 사용합니다.

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

    2.돼지와 하이브처럼 하둡 생태계 도구의 대부분은 환경 변수 $ HADOOP_HOME / conf의 / hadoop-env.sh를 찾아보십시오.

    돼지와 하이브처럼 하둡 생태계 도구의 대부분은 환경 변수 $ HADOOP_HOME / conf의 / hadoop-env.sh를 찾아보십시오.

    나는 돼지-0.13.0-h1.jar를 추가하여이 문제를 해결할 수 있었다 HADOOP_CLASSPATH에 (그것은 UDF에 필요한 모든 클래스를 포함) :

    export HADOOP_CLASSPATH=/home/hadoop/pig-0.13.0/pig-0.13.0-h1.jar:$HADOOP_CLASSPATH
    

    돼지-0.13.0-h1.jar는 돼지의 홈 디렉토리에서 사용할 수 있습니다.

  3. from https://stackoverflow.com/questions/13714800/pig-udf-running-on-aws-emr-with-java-lang-noclassdeffounderror-org-apache-pig-l by cc-by-sa and MIT license