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
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を行う目的を達成する.