您的位置:首页 > 其它

MapReduce概念详解

2020-04-07 12:15 1081 查看

数据处理能力提升的两种路线:
1.单核CPU从单核到双核到四核八核,
2分布式并行编程
随着 CPU制作工艺达到天花板,现在分布式并行编程有了发展,分布式并行编程就是借助一个集群通过多台机器同时处理大规模数据集。
谷歌提出了mapreduce,apache做了开源实现,一个HDFS和Mapreduce合称为MapReduce,谷歌提出之前实际也有分布式并行编程

MapReduce优点:
每个节点都拥有自己的内存,自己的储存空间,一个节点出现问题不会影响其他的,所以容错性方面提升很多
MapReduce新增节点硬件价格友好很多,不需要刀片服务器,PC机就行,扩展性好很多
MapReduce自动实现分布式部署,学习难度低很多
MapReduce适用于非实时的批处理以及数据密集型应用

MapReduce处理步骤:MapReduce被简单抽象成Map函数和Reduce函数(采用Divide and Conque),把大数据集切成非常多的独立的小分片,为每一个分片单独启动一个map任务,多个map任务同时并行处理

MapReduce理念:
计算向数据靠拢:先选一些节点作为Map机器,执行Map任务,reduce的时候,选一些机器作为reduce机器,它就找离自己最近的map节点去完成任务,理想情况是map,和reduce在一台机器上完成,这样做减少了网络传输开销,大大提升了分布式程序处理性能
(数据向计算靠拢:要完成一次数据分析时,选择一个计算节点,把运行数据分析的程序放到计算节点上运行,把需要的数据从不同节点上拉过来,传到计算发生的地方)

MapReduce架构:
主从架构,一个Master服务器——作业跟踪器JobTracker——负责整个作业的调度以及失败和恢复
若干个slave服务器——负责具体执行任务的组件TaskTracker——负责解愁JobTracker给他发的作业处理指令完成具体的任务处理

MapReduce语言支持:
Java开发的,支持多种语言,一般用Java

Map函数:
输入键值对<k1,v1>内容是<“List”,“a,b,c”>,输出一个List(<k2,v2>)内容是<“a”,1><“b”,1><“c”,1>
Reduce函数:
输入一个键值对列表,输出汇总求和,就是词频统计那个reduce
输入键值对<k1,v1>内容是<“a”,“1,1,1”>,输出<“a”,3>

MapReduce体系架构:
Client构建需求,发送给JobTracker,JobTracker负责资源监控和作业调度,监控TaskTracker和当前任务的健康,一旦探测到失败就把这个任务转移到其他节点继续做,他通过发送给任务调度器TaskScheduler来实现具体分配给哪个TaskTracker,TaskScheduler是一个可插拔模块,可以自己编辑调度模块,TaskTracker负责执行具体任务,同时把任务运行进度通过心跳方式传回JobTracker,TaskTracker使用一种槽的概念(slot)把所有CPU内存资源进行打包,然后把CPU资源等分成很多个slot,slot分为两种,一种是map类型的slot处理map任务,一种是reduce类型的slot处理reduce任务,这里有个问题就是游客可能mapslot空着reduceslot却占满了,在hadoop2.0被修复。Task组件,一种Map任务,一种reduce任务,两种任务可以在同一个机器上运行

MapReduce工作流程
先把把大数据集切成非常多的独立的小分片split,为每一个分片单独启动一个map任务,分很多区,然后发送到reduce()中,分多少区一般取决于有多少个reduce任务机器多少个reduce任务数量,每个map输出都需要进行分区分给相应的reduce任务,对每个map输出进行排序归并合并的过程就叫做shuffle,shuffle完了把结果发给reduce,最后输出到分布式文件系统中。不同的map任务之间不会进行通信,不同的reduce任务之间不会进行通信。

MapReduce各个执行模块
一个节点里,首先有InputFormat对输入格式进行验证,然后切片,只是逻辑切分并不是真的切分了,然后Record Read简称RR记录阅读器,根据分片的位置长短去HDFS找到各个块把相关分片读出来,作为Map任务的输入,map任务输出输出这些键值对,写入对于每一个map任务都有的一个默认的缓存,一般100M,溢写给磁盘(每完成100M就把缓存中这些写道磁盘里),写出磁盘的寻址开销是很大的,所以集中一批一次性写入磁盘,这样一次寻址就能完成整批数据的写入(这是缓存的作用),但是map任务在溢写时还在执行,这样容易造成map任务没地方输出,数据丢失,所以一般设置一个溢写比0.8,溢写要拍讯分区合并完了才写到磁盘里,这个合并是Conbine不是Merge,是为了减少写到磁盘里的数据量,<“a”,1><“a”,1>会conbine变成<“a”,2>,合并操作不是必须的,需要手动启动,慎用,多个溢写文件最终在整个map任务结束前系统会进行归并,形成一个大文件里面的键值对都是分区的排序的,归并可以设置门槛值,Jobtracker会监测map任务,发现大文件形成了map任务已经写完数据了就会通知相应的reduce任务数据拉走,这就完成了map端的shuffle过程,reduce端把数据都拉到reduce的机器上,拉过来肯定要先归并再合并,归并就是把<“a”,1><“a”,1>生成一个<“a”,(1,1)>,如果map端shuffle没有conbine,这面就会归并,多个溢写文件也会归并成几个大的文件,传给reduce任务处理传给,这就完成了reduce端的shuffle过程,OutputFormat对它的输出格式进行检查,看输出相关目录是否存在等,然后写到HDFS中
split是逻辑切片,可以横跨block,一般多数采用一个block大小(一般63M或128M)作为分片大小,如果split横跨了block,那么map任务在一个block上,要是另外一个block不在这台机器上,就得把另外一个block上的数据传过来了。这就涉及额外数据传输开销了。map的数量由产生的分片数量决定,reduce的数量一般取决于集群中可用的reduce slot的数目

  • 点赞
  • 收藏
  • 分享
  • 文章举报
try to stay simple 发布了38 篇原创文章 · 获赞 0 · 访问量 1712 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: