2011-10-05 45 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输入的输入分隔符。默认情况下,分隔符是制表符。