Hadoop分布式文件系统(Hadoop Distributed File System,简称HDFS)是Hadoop的核心模块之一,它主要解决Hadoop的大数据存储问题,其思想来源于Google的文件系统GFS.HDFS的主要特点:
1) 保存多个副本,且提供容错机制,副本丢失或者宕机自动恢复.默认保存3份.
2) 运行在廉价的机器上.
3) 适合大数据的处理.HDFS默认会将文件分割成block,128M为1个block.然后将block按键值对存储在HDFS上,并将键值对的映射存在内存中.如果小文件太多,那内存的负担会很重.
HDFS中的两个重要角色:
[NameNode]
1) 管理文件系统的命名空间.
2) 记录每个文件数据块在各个DataNode上的位置和副本信息.
3) 协调客户端对文件的访问.
4) 记录命名空间内的改动或者空间本省属性的改动.
5) NameNode使用事务日志记录HDFS元数据的变化.使用映像文件存储文件系统的命名空间,包括文件映射,文件属性等.
[DataNode]
1) 负责所在的物理节点的存储管理
2) 一次写入,多次读取(不修改)
3) 文件由数据库组成,一般情况下,数据块的大小为128MB.
4) 数据尽量散布在各个节点.
从社会学的角度来看,DataNode是HDFS的工作者,发挥按着NameNode的命令干活,并且把干活的进展和问题反馈到NameNode的作用.
客户端如何访问HDFS中一个文件呢?具体流程如下:
1) 首先从NameNode获取组成这个文件的数据块位置列表.
2) 接下来根据位置列表知道存储数据块的DataNode.
3) 最后访问DateNode获取数据
注意: NameNode并不参与数据实际传输.
数据存储系统,数据存储的可靠性至关重要.HDFS是如何保证其可靠性呢?它主要采用如下机理:
1) 冗余副本策略,即所有数据都有副本,副本的数且可以在hdfs-site.xml中设置相应的复制因子.
2) 机架策咯,即HDFS的"机架感知",一般在本机架存放一个副本,且其他机架再存放别的副本,这样可以防止机架失效时丢失数据,也可以提供带框利用率.
3) 心跳机制,即NameNode周期性从DataNode接受心跳信号和块报告,没有按时发送心跳的DataNode会被标记为宕机,不会再给任何I/O请求,若是DataNode失效造成副本数量下降,并且低于预先设置的阈值,NameNode会检测出这些数据块,并且在合适的时机进行重新复制.
4) 安全模式,NameNode启动时会先经过一个"安全模式"阶段.
5) 校验和,客户端获取数据通过检查检验和,发现数据块是否损坏,从而确定是否要读取副本.
6) 回收站,删除文件,会先到回收站/trash,其里面可以快速恢复.
7) 元数据保护,映像文件和事务日志是NameNode的核心数据,可以配置为拥有多个副本.
8) 快照,支持存储某个时间点的映像,需要时可以使数据重返这个时间点的状态.
如上图所示,HDFS也是按照Master和Slave的结构.分NameNode,SecondaryNameNode,DataNode这几个角色.
NameNode: 是Master节点,是大领导.管理数据块的映射;处理客户端的读写请求;配置副本策咯;管理HDFS的名称空间.
SecondaryNameNode: 是一个小弟,分担大哥NameNode的工作量;是NameNode的冷备份;合并fsimage和fsidits然后再发给NameNode.
DataNode: Slave节点,奴隶,干活的.负责存储client发开的数据块block;执行数据块的读写操作.
热备份: b是a的热备份,如果a坏掉了,那么b马上运行代替a的工作.
冷备份: b是a的冷备份,如果a坏掉了,那么b不能马上代替a工作,但是b上存储了a的一些信息,减少a坏掉之后的损失.
fsimage: 元数据镜像文件(文件系统的目录树)
$>hdfs oiv -p XML -i xxx -o ~/xxx.xml
edits: 元数据的操作日志(针对文件系统做的修改操作记录)
$>hdfs oev -p XML -i xxx -o ~/xxx.xml
NameNode内存中存储的就是 = fsimage + edits.
SceondaryNameNode负责定时(默认1小时),从NameNode上获取fsimage和edits来进行合并,然后再发送给NameNode,减少NameNode的工作量.
hdfs api:
1.Configuration
配置对象,加载配置文件.
addDefaultResource();从classpath加载.
2.FileSystem
DistributedFileSystem,是FileSystem的一个实现,用于和hadoop的hdfs进行交互.
3.Path
文件或者目录的名称. /是路径分隔符,有绝对路径和相对路径之分.