【问题标题】:Amazon EMR sorting亚马逊 EMR 排序
【发布时间】:2015-01-16 14:59:31
【问题描述】:

我是 Amazon EMR 的新手,我正在尝试了解映射之后的排序阶段(减少阶段之前)是如何工作的,以及我是否可以操纵它(通过一些我自己的比较功能来提供它。

如果您知道映射阶段的输出需要是什么样子,那将是最有帮助的。

目前我有一个以这种格式打印出来的简单地图阶段:

"keyA|keyB|valueA1|valueA2"

我的 reducer 函数接收这些行并将它们合并到:

"keyA|keyB|sum_valueA1|sum_valueA2"

问题是在减速器阶段我只能得到完全相同的行。这意味着,键是相同的,也有值。 这是个问题,并且不允许我利用 map-reduce 的全部功能。

我看到他们在字数统计示例中使用了这种格式:

“LongValueSum:key\t1”。

我是否必须使用“LongValueSum”一词,以及将其标识为键而不是按值排序的选项卡? 使用选项卡有点问题,因为“key”可能带有“\t”。

请帮忙。

【问题讨论】:

    标签: hadoop mapreduce elastic-map-reduce amazon-emr


    【解决方案1】:

    找到答案
    它深埋在 hadoop 手册中,这个基本的东西应该在 “入门” 部分...

    放在这里,希望能为未来的开发者节省时间:

    来自:http://hadoop.apache.org/docs/r1.2.1/streaming.html

    Hadoop 分区器类

    Hadoop 有一个库类 KeyFieldBasedPartitioner,p> 对许多应用程序都很有用。此类允许 Map/Reduce 框架根据某些键字段而不是整个键对映射输出进行分区。例如:

    $HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar 
    -D stream.map.output.field.separator=. \
    -D stream.num.map.output.key.fields=4 \
    -D map.output.key.field.separator=. \
    -D mapred.text.key.partitioner.options=-k1,2 \
    -D mapred.reduce.tasks=12 \
    -input myInputDirs \
    -output myOutputDir \
    -mapper org.apache.hadoop.mapred.lib.IdentityMapper \
    -reducer org.apache.hadoop.mapred.lib.IdentityReducer \
    -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner 
    

    这里,-D stream.map.output.field.separator=。和 -D stream.num.map.output.key.fields=4 与前面示例中的说明相同。
    流式使用这两个变量来识别映射器的键/值对。
    上述 Map/Reduce 作业的 map 输出键通常有四个由“.”分隔的字段。但是,Map/Reduce 框架将使用 -D mapred.text.key.partitioner.options=-k1,2 选项按键的前两个字段对映射输出进行分区。
    这里,-D map.output.key.field.separator=。指定分区的分隔符。
    这保证了键中前两个字段相同的所有键/值对将被分区到同一个reducer中。
    这实际上等效于将前两个字段指定为主键,将后两个字段指定为辅助键。
    主键用于分区,主辅键组合用于排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-26
      • 2012-12-08
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 2014-01-22
      • 1970-01-01
      相关资源
      最近更新 更多