MapReduce常用三大组件

来源:互联网 发布:csol重狙弹道优化 编辑:程序博客网 时间:2024/05/22 12:30

1、MapReduce中的Combiner

1.1、什么是Combiner

Combiner是MapReduce程序中Mapper和Reducer之外的一种组件,他的作用在MapTask之后给MapTask的结果进行局部汇总,以减轻reducetask的计算负载,减少网络传输。

1.2、如何使用Combiner

编写一个类,然后继承Reducer,reduce方法中写具体的Combiner逻辑,然后再job中设置Combiner组件:job.setCombinerClass(FlowSumCombine.class)


1.3、使用Combiner注意事项

Combiner和Reducer的区别在于运行的位置:
Combiner是在每一个MapTask所在的节点运行,Reducer是接收全局所有的Mapper的输出结果。
Combiner的输出kv应该跟Reducer的输出kv类型要对应起来
Combiner的使用要非常谨慎,因为Combiner在MapReduce过程中可能调用也可能不调用,可能调一次,也可能调多次,所以:
Combiner使用原则:有或没有都不能影响业务逻辑,都不能影响最终结果。

2、MapReduce中的序列化

1.1、概述

Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,header,继承体系等),不便在于网络中高效传输,所以,hadoop自己开发了一套序列化机制(Writable),精简,高效。
Hadoop中的序列化框架已经对基本类型和null提供了序列化的实现:
byte ByteWritable
Short ShortWritable
int IntWritable
long LonGWritable
float DloatWritable
double DoubleWritable
String Text
null NullWritable

1.2、Java序列化

实现implements Serializable接口

1.3、自定义对象实现MapReduce框架的序列化

如果需要将自定义的bean放在key中传输,则还需要实现Comparable接口,因为MapReduce框架中的shuffle过程一定会对key进行排序,此时,自定义的bean实现的接口应该是:
public class FlowBean implements WritableComparable<FlowBean>
无参构造、序列化方法、反序列化方法

3、MapReduce中的Sort

基本思路:
实现自定义的bean来封装流量信息,并将bean作为map输出的key来传输MR程序在处理数据的过程汇总会对数据排序(map输出的kv对传输到reduce之前,会排序),排序是依据map输出的key,所以我们如果要实现自己需要的排序规则,则可以考虑排序因素放到key中,让key实现接口:WritableComparable,然后重写key的compareTo方法。


4、MapReduce中的Partitioner

基本思路:
MapReduce中会将map输出的kv对,按照相同key分组,然后分发给不同的reducetask默认的分发规则为:根据key的hashcode%reducetask数来分发,所以:如果要是按照我们自己的需求分组,则需要改写数据分发(分组)组件Partitioner。自定义一个类,然后继承Partitioner,然后再job对象中,设置自定义Partitioner:
job.setPartitionerClass(类.class);
原创粉丝点击