Hadoop Streaming実戦:実用Partitioner類KeyFieldBasedPartitioner
典型的なMap−Reduceプロセスには、Input−>Map−>Patition−>Reduce−>Outputが含まれることが知られている.Pationは,Mapタスクから出力された中間結果をkeyごとに異なるReduceタスクに配布して処理する.Hadoopは非常に実用的なpartionerクラスKeyFieldBasedPartitionerを提供し、対応するパラメータを構成することで使用できます.KeyFieldBasedPartitionerで簡単に二次ソートが可能です.使用方法:-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitionr一般配合:-D map.output.key.field.义齿fields.for.partition使用.map.output.key.field.separatorはkey内部の区切り記号num.keyを指定する.fields.for.partitionはkey全体ではなくkeyに分かれた最初の部分をpartitionとして指定します.
例:1.mapプログラムmapperを作成する.sh;reduceプログラムreducer.sh; テストデータtxt
2.テストデータtxt hdfsを入れmap-reduceプログラムを実行
例:1.mapプログラムmapperを作成する.sh;reduceプログラムreducer.sh; テストデータtxt
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.テストデータtxt hdfsを入れmap-reduceプログラムを実行
$ hadoop streaming /
-D stream.reduce.output.field.separator=, /
-D stream.num.reduce.output.key.fields=4 /
-D map.output.key.field.separator=, /
-D num.key.fields.for.partition=2 /
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner /
-input /app/test/test.txt /
-output /app/test/test_result /
-mapper ./mapper.sh /
-reducer ./reducer.sh /
-file mapper.sh /
-file reducer.sh /
-jobconf mapre.job.name="sep_test"
$ hadoop fs –cat /app/test/test_result/part-00003
1,2,1,1 1
1,2,2,1 1
1,2,3,1 1
$ hadoop fs –cat /app/test/test_result/part-00004
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
は、このようにして、最初の4つのフィールドがkeyであるが、前の2つのフィールドを介してpartitionを行う目的を達成する.