Mapreduce
Mapreduce
1.mapreduce是什么
- 分布式离线的计算框架,是一个分布式运算程序的编程框架,是用户开发基于hadoop的数据分析应用的核心框架,mapreduce的核心功能是将用户编写的业务逻辑代码和自带的默认组件整合成一个完整的分布式运算程序,并发运行在一个hadoop集群上。
- hdfs–解决的是海量数据的存储问题。
- mapreduce—解决的是海量数据的计算以及索引问题。
2.mapreduce产生的背景
实现分布式计算框架的思想
- 单个运算程序需要分段
- 阶段一:并行局部运算
- 阶段二:汇总处理(并行处理)
- 不同阶段需要开发不同的程序
- 阶段之间的调度
- 业务程序(task程序)如何分发到集群中并且如何启动
- 如何监控task程序的运行状态,如何处理异常
- 这些所有问题是所有分布式数据分析处理需求中所必须面对的问题,完全可以封装成框架
- MAPREDUCE -->分布式计算框架
- YARN -->分布式资源调度
- NIO,BIO异步非阻塞
模拟实现,并不是真正的实现过程
- 分发运算程序
- worker接受jar包
- worker向客户端发送接收成功的信息,询问如何启动程序
- 发送启动命令给worker
- java -cp maptask 266405.txt 0-128M
- 根据命令启动task任务
- 问题
- 客户端和服务器之间的传输
- 服务器的mr开启服务组件,其中包括SocketServer,这样客户端就可以和服务端进行通信了。
- resourcemanager
- 负责资源调度
- 客户端和服务器之间的传输
mapreduce的架构
1.MR程序的组成
- appMaster---->mapreduce的进程
- maptask —>自己继承Mapper重写的map()方法
- reducetask —>自己继承Reducer重写的reduce()方法
- clinetDriver —>myClient
2.job的提交流程
- 图示
-
流程
- 客户端提交job到RM(resourcemanager)
- RM生成job id 和path,并返回给客户端
- 将资源上传到hdfs之上
- 返回资源已上传成功的消息
- RM会将job放入待调度队列
- RM会先分配一个资源给该job
- 第一次分配资源:启动appMaster
- worker到hdfs上拉取资源包
- worker拉取资源之后,向客户端发送拉取成功的消息,并询问如何启动?
- java -cp appMaster
- 启动appMaster
- 之后的申请资源:启动maptask
- appMaster向RM申请资源,用于执行maptask
- RM分配资源
- NM到hdfs拉取资源之后,启动maptask
- 向appMaster询问,如何启动maptask
- appMaster发送启动命令给worker java -cp maptask a.txt 0-128M
- 启动maptask
- 启动reducetask
- 任意一个maptask任务完成后,appMaster会向RM申请启动reducetask所需的资源。
- 分配资源后,appMaster发送启动命令给worker java -cp reducetask
- reducetask启动
-
只有启动AppMaster的时候会去询问客户端,AppMaster启动之后,整个程序的资源申请都是由appMaster来向resourcemanager申请的
-
所有的任务都在worker中执行,包括appMaster,maptask,reducetask
-
worker:container,相当于jvm。
3.分片
- 图示
-
注意点:
- 最小分片大小 1byte M
- 最大分片大小long的最大值 L
- 分块的大小 B
- 算法
- min(max(M,B),L)不确定
-
如何分片
-
客户端程序要多大的并行度(maptask的数量)
-
map阶段的并行度:
-
可会断会首先先看一下
待处理目录下有多少数据量
-
循环遍历,对每一个文件
-
看看这个文件有多少个block,并将block进行累加
-
返回一个任务规划描述文件:
job.splits
split0 : /date/a.txt 0-128M
split0 : /date/a.txt 128-256M
…
split6 : /date/a.txt 768-800M
…
-
-
分片与分块的区别
-
分片不会真正意义上的把文件切开
只是给一个偏移量。
-
分块是物理上的概念,真正的将数据给切开了
-
分片是逻辑
-
-