HDFS是Hadoop的分布式文件系统,全称为Hadoop DistributedFilesystem,是Hadoop的核心内容。HDFS的设计思想来自于Google的GFS,是GFS其开源实现。
学习HDFS先要知道其设计的目地。HDFS的设计目标是以流式数据访问来存储超大文件,系统运在商用硬件集群上,总的来说,其设计主要有以下几方面的考虑:(1)存储超大文件,存储的文件为TB,甚至PB级。(2)流式数据读取,一次写入多次读取,是最高效的访问模式。系统主要考虑的是大规模流式读取的效率,HDFS只允许对一个一打开的文件顺序写入,还可以在现有文件的末尾追加数据,他不支持在文件末尾以为的其他位置追加数据。所以已经能够写入的文件就不能再修改,只能删除后重新写入。(3)商用硬件,hadoop设计运行在普通的廉价的商用PC上,组件失效被认为是常态时事件,所以系统必须集成持续的监控、错误侦测、灾难冗余及自动回复机制。(4)数据访问的延迟高,因为HDFS是设计用于大吞吐量数据的,这是以一定的延时为代价的,HDFS是单Master的,所有的文件请求都要经过它,请求较多时延迟增大。(5)文件数受限,NameNode将文件系统的元数据存储在内存中,因此文件系统所能存储的文件总数受限于NameNode的内存容量。还有一个问题就是,因为Map task的数量是由splits来决定的,所以用MR处理大量的小文件时,就会产生过多的Maptask,线程管理开销将会增加作业时间。举个例子,处理10000M的文件,若每个split为1M,那就会有10000个Maptasks,会有很大的线程开销;若每个split为100M,则只有100个Maptasks,每个Maptask将会有更多的事情做,而线程的管理开销也将减小很多。(6)不支持多用户写入,也不支持任意修改文件。
下面介绍HDFS的几个概念:
(1)数据块:HDFS的块大小默认为64MB。设置这么的数据块,可以最小化寻址开销。
(2)NameNode:管理文件系统的命名空间,它维护着文件系统树及整棵树内所有的文件和目录,这些信息以两个文件形式永久保存在本地磁盘上,命名空间镜像文件和编辑日志文件。NameNode还记录着每个文件中各个块所在的数据节点信息,但是它不保存块的永久位置信息,这些信息会在系统启动时由数据节点重建。
(3)DateNode:文件系统的工作点。根据需要存储或是检索数据块。
单一的NameNode简化了系统的设计,但是这也是系统的瓶颈,没NameNode,系统将无法进行使用,因此对于NameNode的容错非常重要。Hadoop为NameNode容错提供了两种机制,一是备份那些组成文件系统元数据持久状态的文件,将持久状态写入磁盘的同时写入一个远程挂载的网络文件系统。二是运行一个辅助NameNode。要减少对于NameNode的读写等操作,防止NameNode成为系统的瓶颈。
HDFS的数据流,客户端与HDFS的数据交互过程:
客户端读取HDFS中的数据过程:
客户端写入数据的过程:
详细过程这里不再多做叙述了。有兴趣的可以自己查阅资料,《Hadoop权威指南》一书有详细描述。