(5)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的读写请求。
HDFS整体架构源'自-优尔;文,论`文'网]www.youerw.com
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放到一个集合中。
(5)(可选)分组后的数据进行归约Combiner。
第二步:reduce任务处理
(1)对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。一个parttition输出到一个reducer,不同parttion输出到不同reducer。
(2)对多个map任务的输出进行合并、排序。写reduce函数自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
(3)把reduce的输出保存到文件中。
图2.3中所对应的blick就是HDFS上面的块文件,在hadoop2版本默认设置128MB为一个块,默认一个切片split对应一个块block,但是,切片大小也可以自己设置,根据hadoop的MapReduce源码可以看出来,决定切片split大小是有FileInputFormat类中的long splitSize=computeSplitSize (blockSize,minSize,maxSize)有三个参数决定,其中blockSize=134217728字节=128M,maxSize =2的63次幂-1;computeSplitSzie方法return Max.max(miniSize,Max.min(maxSize,blocSize)); minSize=1,maxSize<blockSize,所以,默认splitSize=128Mb。尽量使用默认大小128M,一个block对应一个split对应一个map,可以避免不同datanode之间的网络传递。一个切片split对应一个map,所以只要知道有多少个切片split就知道启用多少个map。