【问题标题】:How to sort by key and value in mapreduce?如何在 mapreduce 中按键和值排序?
【发布时间】:2018-01-25 08:02:50
【问题描述】:

我有一个文本文件:

10  1   15
10  12  30
10  9   45
10  8   40
10  15  55
12  9   0
12  7   18
12  10  1
9   1   1
9   2   1
9   0   1
14  5   5

我想将此文件作为我的 MapReduce 作业的输出:

9   0   1   
9   1   1   
9   2   1   
10  1   15  
10  9   40  
10  9   45  
10  12  30  
10  15  55  
12  7   18  
12  9   0   
12  10  1   
14  5   5

这意味着它必须按第 1、第 2 和第 3 列排序。

我使用这个命令:

#!/bin/bash

IN_DIR="/user/cloudera/temp"
OUT_DIR="/user/cloudera/temp_out"
NUM_REDUCERS=1

hdfs dfs -rmr ${OUT_DIR} > /dev/null

hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar \
-D mapred.jab.name="Parsing mista pages job 1 (parsing)" \
-D stream.num.map.output.key.fields=3 \
-D mapreduce.job.output.key.comparator.class=org.apache.hadoop.mapreduce.lib.partition.KeyFieldBasedComparator \
-D mapreduce.partition.keycomparator.options='-k1,1n -k2,2n -k3,3n' \
-D mapreduce.job.reduces=${NUM_REDUCERS} \
-mapper 'cat' \
-reducer 'cat' \
-input ${IN_DIR} \
-output ${OUT_DIR}

hdfs dfs -cat ${OUT_DIR}/* | head -100

得到我想要的。但。当我执行 NUM_REDUCERS=2 时,我得到以下输出:

[cloudera@quickstart ~]$ hdfs dfs -cat /user/cloudera/temp_out/part-00000 | head -100
9   1   1   
10  9   45  
10  12  30  
10  15  55  
12  7   18  
12  10  1   
14  5   5

[cloudera@quickstart ~]$ hdfs dfs -cat /user/cloudera/temp_out/part-00001 | head -100
9   0   1   
9   2   1   
10  1   15  
10  9   40  
12  9   0

为什么 partitioner 将我的具有相同键(例如“9”)的数据拆分到不同的 reducer?

如何强制分区器按键拆分 Mapper 输出并按值排序。例如,如果我有 4 个减速器,减速器的输入应该是:

reducer 1
9   0   1   
9   1   1   
9   2   1   

reducer 2
10  1   15  
10  9   40  
10  9   45  
10  12  30  
10  15  55  

reducer 3
12  7   18  
12  9   0   
12  10  1

reducer 4:   
14  5   5

【问题讨论】:

    标签: sorting hadoop mapreduce hadoop-streaming


    【解决方案1】:

    您可以覆盖default Partioner 以将每个键放入不同的reduce 中。设置相同的reduce 数量。让每个reduce只处理一个key。

    例如()

    groupMap.put("9", 0);
    groupMap.put("10", 1);
    groupMap.put("12", 2);
    groupMap.put("14", 3);
    

    添加-partitioner 参数以在您的工作中使用您自己的分区。 我认为它可能对你有用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多