a) HDFS是通过读取主节点元数据信息,通过元数据信息寻找到数据块所在的位置,从而再次去子节点位置读取文件内容,这样子能够达到更高效率的写入和读取效率
b) HDFS能够很好的将数据负载均衡分布在集群的各个机器中,因此理论上,无论多大的数据都能完整的存放。
c) HDFS能够保证数据的可靠性,其主动备份3份或以上的数据,并且能够实时监测每一个节点的运行情况,当某一个子节点宕机后能够很快的察觉并进行数据迁移和从新备份。
d) HDFS设计之初就是作为分布式存储,而MapReduce设计初衷也是作为分布式计算,所以HDFS和MapReduce能够很好的结合在一起,完成分布式存储和分布式计算的任务。
e) HDFS有一个很实用的webUI界面负责监控这个HDFS情况。
f) HDFS能够很好的和其它框架相连接[19-22]。比如亚马逊的Amazon S3分布式文件系统,比如传统型数据库Oracle,Mysql都能把数据安全迁移到HDFS上。
理解HDFS存储机制,首先要理解HDFS块的概念,HDFS存储大文件的时候首先是按字节进行切分,每一个块默认切分大小是128MB,如此,一个大文件就会被切分为一个个128MB的块文件,如果文件小于128MB,这个文件是不会被切分的,而是作为一个单独文件存储,而且这个文件不会占据整个块的空间。
在HDFS文件系统中,使用文件块能够解决很多问题,最重要的是,一个大数据文件被分块后能够存放于任何小于块大小的磁盘空间中,而且分块后能够很好的对块文件做备份,提高分布式文件系统的可靠性和容错性。
如图2.1是HDFS的整体架构,HDFS文件系统中负责存储文件的节点都是datanode,负责顶层操作控制这个HDFS运行的节点是Namenode;datanode和namenode是以工作者-管理者的模式运行的,简单的说明,就是一个namenode管理多个datanode,namenode负责监控子节点的运行情况,并随时做出调整。
HDFS整体架构中,Namenode节点负责管理元数据信息,存储了子节点中所有信息的元数据信息,包括HDFS文件系统树结构信息,及树结构下的所有块文件的信息(存储目录,块大小,存储地址,备份信息等),上传新的文件时候,namenode负责分配新的存储地址,并调用子节点datanode进行存储,client下载的时候首先访问namenode寻找所下载文件的元数据信息,然后根据namenode反馈的元数据信息到相应的子节点进行下载,以完成client的读写请求。
图 2.1 HDFS整体架构
2.2 分布式计算MapReduce
Hadoop的另外一个底层架构是MapReduce。MapReduce是作为一个计算框架对存放在HBase,HDFS,Hive表中的数据进行分布式计算。开发MapReduce程序不需要深入理解hadoop的底层框架,只需要按开发要求实现mapper函数和reduce函数,mapper函数和reduce函数均是类似于map的<key,value>格式进行传输的。其中map输出的是<k2,v2>,reduce读取map输出的值。然后输出的是<k3,v3>。一个MapReduce的工作流程如图2.2所示。
MapReduce程序详细的执行过程如下所示[19-21]:
第一步:map任务处理
(1) 读取输入文件内容,解析成key、value对。对输入文件的每一行,解析成key、 value对(一行内容解析成一个key-value)。每一个键值对调用一次map函数。一千行数据调用一千次map函数。
(2) 编写自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
(3) 对输出的key、value进行分区partition。
(4) 对不同分区的数据,按照key进行排序、分组。相同key的value放到一个集合中。