`

Hadoop的Map端sort, partition, combiner以及Group

阅读更多
Mapreduce在执行的时候首先会解析成KV键值对传送到Map方法里面, 在Mapper类的run里面有这么一段代码:
while (context.nextKeyValue()) {
        map(context.getCurrentKey(), context.getCurrentValue(), context);
      }


就是只要还有KV键值对, 就不停的调用Map方法。

在Map端处理完成后我们通过Context.write输出, 然后到reducer端相同的Key的value组成到迭代器里面通过reduce代码处理。

这是默认最简单的方式, 在MR中还提供 Map端Sort, partition, combine以及Group

1.Map端的sort:

一般是通过Job的 job.setSortComparatorClass(MapSortClass) 来实现, 主要功能就是Map端执行完成在reduce端输入前根据key的值进行排序。

MapSortClass是需要继承WritableComparator的, 一个例子如下:
	public static class MapSortClass extends WritableComparator {

		public  MapSortClass(){
			
			super(LongWritable.class, true);
		}
		
		@Override
		public int compare(WritableComparable a, WritableComparable b) {
			
			LongWritable LongA = (LongWritable) a;
			LongWritable LongB = (LongWritable) b;
			
		    return -LongA.compareTo(LongB);
		}
		
		
		
		
	}


在排序的时候会调用compare方法 (序列化之前), 所以直接都是输入的object而不是二进制流。 我们要重写compare方法, 这样在输出到reduce前会根据我们写的方法重新排序。 我的例子里面就在前面加个一个 “-”号, 就是按照正常排序的倒序。

2. partition
我们可以自定义partition, 通过job.setPartitionerClass(MyPartitioner) 来设置。 默认会用HashPartitioner:
public class HashPartitioner<K, V> extends Partitioner<K, V> {

  /** Use {@link Object#hashCode()} to partition. */
  public int getPartition(K key, V value,
                          int numReduceTasks) {
    return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
  }

}


其实就是根据key的hashcode来分区, 我们可以自己写partitioner, 继承Partitioner即可, 我这边就根据取进来Key的值平均分成三份:
	public static class MyPartitioner extends Partitioner<LongWritable, Text>{

		@Override
		public int getPartition(LongWritable key, Text value, int numReduce) {
			
			if((Long.parseLong(key.toString()) % numReduce) == 0){
				return 0;
			}else if((Long.parseLong(key.toString()) % numReduce) == 1){
				return 1;
			}else {
				return 2;
			}
			
		}
		
	}


3.Group
Map到reduce前会根据Key做group, 一样的key就在同一个group里面, 如果我们要自定义group的话就要通过job.setGroupingComparatorClass(MapGroupClass.class)来设置, 比如说自定义的对象, 里面带两个LongWritable的对象, 但是我们其实只需要根据其中一个对象做Group, 那么我们就要自己写一个编组方法了。 我这边就对一个对象的LongWritable做group:
	public static class MyGroup implements RawComparator<LongText> {

		@Override
		public int compare(LongText o1, LongText o2) {
			return (int)(o1.getA() - o2.getA());
		}

		@Override
		public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
			
			return WritableComparator.compareBytes(b1, s1, 8, b2, s2, 8);
		}
		
	}

貌似group的时候会调用compare序列化对象的方法 , 所以只读8byte, 就是一个long的值。 这里到reduce那边后即使Key不一样, 只要第一个LongWritable对象的值一样的话, 那么就会把他们的value放到同一个Iterator里面, 在reduce端处理.

4.Combiner
combiner其实就是在map端的reducer。 有些时候我们map出来1w对KV的值, 但是我们其实只需要最大的值就行了, 没有combiner的情况下 shuffle传输到reducer那边就要传输1w对, 这样对带宽浪费比较大, 如果在map端对每个key的value都只取最大值, 那么就可以大大的省下传输的对象数量, 自然就节省了很多带宽。 
combiner可以通过job.setCombinerClass(IntSumReducer.class) 来设定

示例:
  public static class IntSumReducer 
       extends Reducer<Text,IntWritable,Text,IntWritable> {
    private IntWritable result = new IntWritable();

    public void reduce(Text key, Iterable<IntWritable> values, 
                       Context context
                       ) throws IOException, InterruptedException {
      int sum = 0;
      for (IntWritable val : values) {
        sum += val.get();
      }
      result.set(sum);
      context.write(key, result);
    }
  }



0
0
分享到:
评论

相关推荐

    hadoop map-reduce turorial

    ### Hadoop Map-Reduce 教程详析 #### 目标与作用 Hadoop Map-Reduce框架是设计用于处理大规模数据集(多太字节级)的软件框架,它允许在大量廉价硬件集群上(可达数千节点)进行并行处理,确保了数据处理的可靠性...

    Hadoop Map-Reduce教程

    ### Hadoop Map-Reduce 教程 #### 一、Hadoop Map-Reduce 概述 Hadoop Map-Reduce 是一种编程模型,用于处理大规模数据集(通常为TB级或以上)。这种模型支持分布式计算,可以在成百上千台计算机上运行。Map-...

    Hadoop Combiner使用方法详解

    Hadoop Combiner是MapReduce编程模型中的一个重要组件,它可以减少发送到Reducer的数据量,从而提高网络效率和Reduce端的效率。下面是Hadoop Combiner的使用方法详解: Combiner的优点 1. 减少发送到Reducer的数据...

    Hadoop Map Reduce教程

    - **Combiner 使用**:在 Map 端使用 Combiner 函数预先聚合数据,减少网络传输量。 #### 五、案例分析 - **WordCount 示例**:这是一个经典的 MapReduce 示例,用于统计文本文件中单词出现的次数。 - **Inverted ...

    远程调用执行Hadoop Map/Reduce

    本篇文章将深入探讨“远程调用执行Hadoop Map/Reduce”的概念、原理及其实现过程,同时结合标签“源码”和“工具”,我们将涉及到如何通过编程接口与Hadoop集群进行交互。 Hadoop MapReduce是一种编程模型,用于大...

    hadoop中map/reduce

    《hadoop搭建与eclipse开发环境设置.docx》则可能涵盖Hadoop集群的安装部署过程,以及如何在Eclipse中配置Hadoop开发环境,如导入Hadoop相关的库,设置编译路径,以及调试MapReduce程序的方法。 《eclipse.docx》...

    MapReduce模型--Map端Combiners聚合

    Combiner的使用可以在Map端进行局部的数据聚合处理,避免了大量中间数据直接传输到Reduce端,从而降低网络带宽的消耗,加快MapReduce任务的执行速度。 ### 知识点详细说明 1. **Combiner的作用和优点** - ...

    hadoop map reduce 中文教程

    每个案例都详细列出了实践步骤,包括如何编写 Map 和 Reduce 函数、如何配置 Hadoop 环境、如何运行 MapReduce 任务等。 #### 六、总结 Hadoop MapReduce 是一种非常强大的分布式数据处理工具,它通过简单的编程...

    Hadoop Map Reduce 教程.doc

    Hadoop Map Reduce 教程.doc

    hadoop之map/reduce

    MapReduce的核心概念包括Mapper、Reducer以及Shuffle和Sort阶段。 Mapper是MapReduce的第一阶段,它的主要任务是对输入数据进行处理,将其转化为键值对(key-value pairs)形式。在给定的描述中,提到输入数据是从...

    hadoop map reduce hbase 一人一档

    标题“hadoop map reduce hbase 一人一档”揭示了这个系统的核心组成部分。Hadoop MapReduce是一种分布式计算框架,用于处理和存储大规模数据集。它通过将复杂任务分解为可并行处理的“映射”和“化简”阶段,使得在...

    Windows平台下Hadoop的Map/Reduce开发

    在Windows平台上进行Hadoop的Map/Reduce开发可能会比在Linux...随着经验的增长,可以进一步探索更复杂的数据处理任务和优化策略,如Combiner的使用、Shuffle和Sort过程的理解,以及JobTracker和TaskTracker的管理等。

    Hadoop源代码分析(MapTask)

    Hadoop源代码分析(MapTask) Hadoop的MapTask类是Hadoop MapReduce框架中的一部分,负责执行Map任务。MapTask类继承自Task类,是MapReduce框架中的一个重要组件。本文将对MapTask类的源代码进行分析,了解其内部...

    提高hadoop的mapreduce job效率笔记

    除了上述参数,还有其他 Job 配置可以优化,如设置适当的`mapreduce.task.io.sort.mb`(排序缓冲区大小)和`mapreduce.reduce.shuffle.parallelcopies`(并行复制副本数),以及启用压缩以减少中间数据的存储空间。...

    最高气温 map reduce hadoop 实例

    【标题】:“最高气温 map reduce hadoop 实例” 在大数据处理领域,Hadoop是一个不可或缺的开源框架,它专为分布式存储和处理大量数据而设计。本实例将介绍如何使用Hadoop MapReduce解决一个实际问题——找出给定...

    TeraByte Sort on Apache Hadoop

    ### TeraByte Sort on Apache Hadoop #### 概述 《TeraByte Sort on Apache Hadoop》是由Yahoo公司的Owen O’Malley撰写的一篇关于Hadoop基准测试方法的论文,该论文详细介绍了一种用于Hadoop平台的大规模数据排序...

    java 从hadoop hdfs读取文件 进行groupby并显示为条形图

    在Java编程环境中,结合Hadoop HDFS(Hadoop Distributed File System)进行大数据处理是一种常见的实践。本项目聚焦于从HDFS读取数据,执行GROUP BY操作,并将统计结果以条形图的形式展示出来,提供了直观的数据...

    基于hadoop的好友推荐系统

    【标题】"基于Hadoop的好友推荐系统"揭示了如何利用大数据处理框架Hadoop来构建一个高效、可扩展的社交网络中的好友推荐功能。在现代的社交媒体平台中,好友推荐是提升用户粘性和互动性的重要手段,通过分析用户的...

Global site tag (gtag.js) - Google Analytics