ストリーミング Hadoop ジョブを実行していますが、期待どおりにバイト オフセットがマッパーの出力 (キー) として生成されません。コマンド:
$HADOOP_INSTALL/bin/hadoop \
jar $HADOOP_INSTALL/contrib/streaming/hadoop-streaming-$HADOOP_VERSION.jar \
-D stream.map.input.ignoreKey=false \
-inputformat org.apache.hadoop.mapred.TextInputFormat \
-file ./mapper.py \
-file ./reducer.py \
-mapper ./mapper.py \
-reducer ./reducer.py \
-input $INPUT_DIR \
-output $OUTPUT_DIR \
-cmdenv REGEX=$REGEX
私の理解では、 TextInputFormat がデフォルトであるため、 -inputformat オプションなしで上記のコマンドも試しました。-D も削除しようとしましたが、ストリーミング API を使用するときにバイト オフセットをキーとして取得するために必要だと言われました。
価値があるのは、学生のプロジェクトで Hadoop を試しているところです。現時点では、マッパーは HDFS 内のファイルの非常に単純な python grep であり、各行を提供された正規表現と照合します。
pattern = re.compile(os.environ['REGEX'])
for line in sys.stdin:
match = pattern.search(line)
if (match):
sys.stdout.write(line)
ただし、現時点では、(リデューサーに) 出力されるのは一致する行だけです。タブまたは空白で区切られたキーと値のペアを期待しています。ここで、key=byte_offset と value=regex_line_match です。
なぜこれが起こっているのか、誰かが私に教えたり提案したりできますか?
また、次の 2 つの (関連する) 質問への回答にも関心があります。
- マッパーが、データが属するファイルに対して、処理中のデータの各行のバイトオフセットを手動で決定することは可能ですか?
- マッパーが、処理中のデータが属するファイル内の合計バイト数を特定することは可能ですか?
これらの質問のいずれかに「はい」の場合、どのように? (python、または一般的なストリーミング)。
編集:
使用する-inputformat org.apache.hadoop.mapred.lib.NLineInputFormat
と、バイトオフセットがマッパー出力のキーとして生成されます。しかし、ジョブが完了するまでに非常に長い時間がかかります (そして、私の入力ファイルには約 50 行のテキストしかありません!)。