gpt4 book ai didi

sorting - 如何在mapreduce中按键和值排序?

转载 作者:可可西里 更新时间:2023-11-01 15:51:50 28 4
gpt4 key购买 nike

我有一个文本文件:

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

为什么分区程序使用相同的键(例如“9”)将我的数据拆分到不同的缩减程序?

我如何强制分区程序按键拆分 Mapper 输出并按值对其进行排序。例如,如果我有 4 个 reducer , reducer 输入应该是:

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

最佳答案

你可以覆盖default Partioner来把每个key放到不同的reduce中。设置相同的reduce Nums。让每个 reduce 只处理一个键。

例如()

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

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

关于sorting - 如何在mapreduce中按键和值排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48438168/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com