2

因此,当我们Java用于编写map/reduce程序时,map 收集数据,reducer 接收每个键的值列表,例如

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

reduce(k1, List<values>)  

继续工作。但是可以用pythonusing做同样的事情streaming吗?我将此用作参考,并且似乎reducer 获取命令行上提供的每行数据

4

4 回答 4

5

可能这可以帮助你。我从 apache 中找到了这个... org

自定义将行拆分为键/值对的方式 如前所述,当 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 对象(如由 new Text("") 创建的对象)。

类似地,您可以使用-D stream.reduce.output.field.separator=SEPand-D stream.num.reduce.output.fields=NUM指定一行 reduce 输出中的第 n 个字段分隔符作为键和值之间的分隔符。

同样,您可以将stream.map.input.field.separatorand指定stream.reduce.input.field.separator为 map/reduce 输入的输入分隔符。默认情况下,分隔符是制表符。

于 2012-01-09T08:19:26.200 回答
1

在 Hadoop Streaming 中,映射器将键值对写入sys.stdout. Hadoop 进行 shuffle 和排序,并将结果定向到sys.stdin. 您如何实际处理地图和减少完全取决于您,只要您遵循该模型(映射到标准输出,从标准输入减少)。这就是为什么它可以通过cat data | map | sort | reduce命令行独立于 Hadoop 进行测试。

reducer 的输入与映射的键值对相同​​,但已排序。您可以像示例演示的那样遍历结果并累积总计,或者您可以更进一步并将输入传递给itertools.groupby()and 这将为您提供与您习惯的输入等效的k1, List<values>输入,并且在reduce()内置函数中运行良好。

关键是由你来实现reduce。

于 2011-10-05T18:14:16.420 回答
1

PipeReducer是 Hadoop 流的 reducer 实现。reducer 获取key/values ,对其进行迭代并作为key/value而不是key/values发送到 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);
    .....      
    }
}
于 2011-10-06T01:33:20.223 回答
0

根据 Hadoop 的流式参考这里

  • 默认情况下,键是第一个制表符之前的行的前缀。

当 Map/Reduce 框架从映射器的 stdout 中读取一行时,它将该行拆分为一个键/值对。默认情况下,到第一个制表符的行的前缀是键,行的其余部分(不包括制表符)是值。

  • 可以自定义分隔符和键的位置。

但是,您可以自定义此默认值。您可以指定除制表符之外的字段分隔符(默认值),并且可以指定第 n 个 (n >= 1) 字符而不是行中的第一个字符(默认值)作为键和值之间的分隔符。例如:

  • 示例代码:

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

于 2018-04-14T22:25:58.353 回答