Hadoop 学习之——HDFS
HDFS是HADOOP中的核心技术之一——分布式文件存储系统。Hadoop的作者Doug Cutting 和Mike 是根据Google发布关于GFS 的研究报告所设计出的分布式文件存储系统。
一、HDFS设计的前提或者假设有6个:
- 硬件错误是常态而不是异常。对于普通的每台机器来说,出现故障可能并是是常事,但HDFS可能由成千上万的机器组成,在这中情况下发生硬件错误就变成非常正常的事情。为了能够正常的工作,HDFS要能处理或者容忍这些硬件错误。所以对HDFS 来说硬件错误是常态而不是错误。
- 流式数据访问,运行在HDFs上的应用主要是以流式数据读取为主,做批处理而不是用户交互处理,因此,HDFS更关注数据访问的高吞吐量。
- 大规模数据集。HDFS 典型的文件大小都在GB 级甚至是TB级。因此HDFS支持大文件存储。
- 简单一致的模型。HDFS 对应用程序需要的文档实行一次写,多次读的访问模式。文件一经创建、写入和关闭后就不需要再更改了。
- 移动计算比移动数据更划算。对于大文件来说,移动计算的代价要比移动小的多。这样可以提高执行的效率同时也减小了网络拥塞和提高系统吞吐量
二、HDFS的体系结构
HDFS是一个主/从结构(Master 和Slave ),包括一个NameNode 和多个DataNode ,NameNode负责管理系统的元数据,DataNode 存储实际的数据。客户端通过NameNode和DataNode的交互访问文件系统。客户端通过NameNode获取文件的元数据,而真正的文件I/O操作是直接和DataNode 进行交互。
NameNode负责管理文件系统的命名空间,记录文件块在每个DataNode上的位置和副本信息,协调客户端对文件的http://i.cnblogs.com/EditPosts.aspx?opt=1访问,记录命名空间内的改动或命名空间本身属性的变化。DataNode则负责所在物理节点傻瓜你的存储管理。
HDFS的数据都是“一次写入、多次读取”,典型的块的大小是64MB,HDFS文件通常被切分成64MB 的数据块(Block),每个数据块尽可能的分散的存储在不同的DataNode中。NameNode执行文件系统命名空间操作,比如打开,关闭、重命名文件和目录,还决定数据块到DataNode的映射。DataNode负责处理客户端的读写请求,依照NameNode的命令,执行数据的创建、复制、删除等操作。
假如客户端要访问一个文件,首先客户端先从NameNode获取到组成在文件的数据块的位置列表。即知道数据块被存储在哪些DataNode上 ;然后客户端直接从DataNode上读取文件数据。此过程中NameNode不参与文件的传输。
HDFS典型的部署是在一个专门的机器上运行NameNode,集群上其他机器各运行一个或多个DataNode。也可以在运行NameNode的机器上运行DataNode。NameNode使用事务日志(EditLog)来记录HDFS元数据的变化,使用映像文件(FsImage)存储文件系统的命名空间,包含文件的映射、文件的属性等。日志事务日志和映像文件都存储在NameNode的本地文件系统中,NameNode启动时,从磁盘中读取映像文件和事务日志,把事务日志的事务都应用到内存中的映像文件傻瓜你,然后将新的元数据刷新到本地磁盘的映像文件中,这样可以截去旧的事务日志,这个过程成为检查点(checkpoint)。
从上面的描述中可以看出NameNode是整个文件系统的核心,而且他只运行在一台机器上,那么如果这个机器挂掉,那整个文件系统都会崩溃。于是就存在了Secondary NameNode 节点,Secondary NameNode 周期地将事务日志(EditLog)中记录的对HDFS的操作合并到一个checkPoint中,然后清空EditLog 。所以Namenode重启就会载入最新的CheckPoint,并replayEditLog中记录的hdfs的操作。保证了HDFS 系统的完整性。
三、保障HDFS可靠性措施
HDFS设计的主要目标就是在故障情况下也能保证数据存储的可靠性,他主要从一下几个方面保证:
- HDFS将每个文件存储成一系列数据库,默认大小问64MB(可以配置) 。为了容错,文件的所有数据块都会有副本(副本个数即副本因子,可配置)。当DataNode启动时,会遍历本地文件系统,产生HDFS数据块和本地文件对应关系的列表,并发给NameNode ,这就是块报告,他上面包括了DataNode 上所有的块列表。
- HDFS集群一般运行在多个机架上。不同机架的通信需要通过交换机,当复制因子是3时,HDFS的部署策略将一个副本放在同一个机架的另一个节点,一个副本存放在本地机架的节点。最后一个存放在不同机架上的节点。即保证了数据的可靠和可用,又减少了通信压力保证性能。
- 心跳检测,NameNode 周期的从DataNode接受心跳包和块报告。收到心跳包说明该DataNode正常工作。如果最近一段时间没有发送,NameNode 会标记他为宕机,然后不会发给他们任何新的I/O请求。DataNode宕机会造成数据块的副本数量下降。NameNode 会检测这些需要复制的数据块,并在需要的时候进行复制。
- 安全模式:系统启动时,NameNode进入到一个安全模式。此模式不会出现数据块的写操作,NameNode会接收各个DataNode 拥有的数据块的报告,由此,NameNode 可以获得所有数据块的信息。数据块达到最小副本要求时,该数据块被认为是安全的。在被确认是安全后,在等待若干时间,会自动推出安全模式。当检测到副本数不足的数据块,该块会被复制到其他数据节点,一达到最小副本数。
- 数据块完整性检测:客户端软件实现了对HDFS 文件内容的校验和检查。在文件创建是,会计算每个数据块的校验和。并价格你校验和作为一个单独的隐藏文件保存在命名空间下。当客户端获取文件后会计算数据块的校验和,并与隐藏文件中的校验和比较。如果不同则认为有损坏
- 空间回收:文件被用户删除后,并不是立即从HDFS中移除,而是把它移动到/trash目录中。只要在这个目录下就可以快速恢复。文件在/trash中的时间可以配置,超过这个时间就会被自动删除。
- 保留多个映像文件和事务日志的副本:任何对映像文件和事务日志的修改都将同步到他们的副本中。当NameNode重新启动时,总是选择最新的NameNode和DataNode。