2

コンテキストは、次のように実行する 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/*」を使用して入力を試みましたが、うまくいきませんでした。

4

1 に答える 1

2

これにはいくつかの一時的な回避策があるようですが、本質的に Hadoop はまだこれをサポートしていませ。そのinputpatth/*/*ため、2 レベルのサブディレクトリでは機能する可能性がありますが、それ以上のネストでは失敗する可能性があります。

現時点でできる最善の方法は、サブディレクトリのないファイル/フォルダーのリストを取得し、inputPaths の csv リストを作成した後にそれらを再帰的に追加することです。これには、 s3cmdなどの単純なツールを使用できます。

于 2013-03-01T18:43:09.080 に答える