コンテキストは、次のように実行する bash スクリプトを使用して、 Amazon EMR (ウェブ UI)でストリーミング ジョブを実行しようとしているということです。
-input s3://emrdata/test_data/input -output s3://emrdata/test_data/output -mapper
s3://emrdata/test_data/scripts/mapperScript.sh -reducer NONE
入力ディレクトリにはサブディレクトリがあり、これらのサブディレクトリには gzip されたデータ ファイルがあります。
mapperScript.sh
その失敗の関連部分は次のとおりです。
for filename in "$input"/*; do
dir_name=`dirname $filename`
fname=`basename $filename`
echo "$fname">/dev/stderr
modelname=${fname}.model
modelfile=$model_location/$modelname
echo "$modelfile">/dev/stderr
inputfile=$dirname/$fname
echo "$inputfile">/dev/stderr
outputfile=$output/$fname
echo "$outputfile">/dev/stderr
# Will do some processing on the files in the sub-directories here
done # this is the loop for getting input from all sub-directories
基本的に、ストリーミング モードでサブディレクトリを読み取る必要があります。これを実行すると、hadoop は次のように文句を言います。
2013-03-01 10:41:26,226 ERROR
org.apache.hadoop.security.UserGroupInformation (main):
PriviledgedActionException as:hadoop cause:java.io.IOException: Not a
file: s3://emrdata/test_data/input/data1 2013-03-01 10:41:26,226
ERROR org.apache.hadoop.streaming.StreamJob (main): Error Launching
job : Not a file: s3://emrdata/test_data/input/data1
同様のqがここで尋ねられたことを認識しています
そこで提案されたのは、独自の InputFormat を作成することでした。スクリプトの記述方法や EMR 入力の指定方法に何か他に欠けているものがあるのか、それとも Java で独自の InputFormat を記述することが私の唯一の選択肢なのか疑問に思っています。
EMR にも「input/*」を使用して入力を試みましたが、うまくいきませんでした。