MapReduce编程例子之Combiner与Partitioner

简介: MapReduce编程例子之Combiner与Partitioner

0x00 教程内容


  1. 本教程是在“MapReduce入门例子之单词计数”上做的升级,请查阅此教程。
  2. 包括了实现Combiner与Partitioner编程,都是一些编程技巧。


0x01 Combiner讲解


1. 优势

a. 其实就是本地的reducer,在本地先聚合一次

b. 可以减少Map Tasks输出的数据量以及数据网络的传输量

2. 使用场景

a. 适用于求和、次数等的加载

b. 求平均数等的计算并不合适


0x02 Partitioner讲解


1. 意义

a. 决定MapTask输出的数据交由哪个ReduceTask处理

b. 默认:计算分发的key的hash值对Reduce Task的个数取模决定有哪个处理


2. 测试单词的Hash值

a. 在进行WordCount的时候,我们可以通过测试代码,计算一下每个单词的Hash值是多少,然后再观察值最终是去到了哪个节点。

b. 如果我们是设置成了2个Reduce,则% 2,测试代码如下:


public class HashCodeTest {
    public static void main(String[] args) {
        System.out.println("an".hashCode() % 2);
        System.out.println("name".hashCode() % 2);
        System.out.println("you".hashCode() % 2);
        System.out.println("are".hashCode() % 2);
        System.out.println("example".hashCode() % 2);
        System.out.println("friend".hashCode() % 2);
        System.out.println("how".hashCode() % 2);
        System.out.println("is".hashCode() % 2);
        System.out.println("my".hashCode() % 2);
        System.out.println("this".hashCode() % 2);
        System.out.println("twq".hashCode() % 2);
        System.out.println("what".hashCode() % 2);
    }
}


0x03 编程实操


1. 实现Combiner

a. 逻辑上与reduce是一样的,因为其实就是本地聚合,在mian方法里添加此句即可:

job.setCombinerClass(MyReducer.class);

image.png

2. 自定义Partitioner

a. 准备统计的数据:

student 1500
teacher 200
student 2000
teacher 300
student 2000
teacher 300
doctor 100
doctor 200
artist 55


b. 修改MyMapper类里面的map方法代码:


for(String word :  words) {
  context.write(new Text(word), one);
}


修改成:

context.write(new Text(words[0]), new LongWritable(Long.parseLong(words[1])));

c. 添加一个Partitioner类:


public static class MyPartitioner extends Partitioner<Text, LongWritable> {
  @Override
  public int getPartition(Text key, LongWritable value, int numPartitions) {
    if(key.toString().equals("student")) {
      return 0;
    }
    if(key.toString().equals("teacher")) {
      return 1;
    }
    if(key.toString().equals("doctor")) {
      return 2;
    }
    return 3;
  }
}


d. 在main方法里添加上自定义的Partitioner类以及Reducer的个数:

//设置job的partition
job.setPartitionerClass(MyPartitioner.class);
//设置4个reducer
job.setNumReduceTasks(4);


0xFF 总结


  1. 注意reducer个数要与你文件的类型个数一致,如student、teacher、doctor、artist四种,则设置为4
  2. 如何执行请查看前面的教程。
相关文章
|
3月前
|
分布式计算 大数据 Hadoop
揭秘MapReduce背后的魔法:从基础类型到高级格式,带你深入理解这一大数据处理利器的奥秘与实战技巧,让你从此不再是编程门外汉!
【8月更文挑战第17天】MapReduce作为分布式计算模型,是大数据处理的基石。它通过Map和Reduce函数处理大规模数据集,简化编程模型,使开发者聚焦业务逻辑。MapReduce分单阶段和多阶段,支持多种输入输出格式如`TextInputFormat`和`SequenceFileInputFormat`。例如,简单的单词计数程序利用`TextInputFormat`读取文本行并计数;而`SequenceFileInputFormat`适用于高效处理二进制序列文件。合理选择类型和格式可有效解决大数据问题。
63 1
|
5月前
|
分布式计算 Hadoop Java
MapReduce编程模型——在idea里面邂逅CDH MapReduce
MapReduce编程模型——在idea里面邂逅CDH MapReduce
85 15
|
5月前
|
分布式计算 Hadoop Java
Hadoop MapReduce编程
该教程指导编写Hadoop MapReduce程序处理天气数据。任务包括计算每个城市ID的最高、最低气温、气温出现次数和平均气温。在读取数据时需忽略表头,且数据应为整数。教程中提供了环境变量设置、Java编译、jar包创建及MapReduce执行的步骤说明,但假设读者已具备基础操作技能。此外,还提到一个扩展练习,通过分区功能将具有相同尾数的数字分组到不同文件。
64 1
|
5月前
|
存储 分布式计算 Hadoop
MapReduce编程模型——自定义序列化类实现多指标统计
MapReduce编程模型——自定义序列化类实现多指标统计
46 0
|
6月前
|
分布式计算 资源调度 Hadoop
MapReduce分布式编程
MapReduce分布式编程
74 1
|
5月前
|
机器学习/深度学习 分布式计算 并行计算
MapReduce是一种用于并行计算的编程模型和处理大规模数据集的实现
MapReduce是一种用于并行计算的编程模型和处理大规模数据集的实现
77 0
|
5月前
|
存储 分布式计算 Hadoop
Hadoop生态系统详解:HDFS与MapReduce编程
Apache Hadoop是大数据处理的关键,其核心包括HDFS(分布式文件系统)和MapReduce(并行计算框架)。HDFS为大数据存储提供高容错性和高吞吐量,采用主从结构,通过数据复制保证可靠性。MapReduce将任务分解为Map和Reduce阶段,适合大规模数据集的处理。通过代码示例展示了如何使用MapReduce实现Word Count功能。HDFS和MapReduce的结合,加上YARN的资源管理,构成处理和分析大数据的强大力量。了解和掌握这些基础对于有效管理大数据至关重要。【6月更文挑战第12天】
211 0
|
6月前
|
分布式计算 并行计算 Java
【分布式计算框架】 MapReduce编程初级实践
【分布式计算框架】 MapReduce编程初级实践
190 2
|
5月前
|
分布式计算 自然语言处理 大数据
【大数据】MapReduce JAVA API编程实践及适用场景介绍
【大数据】MapReduce JAVA API编程实践及适用场景介绍
139 0
|
6月前
|
分布式计算 数据可视化 Hadoop
大数据实战——基于Hadoop的Mapreduce编程实践案例的设计与实现
大数据实战——基于Hadoop的Mapreduce编程实践案例的设计与实现
下一篇
无影云桌面