四、MapReduce
1.分布式运算程序
-
优点:可用于大量廉价pc机上、可通过增加机器来扩展算力、高容错性(节点计算任务转移)、可处理PB级数据
-
缺点:无法实时计算、无法流式计算、无法有向无环图计算(大量磁盘IO)
2.核心编程思想:
-
分为两个阶段:MapTask、ReduceTask
-
只能一个map和一个reduce,可以多个mapreduce串行
3.三类实例进程
-
mrappmaster:负责整个程序的过程调度及状态协调
-
maptask:负责Map阶段的整个数据处理流程
-
reducetask:负责Reduce阶段的整个数据处理流程
4.常用序列化类型
-
特殊:IntWritable、Text、LongWritable(常用)
-
其余:类型+Writable
5.mapreduce编程规范:Mapper、Reducer和Driver
6.案列
-
本地测试
-
提交于集群测试:路径改为main变量且于集群hadoop jar *.jar 全类名 参数1 参数2 ..
-
在windows上向集群提交任务(了解):设置conf
7.hadoop序列化与反序列化(自定义bean对象实现Writable接口)
-
对象重写write、readFields方法
-
序列顺序一致
-
重写toString,使用“\t”
-
若bean放于key,则还需实现Comparable接口,因为shuffle要求key可排序
8.框架原理
-
input--inputFormat--Mapper--Shuffle--Reducer--OutputFormat--Output
-
Shuffle: sort--copy--sort
-
数据切片是MapReduce程序计算输入数据的单位,一个切片会对应启动一个MapTask
-
默认切片大小为BlockSize,否则会发生跨节点读数据
9.job提交原码
-
建立连接:判断是本地运行环境还是集群运行环境
-
创建给集群提交数据路径
-
拷贝jar包到集群
-
计算切片,生成切片规划文件、向路径写xml配置文件
-
提交job,返回提交状态
10.切片原码:
-
遍历目录下每一个文件
-
计算切片大小,默认128m
-
每次切片要判断剩余大小是否大于块的1.1倍,小于就划为一块切片
-
将切片信息写于规划文件InputSplit
-
过程于getSplit中完成
-
提交规划文件于yarn,并计算maptask数量
11.combineTextInputFormat切片机制:过程分为虚拟存储、切片过程
-
用于处理大量小文件,多个文件交于一个task处理
-
根据实际情况设置切片最大值: .setMaxInputSplitSize(job, 4194304);// 4m
-
虚拟存储:所有文件与4m比较,小于(划一块)、处于1-2倍(除2划两块)、
大于2倍(按最大4m划分,最后除2划两块)
-
切片过程:划分后的文件是否大于4m,大于(单独形成切片)
小于(与下一个文件合形成一个切片)
12.shuffle机制(sort、copy、sort)
-
map方法输出的数据进入环形缓冲区(默认100m,两端放数据,80%时反向并排序之前数据(快排))
-
输出数据按分区隔离后,再合并、排序(归并)后写入磁盘
-
copy出各task的数据,合并、排序(归并)后再按key分组输出到reduce方法
13.自定义partition分区
-
类继承Partitioner,重写getParttion方法
-
job驱动中设置分区类:.setPartitionnerClass(**.class)
-
根据分区逻辑设置task数量:.setNumReduceTasks(*)
-
若数字大于实际分区数(产生空文件,浪费task)、小于(报错)
14.WritableComparable排序
-
自定义对key排序(且快排)
-
重写compareTo,编写排序逻辑
-
dirver添加配置
15.Combiner合并
-
父类为reduce
-
对每一个maptask进行局部汇总,减少网络传输量
-
driver添加配置
16.input\OutPutFormat
-
input:切片、配置信息
-
默认输出格式:TextOutFormat
-
其中使用Recordwriter来写数据
17.MapReduce工作机制
-
客户端提交job到yarn:计算出maptaskshul
-
maptask中textinputformate用recorderreader向map读入一行数据
-
数据进入环形缓冲区排序并分区,对多条结果归并排序,写数据到磁盘
-
reducertask拷贝多个maptask磁盘中数据到本地,进行归并排序到reduce
-
reduce一次读一组数据,再将数据送到textoutputformat中的recordwriter写出到文件
18.reduceTask 并行度决定机制
-
maptask个数由切片数决定
-
reducetask数量可以手动设置
-
数据倾斜:reducetask之间输入数据量分布不均
19.reduceJoin
-
合并操作于reduce阶段完成
-
创类包含两表属性
-
mapper中setup创流,map向两流写入数据
-
reducer中合并
20.Mapjoin
-
适用于一张表小(内存),一张大的场景
-
只需在mapper中,setup里写缓存数据,map写连接
-
driver配置内存路径job.addCacheFile
21.自定义分组
-
创类继承WritableComparator
-
重写compare
22.压缩:减少磁盘io
-
运算密集型少用压缩
-
io密集型多用压缩
-
deflate、gzip、bzip2、snappy
23.压缩方式:压缩/解压缩速度、压缩率、是否支持切片
24.压缩位置:
-
map前:考虑解压速度、是否可切片
-
map后:考虑压缩/解压速度
-
reduce后:考虑压缩率
25.可在map/reduce端采用压缩,driver中配置
-
开启压缩:conf.setBoolean
-
设置压缩方式:conf.setClass