在了解了Hadoop的组建以及底层框架之后我们知道,Hadoop的底层是通过HDFS进行数据的存储,将数据存储到集群中然后调用其中的数据进行相应的计算,那么问题来了,谁来进行计算的操作呢?这个就是Hadoop的另外一个底层框架,也就是MapReduce,他在集群的作用就是负责进行数据的处理过程
为什么要使用mapreduce呢?因为mapreduce的核心是将用户编写的业务逻辑代码和自带的默认组件融合成一个完整的分布式应用程序然后提交到集群中进行处理,而大量的数据在单一的机器上进行运行是不可能的,硬件的限制决定了它根本完不成这个艰巨的任务,而且如果将一个单机的应用程序发放到一个集群中来分布式处理,那么势必会增加程序的复杂度和开发的难度,所以,综上考虑之后,引入了mapreduce计算框架,将分布式计算的复杂度交给框架来处理,开发人员就可以集中精力子业务逻辑上
MapReduce主要由JobTracker和TaskTracker(JobTracker负责资源管理和作业控制,TaskTracker负责任务的运行)组成,但在运行的过程中主要分为map和reduce两个阶段,map阶段就是将从jobtracker传入tasktracker的计算任务进行分解,分成一个个的小块,每一个小块都是以键值对的方式存在。对于多个map人物的输出,按照不同的分区copy到不同的节点上,然后根据键的值对map便利之后的键值对数据进行reduce聚合,相同键的放到一个reduce节点上(一般的map和reduce不在同一个节点上),然后对于reduce的输出的键值对写入HDFS中,但是在map和reduce的操作额过程中间会产生shuffle操作,将map分解后的数据先根据key进行分区,相同的key的值分配到一个分区中合并成一个文件,reduce去map段拉取的数据也是已经分区成一个个k-v格式的文件
MapReduce的运行过程
Map端:程序会根据inputFormat将输入的文件分割成splits,每一个splits会作为一条数据输入到maptask中,在经过map处理后会被存放到maptask的内存缓冲区中,并进行相应的分区,但是因为内存缓冲是有限制的(默认为0.8),当达到这个限制后,会将内存中的数据溢写到磁盘中,但是这个过程不会影响map结果的继续写入缓冲区,在溢写的过程中,会根据Key进行排序并将写入磁盘的数据合并成多个不同key的溢写文件,
Reduce端:当map的最终结果数据生成之后,每生成一条就会传入一个相应的reducetask中,当所有的map task执行完毕后也传入了reduce task中,reduce启动,进一步对数据根据key进行合并,最终将最后的计算机过输出到HDFS中
虽然MapReduce解决了对于大量数据的计算问题,但是依旧存在很严酷的问题,第一就是单点故障:因为mapreduce是有jobtracker从客户端拉取数据的,一旦jobtracker挂掉,那么整个集群与client的交互就会失效,那个整个作业也就会挂掉,任务执行失败。第二内存的硬件限制, JobTracker既负责资源管理又负责作业控制,当作业增多时,JobTracker内存是扩展的瓶颈,有限的资源会影响集群的运行效率。最后就是mapreduce 的计算机制决定了他需要在maptask执行完毕之后才会如致性reducetask,这一段时间,reduce一直处于空闲状态,却还需要占用资源,因为他需要拉取map端的数据,所以就造成了资源的空闲浪费。
对于mapreduce,最经典的应用就是wordcount案例
1、对于传入的数据先经过map操作转变成键值对的形式并存储在分区中
2、通过reduce操作,根据key合并成一个单独的文件
作者:马六九
链接:https://www.jianshu.com/p/ced362f585b1
共同学习,写下你的评论
评论加载中...
作者其他优质文章