hadoop_day03-day04 学习笔记 —— MapReduce

hadoop_day03-day04

  • MapReduce
    • 1. 简介
      • 1.1 概述
      • 1.2 组成
      • 1.3 结构图
    • 2. Mapper组件和Reducer组件
      • 入门案例(统计文件中每一个单词出现的次数)
    • 3. 序列化 / 反序列化机制
      • 3.1 概述
      • 3.2 案例:统计流量
    • 4. 分区
      • 4.1 概述
      • 4.2 案例:根据不同地区分区统计流量
    • 5. 排序
      • 5.1 概述
      • 5.2 案例:按总分升序排序
      • 5.3 二次排序
    • 6. 合并
    • 7. MR执行流程
      • 7.1 数据本地化策略
      • 7.2 job执行流程
    • 8. shuffle
      • 8.1 Map阶段的shuffle
      • 8.2 reduce阶段的shuffle
      • 8.3 shuffle调优
    • 9. 小文件处理
    • 10. 数据倾斜
    • 11. Yarn

MapReduce

map(整理) reduce(计算)

1. 简介

1.1 概述

  • MapReduce是一种分布式计算模型
  • 由谷歌提出,基于GFS进行设计,主要用于搜索领域
  • Doug Cutting根据《MapReduce: Simplified Data Processing on Large Clusters》设计实现了Hadoop中基于HDFS的MapReduce
  • MapReduce是由两个阶段组成:MapReduce,用户只需要实现map以及reduce两个函数,即可实现分布式计算,这样做的目的是简化分布式程序的开发和调试周期

1.2 组成

  • JobTracker / ResourceManager:任务调度者,管理多个TaskTracker。
    ResourceManager是Hadoop2.0版本之后引入Yarn之后用于替代JobTracke部分功能的机制
  • TaskTracker / NodeManager:任务执行者

1.3 结构图

hadoop_day03-day04 学习笔记 —— MapReduce_第1张图片

  1. HDFS中获取数据
  2. MapReduce首先会将输入的数据进行逻辑切片,每一个切片是一个InputSplit对象
  3. 每一个InputSplit对象会交给一个MapTask来执行
  4. 切片中的每一行数据都会触发一次map方法
  5. map方法的输入的键默认为数据偏移量,输入的值为这一行的数据;输出的键以及值的类型根据业务确定
  6. Barrier阶段,会将所有相同的键所对应的值放入一个ArrayList中,然后产生一个迭代器交给ReduceTask来执行
  7. 在ReduceTask中,每一个键都会触发一次reduce方法
  8. 将结果写到HDFS中

2. Mapper组件和Reducer组件

  • Mapper组件
    hadoop_day03-day04 学习笔记 —— MapReduce_第2张图片
  • Reducer组件
    hadoop_day03-day04 学习笔记 —— MapReduce_第3张图片

入门案例(统计文件中每一个单词出现的次数)

运行jar包命令: hadoop jar xxx.jar

  • WordCountMapper.java
    hadoop_day03-day04 学习笔记 —— MapReduce_第4张图片

  • WordCountReduce.java
    hadoop_day03-day04 学习笔记 —— MapReduce_第5张图片

  • WordCountDriver.java
    hadoop_day03-day04 学习笔记 —— MapReduce_第6张图片

3. 序列化 / 反序列化机制

3.1 概述

  • 在Hadoop的集群工作过程中,一般是利用RPC来进行集群节点之间的通信和消息的传输,所以要求MapReduce处理的对象必须可以进行序列化/反序列操作
  • Hadoop并没有使用Java原生的序列化,而是利用的是Avro实现的序列化和反序列,并且在此基础上进行了更好的封装,提供了便捷的API
  • 在Hadoop中要求被序列化的对象对应的类必须实现Writable接口,重写其中的write方法以及readFields方法
  • 序列化过程中要求属性值不能为null

3.2 案例:统计流量

  • Flow.java
    hadoop_day03-day04 学习笔记 —— MapReduce_第7张图片
    hadoop_day03-day04 学习笔记 —— MapReduce_第8张图片
  • FlowMapper.java
    hadoop_day03-day04 学习笔记 —— MapReduce_第9张图片
  • FlowDriver.java
    hadoop_day03-day04 学习笔记 —— MapReduce_第10张图片
  • FlowDriver.java
    hadoop_day03-day04 学习笔记 —— MapReduce_第11张图片

4. 分区

