hadoop体系结构

Hadoop体系结构

HDFS和MapReduce是Hadoop的核心,Hadoop就是靠HDFS来实现分布式存储的支持,通过MapReduce来进行并行计算处理。

HDFS体系结构

HDFS采用了主从结构模型即采用Master-Slaver模式,HDFS集群是有一个NameNode和多个DataNode组成的。 NameNode中心服务器(Master):维护文件系统树、以及整棵树内的文件目录、负责整个数据集群的管理。

DataNode分布在不同的机架上(Slaver):在客户端或者NameNode的调度下,存储并检索数据块,并且定期向NameNode发送所存储的数据块的列表。

机架:HDFS集群,由分布在多个机架上的大量DataNode组成,不同机架之间节点通过交换机通信,HDFS通过机架感知策略,使NameNode能够确定每个DataNode所属的机架ID,使用副本存放策略,来改进数据的可靠性、可用性和网络带宽的利用率。

数据块(block):HDFS最基本的存储单元,默认为64M,用户可以自行设置大小。

元数据:指HDFS文件系统中,文件和目录的属性信息。HDFS实现时,采用了 镜像文件(Fsimage) + 日志文件(EditLog)的备份机制。文件的镜像文件中内容包括:修改时间、访问时间、数据块大小、组成文件的数据块的存储位置信息。目录的镜像文件内容包括:修改时间、访问控制权限等信息。日志文件记录的是:HDFS的更新操作。

NameNode启动的时候,会将镜像文件和日志文件的内容在内存中合并。把内存中的元数据更新到最新状态。

用户数据:HDFS存储的大部分都是用户数据,以数据块的形式存放在DataNode上。

在HDFS中,NameNode 和 DataNode之间使用TCP协议进行通信。DataNode每3s向NameNode发送一个心跳。每10次心跳后,向NameNode发送一个数据块报告自己的信息,通过这些信息,NameNode能够重建元数据,并确保每个数据块有足够的副本。 hdfs体系结构图

MapReduce的体系结构

  • 分布式编程架构

  • 以数据为中心,更看重吞吐率

  • 分而治之(把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后整合各个节点的中间结果得到最终的输出)

  • Map把一个任务分解成多个子任务

  • Reduce将分解后的多任务分别处理,并将结果汇总为最终的结果

也采用了Master-Slaver结构。

4个实体:

  • Client

  • JobTraker

  • TaskTraker(任务节点)

  • HDFS(输入、输出数据、配置信息等) 作业(Job):在Hadoop内部,用Job来表示运行的MapReduce程序所需要用到的所有jar文件和类的集合,这些文件最终都被整合到一个jar文件中,将此jar文件提交给JobTraker,MapReduce程序就会执行。

任务(Task):MapTask和ReduceTask

键值对(key/value pair)

Map()、Reduce()函数的输入、输出都是<key,value>的形式

HDFS存储的输入数据经过解析后,以键值对的形式,输入到MapReduce()函数中进行处理,输出一系列键值对作为中间结果,在Reduce阶段,对拥有同样Key值的中间数据进行合并形成最后结果。 生命周期: 1.提交作业

-在作业提交之前,需要对作业进行配置;

-程序代码,主要是自己编写的MapReduce程序;

-配置输入输出路径、输出是否压缩;

-配置完成后,通过JobClient来提交;

作业调度算法:

FIFO调度器(默认)、公平调度器、容量调度器

2.任务分配

-TaskTracker和JobTracker之间的通信与任务的分配是通过心跳机制完成的;

-TaskTracker会主动向JobTracker询问是否有作业要做,如果自己可以做,那么就会申请到作业任务,这个任务 可以使Map也可能是Reduce任务;

3.任务执行

-TaskTraker将代码和配置信息到本地;

-分别为每一个Task启动JVM运行任务

4.状态更新

-任务在运行过程中,首先会将自己的状态汇报给TaskTracker,然后由TaskTracker汇总告之JobTracker;

-任务进度是通过计数器来实现的;

-JobTracker是在接受到最后一个任务运行完成后,才会将作业标志为成功。 image

借鉴https://blog.csdn.net/u013063153/article/details/53114989

MapReduce数据流图

用户自定义map函数接收一个输入的key/value,然后产生一个集合,MapReduce把所有相同的key的值的value组成一个集合。reduce合并这些value值。通常我们通过一个迭代器把value值提供给reduce,这样就可以处理无法全部放入内存的大量数据。

猜你喜欢

转载自my.oschina.net/u/3798913/blog/1800720