MR
一.MR概述
1.mr定义
Mr是一个分布式运算程序的编程框架,是用户开发”基于hadoop的数据分析应 用”的核心框架
Mr核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整地 分布式运算程序,并发运行在一个hadoop集群上
2.mr优缺点
2.1.优点
(1)易于编程.用户只关心业务逻辑.实现框架的接口
(2)良好扩展性:可以动态增加服务器,解决计算资源不够问题
(3)高容错性.任何一台机器挂掉,可以将任务转移到其它节点
(4)适合海量数据计算(TB/PB).几千台服务器共同计算
2.2.缺点
(1)不擅长实时计算.mysql
(2)不擅长流式计算.sparkstreaming flink
(3)不擅长dag有向无环图计算.spark
3.mr核心思想
4.mr进程
一个完整的mr程序在分布式运行时有三类实例进程:
A.mrappmaster:负责整个程序的过程调度及状态协调
B.maptask:负责map阶段的整个数据处理流程
C.reducetask:负责reduce阶段的整个数据处理流程
5.官方wordcount源码
采用反编译工具反编译源码,发现wordcount案例有map类,reduce类和驱动类. 且数据类型是hadoop自身封装的序列化类型
6.常用数据序列化类型
7.mr编程规范
用户编写的程序分为三个部分:mapper,reducer和driver
(1)mapper阶段
A.用户自定义的mapper要继承自己的父类
B.mapper的输入数据时kv对的形式(kv类型可自定义)
C.mapper中的业务逻辑写在map()方法中
D.mapper的输出数据时kv对的形式(kv的类型可自定义)
E.map()方法(maptask进程)对每一个<k,v>调用一次
(2)reducer阶段
A.用户自定义的reducer要继承自己的父亲
B.reducer的输入数据类型对应mapper的输出数据类型,也是kv
C.reducer的业务逻辑写在reduce()方法中
D.reduceTask进程对每一组相同k的<k,v>组调用一次reduce()方法
(3)driver阶段
相当于yarn集群的客户端,用于提交我们整个程序到yarn集群,提交的是 封装了mapreduce程序相关运行参数的job对象
8.wordcount实操
8.1本地测试
(1)需求
在给定的文本文件中统计输出每一个单词出现的总次数
A.输入数据
B.期望输出数据
(2)需求分析
按照要求,分别编写mapper,reducer,driver
(3)环境准备
A.创建maven工程
B.在pom.xml中添加如下依赖
C.在项目的src/main/resources目录下,新建一个文件夹,命名 为”log4j.properties”,在文件中填入
D.创建包名:com.shujia.mapreduce.wordcount
(4)编写程序
A.编写Mapper类
B.编写Reducer类
C.编写Driver类
(5)本地测试
A.需要首先配置好HADOOP_HOME变量以及Windows运行依赖
B.在IDEA/Eclipse上运行
8.2提交到集群测试
(1)用maven打jar包,需要添加的打包插件依赖
(2)将程序打成jar包
8.3远程提交集群测试
(1)将jar包导入虚拟机输入命令
(2)查看结果
二.Hadoop序列化
1.序列化概述
(1)什么是序列化
序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便 于存储到磁盘(持久化)和网络传输
反序列化就是将收到字节序列(或其他数据传输协议)或者是磁盘的持久 化数据,转换成内存中的对象
(2)为什么要序列化
一般来说,”活的”对象只生存在内存里,关机断电就没有了.而且”活的”对象 只能由本地的进程使用,不能被发送到网络上的另一台计算机.然而序列化 可以存储活的对象,可以将活的对象发送到远程计算机
(3)为什么不用java的序列化
Java的序列化是一个重量级序列化框架,一个对象被序列化后,会附带很多 额外信息(各种校验信息,header,继承体系等),不便于在网络中高效传输.
2.自定义bean对象实现序列化接口(Writable)
在企业开发中往往常用的基本序列化类型不能满足所有需求,比如在hadoop 框架内部传递一个bean对象,那么该对象就需要实现序列化接口
具体实现bean对象序列化步骤如下7步
(1)必须实现Writable接口
(2)反序列化时,需要反射调用空参构造函数,所以必须有空参构造
(3)重写序列化方法
(4)重写反序列化方法
(5)注意反序列化的顺序和序列化的顺序和完全一致
(6)要想把结果显示在文件中,需要重写toString(),可用”\t”分开,方柏霓后续使用
(7)如果需要将自定义的bean放在key中传输,则还需要实现Comparable接口, 因为Mapreduce框中的shuffle过程要求对key必须能排序
3.序列化实操
三.MR框架原理
1.输入数据inputformat
1.1.切片与maptask并行度决定机制
(1)问题引出
Maptask的并行度决定map阶段的任务处理并发度,进而影响整个job 的处理速度
思考:1G的数据,启动八个maptask,可以提高集群的并发处理能力.那 么1k的数据,也启动八个maptask,会提高集群性能吗?maptask并行任 务是否越多越好?哪些因素影响了maptask并行度
(2)maptask并行度决定机制
数据块:block是hdfs物理上把数据分成一块一块.数据块是hdfs存储 数据单位
数据切片:数据切片只是逻辑上对输入进行分片,并不会在磁盘上将其 切分成片进行存储.数据切片是mapreduce程序计算输入数据的单位, 一个切片会对应启动一个maptask
1.2.job提交流程源码和切片源码详解
(1)job提交流程源码详解
(2)FileInputFormatq切片源码解析(input.getSplits(job))
A.程序先找到数据存储的目录
B.开始遍历处理(规划切片)目录下的每一个文件
C.遍历第一个文件
(a)获取文件大小
(b)计算切片大小
(c)默认情况下,切片大小=blocksize
(d)开始切,形成第一个切片...
(每次切片时,都要判断切完剩下的部分是否是大于块的1.1 倍,不大于就划分一块切片)
(e)将切片信息写到一个切片规划文件中
(f)整个切片的核心过程在setSplit()方法中完成
(g)IntputSplit只记录了切片的元数据信息,比如起始位置,长度以 及所在的节点列表等
D.提交切片规划文件到yarn上,yarn上的mrappmaster就可以根据切 片规划文件计算开启maptask个数
1.3.fileinputformat切片机制
fileinputformat切片大小的参数配置