4.1 概述

  1. 分区操作是shuffle操作中的一个重要过程,作用:将map的结果按照规则分发到不同reduce中进行处理,从而按照分区得到多个输出结果。
  2. Partitioner是分区的基类,如果需要定制partitioner也需要继承该类
  3. HashPartitioner是MapReduce的默认partitioner。计算方法是:which reducer=(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks
  4. 默认情况下,reduceTask数量为1
  5. 很多时候MapReduce自带的分区规则并不能满足业务需求,为了实现特定的效果,可以需要自己来定义分区规则
  6. 如果定义了几个分区,则需要定义对应数量的ReduceTask
  • Partitioner将会将数据发往不同reducer,这就要求Reducer的数量应该大于等于Partitioner的数量,如果少于则在执行的过程中会报错。
  • Partitioner的默认数量为1,所以可以将Reducer的数量设置为1

4.2 案例:根据不同地区分区统计流量

在3.2中的案例基础上,增加一个自定义分区的类。

  • FlowPartitioner.java
    hadoop_day03-day04 学习笔记 —— MapReduce_第12张图片
  • FlowDriver.java
    hadoop_day03-day04 学习笔记 —— MapReduce_第13张图片

5. 排序

5.1 概述

  1. Map执行过后,在数据进入reduce操作之前,数据将会按照输出的Key进行排序,利用这个特性可以实现大数据场景下排序的需求
  2. 要排序的对象对应类实现WritableComparable接口根据返回值的正负决定排序顺序
  3. 如果比较的结果一致,则会将相同的结果舍弃
  4. 如果对类中的多个属性进行比较,则此时的排序称之为叫二次排序
  • 排序规则:
    拿当前对象this和参数s进行比较
    • 如果返回值是正数,那么this.score在减号右边,形成的是升序排序
    • 如果返回值是负数,那么this.score在减号前边,形成的是降序排序

5.2 案例:按总分升序排序

  • Score.java
    hadoop_day03-day04 学习笔记 —— MapReduce_第14张图片
    hadoop_day03-day04 学习笔记 —— MapReduce_第15张图片
  • ScoreMapper.java
    hadoop_day03-day04 学习笔记 —— MapReduce_第16张图片
  • ScoreReducer.java
    hadoop_day03-day04 学习笔记 —— MapReduce_第17张图片
  • ScoreDriver.java
    hadoop_day03-day04 学习笔记 —— MapReduce_第18张图片

5.3 二次排序

hadoop_day03-day04 学习笔记 —— MapReduce_第19张图片

6. 合并

  • 概述
    hadoop_day03-day04 学习笔记 —— MapReduce_第20张图片
  • eg:在入门案例统计单词出现的次数的案例基础上,增加一个WordCountCombiner类。
    • WordCountCombiner。.javahadoop_day03-day04 学习笔记 —— MapReduce_第21张图片
    • WordCountDriver.javahadoop_day03-day04 学习笔记 —— MapReduce_第22张图片

7. MR执行流程

7.1 数据本地化策略

hadoop_day03-day04 学习笔记 —— MapReduce_第23张图片

7.2 job执行流程

用MapReduce在进行数据计算的时候,会对数据进行切片处理(和切块不一样),默认128兆
hadoop_day03-day04 学习笔记 —— MapReduce_第24张图片

8. shuffle

8.1 Map阶段的shuffle

hadoop_day03-day04 学习笔记 —— MapReduce_第25张图片
注意的问题:

  • 最后有残留的数据会进行最后一次刷新到新的文件中
  • 在默认情况下,split的大小是80M,但要考虑最后的冲刷情况和计算的问题(计算之前的数据和计算完之后的数据不一定大小一样),不能凭借一个maptask处理的切片大小来衡量maptask之后输出的数据的多少
  • 每一个切片对于一个maptask,每一个maptask对应一个环形缓冲区
  • 缓冲区本质上就是一个数组
  • 为什么环形缓冲区是环形的?
    好处:可以重复利用同一缓冲区,首尾相接,比较连贯
  • 为什么缓冲区的阈值为80%?
    好处:避免split过程产生阻塞
  • merge过程可能不会发生

8.2 reduce阶段的shuffle

  1. reduceTask通过http的方式得到输出文件的分区,这个过程称为fetch
  2. 每个人reduceTask将获取到的分区的数据再次进行merge,然后进行排序
  3. 将相同的key做聚合操作,然后将值放到迭代器中,这个过程称为grouping
  4. 调用reduce方法,将key和迭代器传入,并计算

注意的问题:

  • fetch拉取数据默认是5个线程
  • reducetask的阈值是5%,如果5%的maptask完成之后,reducetask就开始启动拉取数据
  • reduce的merge因子默认为10,相当于10个文件合并成一个文件。
    eg:
    60个文件:
    6个文件合并一次 → 1+54个文件
    10个文件合并五次 → 1+5+4个文件
    最后合并一次 → 1个文件

8.3 shuffle调优

  • map阶段
    • 增大缓冲区(250M - 500M)mapreduce.task.io.sort.mb进行配置
    • 可以引入combiner
    • 合并完的文件可以进行压缩,将来在传递的时候可以减少网络传输的消耗。但是不推荐。
  • reduce阶段
    • 增多fetch的线程数
    • 降低ReduceTask的阈值
    • 提高merge因子

9. 小文件处理

处理小文件的方式:

  • 引入手工合并根据
  • 将小文件打成har包
  • SequenceFile 原理:将多个小文件存到类似于properties结构。key是文件名,value是文件内容
  • 多源输入

10. 数据倾斜

hadoop_day03-day04 学习笔记 —— MapReduce_第26张图片

  • 特点:数据本身就具有倾斜的特性。数据本身分布的不均匀
    一般情况下,数据倾斜发生在reduce端.
    map端,不能切片的数据可能会发生数据倾斜

11. Yarn

  • 是在hadoop2.0最后出现的
  • hadoop1.0中,MapReduce这个模块,即负责计算,但是还负责程序资源的分配。MapReduce做的事情太多了。如果有4000个节点以上同时计算,则整个集群的性能就成倍下降。
  • hadoop2.0 yarn组件就用于任务调度和资源管理
    • resourcemanager:资源管理
    • Application Master:任务调度
    • nodemanager:执行任务

你可能感兴趣的:(大数据实训笔记,hadoop)