輸出數據分割默認情況下Streaming框架將map輸出的每一行第一個”\t”之前的部分作爲key,之後的部分作爲value,key\tvalue又作爲reduce的輸入。可以用-D stream.map.output.field.separator改變map輸出中key和value的分隔符,用-D stream.num.map.output.key.fields設置分隔符的位置,該位置之前的部分作爲key,之後的部分作爲value。如下所示,其中-D stream.map. output.field.separator=:指定使用冒號”:”將map輸出的一行分隔爲key/value,-D stream.num.map.output.key.fields=2指定在第二個冒號處進行分隔,也就是第二個冒號之前的作爲key,之後的作爲value。如果沒有冒號或冒號少於兩個,則key爲整行,value爲空。 $HADOOP_HOME/bin/hadoop streaming \ -D stream.map.output.field.separator=: \ -D stream.num.map.output.key.fields=2 \ -input /user/test/input -output /user/test/output \ -mapper mymapper.sh -reducer myreducer.sh \ -file /home/work/mymapper.sh \ -file /home/work/myreducer.sh \ -jobconf mapred.job.name=”output-sep-demo” 與map類似,對於reduce的輸出,同樣也可以用-D stream.reduce.output.field.separator和-D stream.num.reduce.output.key.fields定製key/value分隔方式。 二次排序轉自:
我們知道,一個典型的Map-Reduce過程包 括:Input->Map->Patition->Reduce->Output。Pation負責把Map任務輸出的中間結果 按key分發給不同的Reduce任務進行處理。Hadoop 提供了一個非常實用的partitioner類KeyFieldBasedPartitioner,通過配置相應的參數就可以使用。通過 KeyFieldBasedPartitioner可以方便地實現二次排序。
示例: 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放入hdfs,運行map-reduce程序 $ hadoop streaming / -D stream.map.output.field.separator=, / -D stream.num.map.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 / -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,但是通過前兩個字段進行partition的目的這個分隔符使用TAB鍵貌似不管用 參數對比hadoop中的map-reduce是處理<key,value>這樣的鍵值對,故指定<key,value>的分割符等參數可以分成三類: |
hadoop streaming 輸出數據分割與二次排序
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.