实际生活中的数据量是非常庞大的,采用单机运行的方式可能需要若干天才能出结果,这显然不符合我们的预期,为了尽快的获得结果,我们将采用分布式的方式,将计算分布到不同的机器上。Mapreduce就是一个典型的分布式框架,Hadoop则是用java编写的一个Mapreduce实现。
分布式和并行的区别在于分布式它将数据分布到不同的机器上,而并行只是将数据分布到同一簇中的不同节点上,它们的区别主要体现在物理载体层面上。
MapReduce
MapReduce在大量节点组成的集群上运行。它的工作流程是:单个作业被分成很多小份,输入数据也被切片分发到每个节点,各个节点只在本地数据上做运算,对应的运算代码称为mapper,这个过程被称为map阶段。每个mapper的输出通过某种方式组合(一般还会做排序)。排序后的结果再被分成小份分发到各个节点进行下一步的处理工作。第二步的处理阶段被称为reduce阶段,对应的运行代码被称为reducer,reducer的输出就是程序的最终执行结果。
Mapreduce在进行数据分配的时候,为了避免一个节点宕机,而导致整个程序出错,它对同一份数据进行了多次备份并将它分配到多个节点上,这样就能避免一个节点宕机所带来的影响。Mapreduce之所以能够知道某个节点出错了,是因为它有一个主控节点,它管理了当前的所有的节点,通过主控节点与其他节点的通信我们就可以知道当前其他节点的状态。这里我们需要注意的是虽然主控节点可以与其他节点进行交流,但是其他节点之间是不能进行交流的,map任务之间不进行交流,reduce任务之间也不进行交流。
MapReduce优缺点:
优点:可在短时间内完成大量工作。
缺点:算法必须经过重写,需要对系统工程有一定的理解。
适用数据类型:数值型和标称型数据。
Hadoop不仅可以进行分布式计算,而且它还具有分布式文件系统, 它是Mapreduce框架的一种java实现。Hadoop流就像linux中的管道一样,它能够将前一个命令的输出作为下一个命令的输入。也就是数据像流水一样在不同命令之间进行传递。Mapreduce中的数据需要从mapper流到sort,然后再到reducer,这符合Hadoop流的概念。
HDFS和MapReduce基本架构
HDFS和MapReduce是Hadoop的两大核心,它们分工也非常明确,HDFS负责分布式存储,而MapReduce负责分布式计算。
1、HDFS采用了主从(Master/Slave)的结构模型,一个HDFS集群是由一个NameNode和若干个DataNode组成的,其中NameNode作为主服务器,管理文件系统的命名空间(即文件有几块,分别存储在哪个节点上等)和客户端对文件的访问操作;
2、集群中DataNode管理存储的数据。HDFS允许用户以文件的形式存储数据。从内部来看,文件被分成若干数据块,而且这若干个数据块存放在一组DataNode上。
3、NameNode执行文件系统的命名空间操作,比如打开、关闭、重命名文件或目录等。它也负责数据块到具体DataNode的映射。
4、DataNode负责处理文件系统客户端的文件读写请求,并在NameNode的统一调度下进行数据块的创建、删除和复制工作。HDFS的体系结构如下:
MapReduce也是采用Master/Slave的主从架构,MapReduce包含4个组成部分,分别为Client、JobTracker、TaskTracker和Task,其架构图如下:
1、Client:每个Job都会在用户端通过Client类将应用程序以及配置参数Configuration打包成JAR文件存储在HDFS中,并把路径提交到JobTracker的Master服务,然后由Master创建每一个Task(即Map Task和 Reduce Task)将它们分发到各个TaskTracker服务中去执行。
2、JobTracker:JobTracker负责资源监控和作业调度。JobTracker负责监控所有TaskTracker与Job的健康状况,一旦发现失败,就将相应的任务转移到其它节点;同时,JobTracker会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器,而任务调度器会在资源出现空闲时,选择合适的任务使用这些资源。在Hadoop中,任务调度器是一个可插拔的模块,用户可以根据自己的需求设计相应的调度器。
3、TaskTracker:TaskTracker会周期性地通过Heartheat将本节点上的资源使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker发送过来的命令并执行相应的操作(如启动新任务、杀死任务等)。TaskTracker使用“slot”来衡量划分本节点上资源量。"slot"代表单位的计算资源(CPU、内存能),一个Task获取到一个slot后才有机会运行,而Hadoop调度器的作用就是讲各个TaskTracker上空闲的slot分配给Task使用。slot分为Map slot和Reduce slot两种,分别供Map Task和Reduce Task使用。TaskTracker通过slot的数目(可配置参数)限定Task的并发度。
4、Task:Task分为Map Task和Reduce Task两种,均有TaskTracker启动。HDFS以固定大小的block为基本单位存储数据,而对于MapReduce而言,其处理单位是split。
从上面的描述可以看出,HFDS和MapReduce共同组成了HDFS体系结构的核心,HDFS在集群上实现了分布式文件系统,MapReduce则在集群上实现了分布式计算和任务处理。HDFS在MapReduce任务处理过程中提供了对文件操作和存储等的支持。而MapReduce在HDFS的基础上实现任务的分发、跟踪和执行等工作,并收集结果,两种相互作用,完成了Hadoop分布式集群的主要任务。
参考资料:
1、https://www.cnblogs.com/whatyouknow123/p/7526383.html
2、https://www.cnblogs.com/shaosks/p/9440848.html