肖郅庆 陕西科技大学
Hadoop能够处理PB级的数据量,可以运行在普通机器组成的集群上并且具有高容错性,其创始人是Doug Cutting。
HDFS即Hadoop分布式文件系统,源自GFS。与传统的文件系统类似,HDFS也有块概念,不过这个块要大得多,默认为64MB。HDFS把一个文件分几个数据块来存储,数据以块为单位分布在集群的服务器上。
一个标准的HDFS集群由一个NameNode、一个Secondary NameNode和一些DataNodes组成。
NameNode用来存储系统的元数据,管理DataNodes。在NameNode上有两个重要的文件——fsimage和edits。fsimage是HDFS元数据的磁盘备份,而edits是对事务的记录。edits的作用是,NameNode接受应用程序的请求后并不直接对数据进行操作,而是把相应的事务记录到edits中,待一定时间后统一操作,这样可以减少I/O从而节约时间。NameNode启动后,会加载fsimage到内存中,然后按照edits的记录执行事务,这样就可以获得上次停机时的数据集了。
Secondary NameNode协助处理NameNode的事务日志。上段说NameNode会把事务写入edits,但这存在一个问题,就是随着开机时间的延长,edits会越来越大并且NameNode服务器重启后恢复数据所花费的时间也会延长。这时我们引入Secondary NameNode来解决该问题。当edits文件增长到一定大小后,NameNode就启用新的edits文件,记为edits.new。Secondary NameNode把NameNode上的fsimage和edits复制到本地,然后对fsimage执行edits上的事务。Secondary NameNode用新的fsimage替换旧的fsiamge,并将新的fsimage送回NameNode。NameNode用新的fsiamge替换旧的fsimage,并将edits.new改名为edits。这样便解决了我们上面提出的问题。
DataNode是HDFS上存储数据块的地方。DataNode启动后会周期性的向NameNode报告其上所有的块信息,这被称为心跳。如果NameNode超过10分钟没有收到某DataNode的心跳,则认为该DataNode不可用。倘若一个DataNode不可用,那么其上的数据块也都丢失了吗?实际上在HDFS上默认每一数据块都有三份,并且它们分布在不同的DataNode上,所以若一个DataNode不可用了,也不会造成数据丢失。
MapReduce是一种编程模型,它分为两个函数:Map和Reduce。Map函数接受一对键值对输出一些中间键值对。MapReduce的库函数把具有相同中间键I的值收集成一组。Reduce函数接受中间键I和与之相应的一组值,并对这些值进行某种操作,最终输出中间键I和相应的值。
Hadoop MapReduce工作流程是这样的,MapReduce库函数先把用户程序的输入文件分割成n份,这n份文件块被分布到集群的各个计算机上。接着系统开始向具有文件块的节点分配map任务,map函数产生的中间键值对存储在本地磁盘上。Map阶段结束后,reduce阶段开始。系统首先分配reduce任务,然后通知它它所负责的中间数据块的位置。Reduce任务首先读取中间数据块,库函数对其进行融合,然后执行reduce函数。最后系统收集所有reduce函数产生的结果并把它们返回给用户程序。
本文对Hadoop的两个核心组件进行了简单的介绍。Hadoop是一个被企业广泛应用的大数据存储与处理的平台,随着大数据分析在企业生产过程中的作用越来越大,人才市场对掌握Hadoop等大数据处理技术的技术人才需求也越来越旺盛,于是本文便对Hadoop技术进行简单的介绍,希望对想要了解Hadoop技术的人提供帮助。
[1]Eric Sammer著.刘敏等译.Hadoop技术详解[M]. 北京:人民邮电出版社,2013.12.
[2]Jeffrey Dean, Sanjay Ghemawat. MapReduce: simplified data processing on large clusters[J/OL]. https://doi.org/10.1145/1327452.1327492,2008-01-01/2018-04-02