Hadoop Streaming実戦:出力ファイル分割
Hadoop streamingフレームワークはデフォルトで'/t'を区切り記号とし、各行の最初の'/t'の前の部分をkeyとし、残りの内容をvalueとし、'/t'区切り記号がなければ、行全体をkeyとすることを知っています.このkey/tvalueペアはまたreduceの入力として機能します.hadoopは、ユーザーが自主的にセパレータを設定するための構成を提供します. -D stream.map.output.field.separator:map出力のkeyとvalueの区切り記号-D streamを設定します.num.map.output.key.Fields:mapプログラムの区切り記号の位置を設定、その位置の前の部分をkeyとし、その後の部分をvalue-D mapとする.output.key.field.separator:map出力におけるkey内部の分割子-D num.keyを設定する.fields.for.partition:バケットを指定する場合、keyはセパレータに従って切断され、バケットkeyが占める列数(-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitionerと併用)-D stream.reduce.output.field.separator:reduce出力のkeyとvalueの区切り記号-D streamを設定します.num.reduce.output.key.fields:reduceプログラム区切り記号の位置を設定する例:1.mapプログラムmapperを作成する.sh;reduceプログラムreducer.sh; テストデータtxt
2. test.txtはhadoopを入れ、2つの方式で1)区切り記号なし設定で実行
2)セパレータ運転の設定
mapper.sh:
#!/bin/sh
cat
reducer.sh:
#!/bin/sh
sort
test.txt :
1,2,1,1,1
1,2,2,1,1
1,3,1,1,1
1,3,2,1,1
1,3,3,1,1
1,2,3,1,1
1,3,1,1,1
1,3,2,1,1
1,3,3,1,1
2. test.txtはhadoopを入れ、2つの方式で1)区切り記号なし設定で実行
$ hadoop fs -put test.txt /app/test/
$ hadoop streaming -input /app/test/test.txt /
-output /app/test/test_result /
-mapper ./mapper.sh -reducer ./reducer.sh
-file mapper.sh -file reducer.sh /
-jobconf mapred.reduce.tasks=2 /
-jobconf mapre.job.name="sep_test"
$ hadoop fs –cat /app/test/test_result/part-00000
1,2,2,1,1
1,3,1,1,1
1,3,1,1,1
1,3,3,1,1
1,3,3,1,1
$ hadoop fs –cat /app/test/test_result/part-00001
1,2,1,1,1
1,2,3,1,1
1,3,2,1,1
1,3,2,1,1
2)セパレータ運転の設定
$ hadoop streaming -D stream.reduce.output.field.separator=,
-D stream.num.reduce.output.key.fields=2
-input /app/test/test.txt
-output /app/test/test_result_1
-mapper ./mapper.sh -reducer ./reducer.sh
-file mapper.sh -file reducer.sh
-jobconf mapred.reduce.tasks=2
-jobconf mapre.job.name="sep_test"
$ hadoop fs -cat /app/test/test_result_1/part-00000
1,2 1,1,1
1,2 2,1,1
1,2 3,1,1
$ hadoop fs -cat /app/test/test_result_1/part-00001
1,3 1,1,1
1,3 1,1,1
1,3 2,1,1
1,3 2,1,1
1,3 3,1,1
1,3 3,1,1