MapReduce知识点整理

本文详细梳理了MapReduce的知识点,包括序列化、InputFormat与OutputFormat、MapReduce工作流程、分区与排序、Join操作以及调优策略。内容涵盖了自定义序列化类、InputFormat的各类实现、数据的shuffle过程、ReduceTask的工作机制、全排序的应用以及MapReduce任务并行度的设定。此外,还探讨了如何通过自定义Partitioner、采样分区和调优策略来应对数据倾斜问题。
摘要由CSDN通过智能技术生成

MapReduce知识点整理

基于版本:Hadoop 2.7.2

序列化

Q: 为什么Hadoop不使用Java自带的序列化?
A: Java自带的序列化框架过于重量级(附带很多额外信息:校验信息、Header、继承体系等),网络传输效率低,所以Hadoop自己实现了序列化机制(Writable接口).

自定义可序列化类

  1. 实现Writable接口
  2. 反序列化用到反射,需要调用无参数构造方法,因此自定义的可序列化类需要有无参数构造方法
  3. 重新write方法(序列化)和readFields方法(反序列化),注意序列化和反序列化时字段顺序需要保持一致
  4. Hadoop的shuffle过程会对键排序,因此如果需要自定义的可序列化类对象作为键,还需要实现WritableComparable接口
  5. 如果对象需要作为reduce的输出写入文件,需要重写toString方法实现其字符串形式的表示,一般采用\t将字段分开的形式,便于之后的MapReduce任务读取

InputFormat

InputFormat

抽象类InputFormat是输入格式的基类,主要实现了两个功能:

  • 将输入文件切片
  • 从切分读入键值对序列

FileInputFormat

  • FileInputFormat是针对文件输入的抽象类,主要处理文件切片逻辑
  • 按输入文件长度切片,默认的切片大小等于BlockSize,对于每个输入文件单独切分而不是合并切片
  • splitSize = Math.max(minSize, Math.min(maxSize, blockSize))
  • 通过设置mapreduce.input.fileinputformat.split.minsize(默认值为1)大于BlockSize,让切片变大
  • 通过设置mapreduce.input.fileinputformat.split.maxsize(默认值为Long.MAX_VALUE)小于BlockSize,让切片变小
  • 细节:将文件切片时,每次判断剩余文件大小是否大于切片大小的1.1倍,如果是,则新建切片

TextInputFormat

  • 默认的输入格式实现类
  • 按行读取文件
  • 键:存储在整个文件中的起始字节偏移量,LongWritable类型
  • 值:本行内容,不包含换行符和回车符,Text类型

CombineTextInputFormat

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值