S3ドルに保存されているログファイルを読み取り、ElasticMapReduceを使用して解析しようとするアプリケーションを開発しています。現在のログファイルの形式は次のとおりです
-------------------------------
COLOR=Black
Date=1349719200
PID=23898
Program=Java
EOE
-------------------------------
COLOR=White
Date=1349719234
PID=23828
Program=Python
EOE
そのため、ファイルをPigスクリプトにロードしようとしましたが、組み込みのPig Loaderがデータをロードできないようであるため、独自のUDFを作成する必要があります。私はPigとHadoopにかなり慣れていないので、UDFがどのように機能するかを知るために、自分で作成する前に他の人が作成したスクリプトを試してみたいと思います。ここhttp://pig.apache.org/docs/r0.10.0/udf.htmlから1つを見つけました。SimpleTextLoaderがあります。この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とpigrunningをダウンロードする必要があります
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
コンパイルは成功し、Pigと入力してgruntに入り、gruntでファイルをロードしようとします。
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メソッドを使用しようとしても同じエラーが発生します。手伝ってくれませんか、ここで何が問題なのですか?どうもありがとう!
更新:/home/hadoop/lib/pig/pig.jarにあるEMRビルトインPig.jarを試しましたが、同じ問題が発生しました。