一、Hadoop Distributed FileSystem(HDFS)
1. HDFS的设计
HDFS时为以流式数据访问模式存储超大文件而设计的文件系统,在商用硬件集群上运行。
1.1 文件块(Block)
HDFS以块为单位保存文件,在Hadoop2.x版本中块的大小默认为128M(在hadoop1.x中64M,通过dfs.blocksize规定)。一个小于块大小的文件不会占据整个块空间。
1.1.1 如何确定HDFS中块的大小?
HDFS中块比磁盘大,目的是减少寻址开销,从而传输一个由多个块组成的文件的时间就取决于磁盘的传输速率。
如果块设计的太大,传输数据时间会增大;如果块设计的太小,会增加寻址时间。
块大小的设计原则:寻址时间为传输时间的1%
目前磁盘的传输速率普遍为100MB/s,若希望寻址时间在10ms以内,那么传输时间为1s,Block大小为100MB,取2的整数次幂得到128MB。
1.1.2 采用块的好处
- 减少了寻址时间,提高处理大文件的效率
- 一个文件可以大于网络中任意一个磁盘的容量,不需要存储在同一块磁盘上
- 简化存储管理(块的大小固定),元数据可以不与块一同储存。
- 便于提高系统的容错和实用性,方便复制
1.2 NameNode,Secondary NameNode & DataNode
HDFS集群有两种节点,以Master-Slave模式运行。
NameNode&Secondary NameNode
NameNode作用:管理整个文件系统的命名空间;配置副本策略;管理Block的映射信息;处理客户端读写请求
SeconaryNameNode作用:复制NameNode,定期合并Fsimage,Edits;辅助恢复NameNode
NameNode中并不保留Block的位置信息,而是DataNode启动后定期汇报。
工作机制:
- 第一阶段:NameNode启动
- 第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
- 客户端对元数据进行增删改的请求:NameNode先记录操作日志,更新滚动日志再内存中对数据进行增删改。
- 第二阶段:Secondary NameNode工作
- Secondary NameNode询问NameNode是否需要CheckPoint,返回NameNode是否检查结果。( 触发CheckPoint需要满足两个条件中的任意一个:1小时时间到和每隔一分种检查Edits中操作次数是否达到100万)
- 若需要CheckPoint则请求执行:
- NameNode滚动正在写的Edits日志,生成一个空的edits.inprogress,将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode;
- Secondary NameNode加载编辑日志和镜像文件到内存,并合并,生成新的镜像文件fsimage.chkpoint。
- 拷贝fsimage.chkpoint到NameNode,NameNode将fsimage.chkpoint重新命名成fsimage。
Secondary NameNode恢复NameNode的方法:
- 直接拷贝
- 使用
hdfs namenode -importCheckpoint
启动NameNode守护进程,从而将SecondaryNameNode中数据拷贝到NameNode目录中
集群安全模式:
- NameNode启动时,首先将镜像文件(Fsimage)载入内存,并执行编辑日志(Edits)中的各项操作。一旦在内存中成功建立文件系统元数据的映像,则创建一个新的Fsimage文件和一个空的编辑日志。此时,NameNode开始监听DataNode请求。这个过程期间,NameNode一直运行在安全模式,即NameNode的文件系统对于客户端来说是只读的。
- 系统中的数据块的位置并不是由NameNode维护的,而是以块列表的形式存储在DataNode中。在系统的正常操作期间,NameNode会在内存中保留所有块位置的映射信息。在安全模式下,各个DataNode会向NameNode发送最新的块列表信息,NameNode了解到足够多的块位置信息之后,即可高效运行文件系统。
- 如果满足“最小副本条件”,NameNode会在30秒钟之后就退出安全模式。所谓的最小副本条件指的是在整个文件系统中99.9%的块满足最小副本级别(默认值:dfs.replication.min=1)。在启动一个刚刚格式化的HDFS集群时,因为系统中还没有任何块,所以NameNode不会进入安全模式。
DataNode:
作用:储存实际数据块;执行读写操作
- 一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。DataNode会周期性检验文件的校验和是否与创建时相同以保证文件的正确性;
- DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息。
- 心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟(默认超时时长10分钟+30秒)没有收到某个DataNode的心跳,则认为该节点不可用。
- 集群运行中可以安全加入和退出一些机器。