mapreduce
#hadoop/mapreduce
MapReduce将复杂的,运行于大规模集群上的并行计算过程高度的抽象到了两个函数:map和reduce
编程变得容易,不需要掌握分布式并行编程细节,也可以很容易把自己的程序运行在分布式系统上,完成海量数据的计算
MapReduce采用分而治之的策略,一个储存在分布式文件系统中的大规模数据集,会被切分为许多独立的分片(split),这些分片可以被多个map任务并行处理
MapReduce设计理念就是计算向数据靠拢,而不是数据向计算靠拢,因为移动数据需要大量的网络传输开销
MapReduce框架采用了Master和slave架构,包括一个Master和若干个slave。Master上运行jobTracker,slave上运行TaskTracker
Hadoop使用Java实现的,但是MapReduce应用程序不一定要用Java来写
- 海量数据在单机上处理因为硬件资源限制,无法胜任
- 而一旦将单机版程序扩展到集群分布式来运行,将极大增加程序的复杂度和开发难度
- 引入MapReduce框架后,开发人员可以将绝大部分工作集中在业务逻辑的开发上,而将分布式计算中的复杂性交由框架来处理
自己写一个分布式的矿建
::需求::
统计大量的文本文件中的单词出现的次数
实现:hashmap key:单词 value:次数
- 程序放到哪个上面去运行?
- client如何将程序jar包放入DataNode?
- 如何让DataNode运行这个jar包?
- 程序如何读取这个block数据?
- Block有多个副本,如果直接去运行,那就是读了副本的个数?
- 如何排除重复?
- 是集群中所有的DataNode都要运行这个程序吗?造成资源的浪费。。
- 如何分配运行程序的DataNode个数?
数据统计的分配工作,最后将结果做累加
mr的简单框架:
- 整个运算过程需要分为两个阶段,不同的阶段需要开发不同的程序
阶段一:并行局部运算 :逻辑分片处理
阶段二:结果的汇总
汇总是否能并行执行?
分配多个机器做汇总工作,并行处理是可以的 - 阶段之间的调度(两块是否并行完成,还是一个一个完成)yarn
- 业务程序(task)如何分发到集群,如何启动(job)
- 如何监控task程序的运行状态,如何处理异常
这些问题是开发分布式程序会面临的问题,完全可以把这些封装成框架:mapredeuce
客户端程序:用来提交task程序
编辑程序并达成包 如:wc.jar
- 客户端程序拿到jar包,封装成一个资源
- 提交这个jar包到DataNode(启动socket client发送)
- DataNode都有一个进程 假如为:worker(socket server)来收集资源
- 接受完毕之后,向worker返回一个状态,告知client已经接受完毕
- 由客户端来启动DataNode中de wc.jar,发送一个命令给worker来启动
mr 的复杂框架
Java -cp wc.jar Myclient
(封装)wc.jar:
myclient:负责启动MapReduce,设置任务的属性等
appMater(主管):负责调度
两个阶段
- maptask(实现wcmapper.map())、
- reducetask(实现wcreducer.reduce())
客户端提交运行:收集起来
如何分发:将jar放到HDFS上去 /jobs/jobid/wc.jar
使得所有机器都可以去HDFS去取资源
怎么调度恰当的DataNode个数:Master:resourcemanager
datanode中的Worker:nodemanager
流程(job提交):
- 客户端提交任务(job)到rm resourceManager会将Job放入等待队列中
- 返回jobID,返回path
- 客户端将资源上传到HDFS中的存放目录中
- 分配 一个资源到nodemanager ,nodemanager 去HDFS上将wc.jar 拿下来
拿到jar包之后向client发送消息
客户端发命令给nodemanager - ~发送一个命令给nodemanager ,nodemanager启动一个appMater(负责阶段间的调度)向resourceManager发送请求(其中申请多少maptask,是client客户端给的),申请内存~
- 计算的时候做数据分片(逻辑概念),将task分了一个待处理的范围(如处理0-100 偏移量和数据长度)
- nodemanager 怎么到获取任务?job会把需要参与的节点记录到描述信息里面
nodemanager发送心跳,查询自己分配到的任务 resourManager返回任务列表 - 分配到待处理任务的列表的worker,去HDFS上将jar包拿出来
- 由谁启动maptask任务? appMaster向worker发送命令 附带待处理数据的路径
- 客户端程序确定需要多大的并行度
map阶段的并行度的计算:
客户端首先看一下待处理数据目录下的数据量
循环遍历:对每个文件来做
看文件有多少block
将block数量累加到计数器
返回一个任务规划描述文件:切片的大小
appmaster 解析分片
job.split
Split0 : /data/a.txt 0-128
Split1::/data/a.txt 128-256
Split8:…… - 将切片文件放到HDFS中
- appmaster 发送命令来让worker启动
reducetask和maptask可以并行运算
appMaster监控状态信息,只要处理完一个片就反馈一个信息到reduceMaster - reduceMaster收集所有数据,开始计算
input (输入)
split(拆分)
Map(映射)
shuffle(派发)
reduce(缩减)
- client
- 用户编写的MapReduce程序通过client提交到jobTracker端
- 用户可以通过client提供的一些接口查看作业运行状态
- JobTracker
- jobTracker负责资源监控和作业调度
- job监控所有TaskTracker与job的健康状况,一旦发现失败,就将相应的任务转移到其他节点
- jobTracker会跟踪任务的执行进度,资源使用量等信息,并将这些信息告诉任务调度器(TaskSchedule),而调度器会在资源出现空闲时,选择适合的任务去使用这些资源
- TaskTracker
- TaskTracker 会周期性地通过“心跳”将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker 发送过来的命令并执行相应的操作(如启动新任务、杀死任务等)
- TaskTracker 使用“slot”等量划分本节点上的资源量(CPU、内存等)。一个Task 获取到一个slot 后才有机会运行,而Hadoop调度器的作用就是将各个TaskTracker上的空闲slot分配给Task使用。slot 分为Map slot 和Reduce slot 两种,分别供MapTask 和Reduce Task 使用
- Task
- Task 分为Map Task 和Reduce Task 两种,均由TaskTracker 启动