系列博客目录链接:Hadoop权威指南学习笔记:总章
所涉及到的相关简写如下:
- NN: NameNode、命名节点
- DN: DataNode、数据节点
- RM: ResourceManager
- NM: NodeManager
- SNN: Secondary NameNode、第二名称节点
- QJM: Quorum Journal Manager、群体日志管理器
- FC: Failover Controller、故障转移控制器
- ZKFC: Zookeeper Failover Controller、Zookeeper故障转移控制器
英文全名为Hadoop Distributed File System,中文译为Hadoop分布式文件系统。从名字中就可以知道,其主要职责是存储文件。HDFS是Hadoop的核心组件之一,其是Hadoop的旗舰级操作系统。
HDFS被设计为运行在商用硬件(即普通商店能买到的硬件,但不同于普通PC硬件)之上,其具有如下特点:
数据块(Block)并不是一个陌生的概念,在我们的操作系统中,也存在数据块的概念。数据块是磁盘进行数据读写的最小单位,文件系统构建于数据块之上,用于管理磁盘中的文件。文件系统块一般是磁盘块大小的整数倍。与通常的磁盘文件系统不同的是:HDFS中小于一个块大小的文件不会占据整个块的空间(当一个1MB的文件存储在一个128MB的块中时,文件只使用1MB的磁盘空间,而不是128MB)
在HDFS中,一个数据块的大小为128MB(磁盘块一般为512B),相对于磁盘块来说很大,这样做的好处是便于寻址,减少了寻址时间。
-move: 移动损坏的文件到/lost+found目录下
-delete: 删除损坏的文件
-openforwrite: 输出检测中的正在被写的文件
-list-corruptfileblocks: 输出损坏的块及其所属的文件
-files: 输出正在被检测的文件
-blocks: 输出block的详细报告 (需要和-files参数一起使用)
-locations: 输出block的位置信息 (需要和-files参数一起使用)
-racks: 输出文件块位置所在的机架信息(需要和-files参数一起使用)
例如hdfs fsck /zpy/bigdata/ncdc/simple.txt -files -blocks -racks
命令执行结果为:
hadoop fs -stat [format]
来查询一个文件的相关信息。format
的几个重要符号如下: %b:文件实际大小(单位:字节)
%o:数据块大小(单位:字节)
%r:副本个数
%n:文件名
%f:文件类型
例如运行hadoop fs -stat 'name: %n---type: %F---real_size: %b----block_size: %o---replicated_num: %r' /zpy/bigdata/ncdc/simple.txt
输出如下:
hdfs-site.xml
文件。修改仅对之后上传的文件生效,对之前的文件不生效。修改完成之后需要重启HDFS集群。<property>
<name>dfs.blocksizename>
<value>30mvalue>
property>
<property>
<name>dfs.namenode.fs-limits.min-block-sizename>
<value>30mvalue>
property>
HDFS的工作模式为管理节点-工作节点模式,即一个NameNode和多个DataNode
NameNode和DataNode的主要功能分别如下:
dfs.namenode.name.dir
定义)上。1通常情况下,DN会在磁盘中读取块。但是对于访问频繁的块,DN会将对应的块缓存到DN内存中。默认情况下,一个块仅仅会被缓存到一个DN的内存中,通过堆外块缓存(off-heap block cache)技术实现。
namenode会在内存中保存元数据,这也是HDFS的瓶颈----无法存储大量文件。在HDFS2.X中引入了联邦HDFS来实现横向扩展。此时每个namenode仅需管理命名空间的一部分,比如一个namenode管理/usr目录下文件,另一个管理/share目录下文件。
每个namenode维护一个命名空间卷,由命名空间的元数据和一个数据块池(block pool)组成。数据块池包含该命名空间下文件的所有数据块。
命名空间之间是互相独立的,两两之间不互相通信,因此DN需要注册所有NN,并且每个NN都存储着来自多个数据块池中的数据块。
HDFS的元数据皆保存在namenode指定的磁盘中,若该文件丢失,也就意味着整个HDFS的文件都丢失了,因此我们可以使用如下两种方式保证文件安全。
高可用需要解决的问题是单点失效问题,即单台namenode失效带来的Hadoop服务不可用。挂载NFS(冷启动方式)和第二名称节点的机制并不能解决该问题。前者启动十分耗时,而对于第二名称节点来说,因为机制问题,其元数据总是滞后于实际最新元数据(第二名称节点相当于主namenode的备份机)。
当单节点故障时,为了恢复服务,我们通常需要启动一个拥有文件系统元数据副本的新的namenode(俗称冷启动),通常过程包括:将镜像文件导入内存、重演编辑文件、接收足够多的DN数据块报告然后退出安全模式(安全模式期间NN可读不可写)。对于一个拥有大量文件、大规模的集群来说,NN的启动通常十分耗时。
在hadoop2.0中,使用了active-standby
机制实现了集群的高可用。保证当活动NN停止活动后,备用NN后会较快的接管服务。该机制主要解决了高可用所面对的如下问题:
要保证数据高可用,有如下两种解决方式:使用NFS和QJM(群体日志管理器)。Hadoop使用后者。QJM使用一组日志节点形式运行,每一次编辑必须写入到多数节点,从而保证数据不丢失和数据的高可用。
DataNode发送心跳包时会同时向两个NN发送心跳包,从而保证两个NN的数据同步。
系统中有一个故障转移控制器(failover controller, FC),管理活动NN向备用NN切换的过程。默认情况下会使用Zookeeper的故障转移控制器(ZKFC)来保证仅有一个活动NN。
确认原有NN是否已经停止运行的过程称为“规避”。我们使用NFS存储元数据时,其无法保证同一时间只有一个NN写入数据,而QJM可以实现。常用的规避手段包含关闭原NN节点电源等。
在文件系统执行写操作时,会先将事务记录到编辑日志中。同时namenode在内存中维护文件系统元数据,当编辑日志被修改时,元信息也会被同步更新。详情写入流程见白话聊聊Hadoop的Namenode是怎么管理元数据的 ↩︎