2011-10-05 78 views
2

所以當我們使用Javamap/reduce程序,地圖收集數據並接收減速每個鍵的值列表,像hadoop streaming:如何給reducer鍵值列表?

Map(k, v) -> k1, v1 
    then shuffle and sort happens 
    then reducer gets it 

reduce(k1, List<values>) 

去努力。但是否可以使用streamingpython相同?我使用了this作爲參考,似乎減速器在命令行上獲取每行數據

+1

它通過sys.stdin進入 –

回答

1

在Hadoop Streaming中,映射器將鍵值對寫入sys.stdout。 Hadoop執行shuffle並對結果進行排序並將結果導向sys.stdin中的映射器。只要你遵循這個模型(映射到標準輸出,從標準輸入減少),你如何處理地圖和減少完全取決於你。這就是爲什麼它可以在命令行上通過cat data | map | sort | reduce獨立於Hadoop進行測試。

輸入到減速機是被映射了相同的鍵 - 值對,但是進來排序。您可以遍歷這些結果和累積總數爲示例演示,或者你可以把它進一步的與輸入傳遞給itertools.groupby(),並且會給你相當於你是用來和該k1, List<values>輸入工作良好的reduce()內置。

的一點是,它是由你來實現降低。

1

PipeReducer是Hadoop的流減速執行。減速器獲取鍵/值,迭代它併發送到STDIN作爲鍵/值而不是鍵/值。這是Hadoop流式傳輸的默認行爲。除非Hadoop代碼已被修改,否則我沒有看到任何更改此選項的選項。

public void reduce(Object key, Iterator values, OutputCollector output, 
       Reporter reporter) throws IOException { 

    ..... 
    while (values.hasNext()) { 
    ..... 
     inWriter_.writeKey(key); 
     inWriter_.writeValue(val); 
    .....  
    } 
} 
5

可能這會幫助你。我發現這個來自Apache的......組織

定製方式來分割線成鍵/值對 正如前面提到的,當的Map/Reduce框架讀取來自映射器的標準輸出線,它將該行成鍵/值對。默認情況下,直到第一個製表符的行的前綴是鍵,而行的其餘部分(不包括製表符)是值。

但是,您可以自定義此默認值。您可以指定除製表符(默認值)以外的字段分隔符,並且可以指定第n個(n> = 1)字符而不是行(默認值)中的第一個字符作爲鍵和值之間的分隔符。例如:

$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar \ 
    -input myInputDirs \ 
    -output myOutputDir \ 
    -mapper org.apache.hadoop.mapred.lib.IdentityMapper \ 
    -reducer org.apache.hadoop.mapred.lib.IdentityReducer \ 
    -D stream.map.output.field.separator=. \ 
    -D stream.num.map.output.key.fields=4 

在上例中,-D stream.map.output.field.separator=.指定了「。」。作爲地圖輸出的字段分隔符,以及直到第四個「。」的前綴。在一行中將是關鍵,並且該行的其餘部分(不包括第四個「。」)將是該值。如果一行少於四個「。」,那麼整行將是關鍵字,並且該值將是一個空的Text對象(如由新Text(「」)創建的那個)。

同樣,您可以使用-D stream.reduce.output.field.separator=SEP-D stream.num.reduce.output.fields=NUM指定reduce輸出行中的第n個字段分隔符作爲鍵和值之間的分隔符。

同樣,您可以指定stream.map.input.field.separatorstream.reduce.input.field.separator作爲map/reduce輸入的輸入分隔符。默認情況下,分隔符是製表符。

相關問題