充分利用hadoop的map輸出自動排序功能,能夠有效提高計算效率。
Hadoop streaming框架默認情況下會以'/t’作為分隔符,將每行第一個'/t’之前的部分作為key,其余內容作為value,如果沒有'/t’分隔符,則整行作為key;這個key/tvalue對又作為該map對應的reduce的輸入。
實際上,通過設置參數,可以根據需要將約定滿足要求的數據分布到同一個reducer,又可以通過設置map執行參數將數據內容進行一定的排序,從而提高在reducer中的計算效率。
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內部的分割符——備注:基於該分隔符,shuffle對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程序分隔符的位置
比如下面的輸入數據例子,想要基於前兩個數值進行hash分桶,將數據分布到同一個reducer,另一方面又想將前四個數字進行排序。需要這樣設置:
-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
1 1,2,1,1,1 2 1,2,2,1,1 3 1,3,1,1,1 4 1,3,2,1,1 5 1,3,3,1,1 6 1,2,3,1,1 7 1,3,1,1,1 8 1,3,2,1,1 9 1,3,3,1,1