Hadoop 使用堆进行MapReduce排序

Hadoop 使用堆进行MapReduce排序,hadoop,mapreduce,distributed,Hadoop,Mapreduce,Distributed,我试图分析社交网络数据,其中包含追随者和追随者对。我想找到使用MapReduce拥有最多追随者的前10名用户 我用一个MapReduce步骤制作了一对userID和number\u followee 然而,有了这些数据,我不知道如何在分布式系统中对它们进行排序 我不确定如何在映射器和还原器中使用优先级队列,因为它们具有分布式数据 有人能告诉我如何使用数据结构对海量数据进行排序吗 非常感谢。如果您有格式为user\u id=number\u followers的大型输入文件,查找顶级N用户的简单地

我试图分析社交网络数据,其中包含
追随者
追随者
对。我想找到使用MapReduce拥有最多追随者的前10名用户

我用一个MapReduce步骤制作了一对
userID
number\u followee

然而,有了这些数据,我不知道如何在分布式系统中对它们进行排序

我不确定如何在映射器和还原器中使用
优先级队列
,因为它们具有分布式数据

有人能告诉我如何使用数据结构对海量数据进行排序吗


非常感谢。

如果您有格式为
user\u id=number\u followers
的大型输入文件,查找顶级
N
用户的简单地图缩减算法是:

  • 每个映射器处理自己的输入,并在其文件中找到前N个用户,将它们写入一个reducer
  • 单个reducer接收
    映射器的数量*N
    行,并在其中查找前N个用户

  • 如果您有格式为
    user\u id=number\u of\u followers
    的大型输入文件,则查找顶级
    N
    用户的简单map reduce算法为:

  • 每个映射器处理自己的输入,并在其文件中找到前N个用户,将它们写入一个reducer
  • 单个reducer接收
    映射器的数量*N
    行,并在其中查找前N个用户

  • 要按降序排序数据,需要另一个
    mapreduce
    作业。映射器将“关注者数量”作为键,twitter句柄作为值

    class SortingMap extends Map<LongWritable, Text, LongWritable, Text> {
        private Text value = new Text();
        private LongWritable key = new LongWritable(0);
    
        @Overwrite
        public void map(LongWritable key, Text value, Context context) throws IOException {
            String line = value.toString();
            // Assuming that the input data is "TweeterId <number of follower>" separated by tab
            String tokens[] = value.split(Pattern.quote("\t"));
            if(tokens.length > 1) {
                key.set(Long.parseLong(tokens[1]));
                value.set(tokens[0]);
                context.write(key, value);
            }
        }
    }
    
    在驱动程序类中,设置
    SortedComparator

    job.setSortComparatorClass(DescendingOrderKeyComparator.class);
    

    要按降序排序数据,需要另一个
    mapreduce
    作业。映射器将“关注者数量”作为键,twitter句柄作为值

    class SortingMap extends Map<LongWritable, Text, LongWritable, Text> {
        private Text value = new Text();
        private LongWritable key = new LongWritable(0);
    
        @Overwrite
        public void map(LongWritable key, Text value, Context context) throws IOException {
            String line = value.toString();
            // Assuming that the input data is "TweeterId <number of follower>" separated by tab
            String tokens[] = value.split(Pattern.quote("\t"));
            if(tokens.length > 1) {
                key.set(Long.parseLong(tokens[1]));
                value.set(tokens[0]);
                context.write(key, value);
            }
        }
    }
    
    在驱动程序类中,设置
    SortedComparator

    job.setSortComparatorClass(DescendingOrderKeyComparator.class);
    

    使用mapreduce搜索排序。这可能会有帮助:谢谢你的评论。使用mapreduce搜索排序。这可能会有帮助:谢谢你的评论。非常感谢你的帮助。非常感谢你的帮助。