MapReduce概述
MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。
MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。
MapReduce优缺点
优点
- MapReducer易于编程
- 良好的扩展性
- 高容错性
- 适合PB级以上海量数据的离线处理
缺点
-
不擅长实时计算
不能在毫秒或秒级内返回结果
-
不擅长流式计算
流式计算的输入数据是动态的。MapReducer的输入数据是静态的,不能动态变化。
-
不擅长DAG(有向无环图)计算
多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce并不是不能做,而是使用后,每个MapReduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常的低下。
MapReduce核心思想
- MapReducer运算程序一般需要分为2个阶段:Map阶段和Reducer阶段
- Map阶段的并发MapTast,完全并行运行,互不相干
- Reduce阶段的并发ReduceTask,完全互不相干,但数据依赖上个阶段的所有MapTask并发实例的输出
- MapReducer编程模型只能包含一个Map阶段和一个Reduce阶段。如果业务逻辑非常复杂,那么只能多个MapReducer程序串行运行。
MapReduce进程
一个完整的MapReducer程序在分布式运行时有三类实例进程:
- MrAppMaster:负责整个程序的过程调度及状态协调
- MapTask:负责Map阶段整个数据处理流程
- ReduceTask:负责Reduce阶段的整个数据处理流程
MapReduce编程规范
序列化
Hadoop常用数据序列化类型
什么是序列化
序列化 就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储到磁盘(持久化)和网络传输。
反序列化 就是将收到字节序列(或其他数据传输协议)或者是磁盘的持久化数据,转换成内存中的对象。
为什么要序列化
Hadoop是一个集群。在集群上运行MapReduce任务时,Map阶段和Reduce阶段不一定在同一台机器上,可能需要跨网络传输。因此需要序列化。
为什么不用Serializable
Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,Header,继承体系等),不便于在网络中高效传输。所以,Hadoop自己开发了一套序列化机制(Writable)。
Hadoop序列化特点:
- 紧凑:高效使用存储空间
- 快速:读写数据的额外开销小
- 互操作:支持多语言的交互
自定义bean对象
- 实现Writable接口
- 反序列化时,需要反射调用空参构造函数
- 重写方法 write 和 readFields 方法
- 注意反序列化的顺序和序列化的顺序完全一致
- 要想把结果显示在文件中,需要重写toString()
Mapper
- 继承Mapper类
- Mapper阶段输入数据时kv对的形式
- setup()方法 在一个MapTask任务开始时执行一次(整个任务只执行一次)
- 业务逻辑写在map()方法中
- map()方法(MapTask进程)对每一个<K,V>调用一次
- clearup()方法 在一个MapTask任务结束时执行一次
Reducer
- 继承Reducer类
- Reducer的输入数据类型对应Mapper的输出类型
- Reducer的业务逻辑写在reduce()方法中
- ReduceTask进程对每一组相同k的<K,V>调用一次reduce()方法
Driver
相当于YARN集群的客户端,用于提交整个程序到YARN集群,提交的是封装了MapReduce程序相关运行参数的job对象