离线计算组件篇-MapReduce基础

2022-11-26  本文已影响0人  CoderInsight

1.mapreduce编程指导思想

本文的核心是带领大家去了解的MapReduce的核心设计思想,以及最基础的编程方法,虽然该组件在实际的开发中不常用了,但是其分而治之的设计思想是十分值的学习和借鉴的。

(1). Map阶段2个步骤

(2). shuffle阶段4个步骤

(3). reduce阶段2个步骤

2.MapReduce 的输入和输出

    MapReduce框架运转在**<key,value>** **键值对**上,也就是说,框架把作业的输入看成是一组<key,value>键值对,同样也产生一组<key,value>键值对作为作业的输出,这两组键值对可能是不同的。

    一个MapReduce作业的输入和输出类型如下图所示:可以看出在整个标准的流程中,会有三组<key,value>键值对类型的存在。
MapReduce的输入输出.png

(1).hadoop当中常用的数据类型

Java类型 Hadoop Writable类型
Boolean BooleanWritable
Byte ByteWritable
Int IntWritable
Float FloatWritable
Long LongWritable
Double DoubleWritable
String Text
Map MapWritable
Array ArrayWritable
byte[] BytesWritable

3.MapReduce 的序列化

(1).概述

序列化(Serialization)是指把结构化对象转化为字节流。

反序列化(Deserialization)是序列化的逆过程。把字节流转为结构化对象。

当要在进程间传递对象或持久化对象的时候,就需要序列化对象成字节流,反之当要将接收到或从磁盘读取的字节流转换为对象,就要进行反序列化。

Java的序列化(Serializable)是一个重量级序列化框架,一个对象被序列化后,会附带很多额外的信息(各种校验信息,header,继承体系…),不便于在网络中高效传输;所以,hadoop自己开发了一套序列化机制(Writable),精简,高效。不用像java对象类一样传输多层的父子关系,需要哪个属性就传输哪个属性值,大大的减少网络传输的开销。

Writable是Hadoop的序列化格式,hadoop定义了这样一个Writable接口。

一个类要支持可序列化只需实现这个接口即可。

public interface Writable {  
void write(DataOutput out) throws IOException;  
void readFields(DataInput in) throws IOException;  
} 

(2).Writable 序列化接口

如需要将自定义的bean放在key中传输,则还需要实现WritableComparable接口,因为mapreduce框中的shuffle过程一定会对key进行排序,此时,自定义的bean实现的接口应该是:

public class FlowBean implements WritableComparable<FlowBean>

需要自己实现的方法是:

/**
 * 序列化的方法
*/
@Override
public void write(DataOutput out) throws IOException {
    out.writeLong(upflow);
    out.writeLong(dflow);
    out.writeLong(sumflow);
}

/**
* 反序列化的方法,反序列化时,从流中读取到的各个字段的顺序应该与序列化时写出去的顺序保持一致
*/
@Override
public void readFields(DataInput in)throws IOException {
    upflow = in.readLong();
    dflow = in.readLong();
    sumflow = in.readLong();
}

@Override
public int compareTo(FlowBean o) {
    //实现按照sumflow的大小倒序排序
    return sumflow>o.getSumflow()?-1:1;
}

compareTo方法用于将当前对象与方法的参数进行比较。

如果指定的数与参数相等返回0。

如果指定的数小于参数返回 -1。

如果指定的数大于参数返回 1。

例如: o1.compareTo(o2);

返回正数的话,当前对象(调用compareTo方法的对象o1)要排在比较对象(compareTo传参对象o2)后面,返回负数的话,放在前面。

// 代码示例 
@Override
    public int compareTo(Pojo o) {
        // 先按年龄升序排序,再按身高降序排序
        int i = this.age.compareTo(o.age);
        if (i == 0){
            // 当前判断中指定的就是当age相同的时候,再去比较high,然后对升序取反就是降序
            i = -(this.high.compareTo(o.high));
        }
        return i;
    }

4.Map task 数量以及切片机制

(1).MapTask个数与切片原理

split计算.png split计算2.png

(2).MapTask个数判断示例

file1.txt    300M
file2.txt    10M
    2、经过FileInputFormat的切片机制运算后,形成的切片信息如下:
file1.txt.split1-- 0~128
file1.txt.split2-- 128~256
file1.txt.split3-- 256~300
file2.txt.split1-- 0~10M
一共就会有四个切片,与我们block块的个数刚好相等

(3).如何控制mapTask的个数

如果有1000个小文件,每个小文件是1kb-100MB之间,那么我们启动1000个MapTask是否合适,该如何合理的控制MapTask的个数???

上一篇下一篇

猜你喜欢

热点阅读