HDFS是Hadoo平台的核心,其全称是Hadoop Distributed File System,即分布式文件系统。HDFS是一个高容错性的系统,适合部署在廉价的服务器上,从而可有效降低了数据的存储成本。同时,HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。
1.HDFS的技术架构
HDFS采用了主从(Master/Slave)结构模型,一个HDFS集群是由一个NameNode和若干个DataNode组成的。其中NameNode作为主服务器,管理文件系统的命名空间和客户端对文件的访问操作;集群中的DataNode管理存储的数据。
HDFS技术架构
(1)NameNode
NameNode就是HDFS集群的master,其主要存储Fsimage、Edits、fstime等信息。其主要作用如下:
1) 负责管理HDFS的名称空间,维护文件系统树以及整个树的所有文件和目录;
2) 负责配置数据存储的副本策略;
3) 管理数据块信息;
4) 处理客户端读写请求。
Fsimage即镜像文件,它是HDFS系统元数据的一个永久性的检查点,其包含了HDFS文件系统的所有目录和文件inode的序列化信息(如:id、类型、目录、所属用户、用户权限、时间戳等内容)。
Edits是编辑日志文件,其存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到edits文件中。
fstime是保存最近一次checkpoint的时间。
(2)SecondaryNameNode
SecondaryNameNode主要是定时对NameNode进行数据快照备份,这样尽量降低NameNode崩溃之后,导致数据的丢失,其实所作的工作就是从NameNode获得镜像文件和edits把二者重新合并然后发给NameNode,这样既能减轻NameNode的负担又能保险地备份。
(3)DataNode
DataNode是HDFS的数据节点,其主要存储实际的数据信息,并根据客户端的操作执行数据的读写信息。
2.HDFS的特点
(1)HDFS的优点
支持海量的数据存储:HDFS可支持TB级甚至PB级的数据存储。
高容错性:HDFS的数据存储都采用多副本机制,其中一个数据节点出现故障或数据丢失,系统会自动执行其他节点的数据副本。
可构建在廉价的服务器上:HDFS的运行不需要昂贵且高可靠的机器上,一般商用机器即可满足HDFS运行。
(2)HDFS的缺点
不适合低延时数据访问:由于hadoop针对高数据吞吐量做了优化,牺牲了获取数据的延迟,所以对于低延迟数据访问,不适合hadoop。
不适合存储小文件:由于NameNode将文件系统的元数据存储在内存中,因此该文件系统所能存储的文件总数受限于NameNode的内存容量。根据经验,每个文件、目录和数据块的存储信息大约占150字节。因此,如果有一百万个小文件,每个小文件都会占一个数据块,那至少需要30OMB内存。如果是上亿级别的,就会超出当前硬件的能力。
不支持并发写入: 同一时间内,只能有一个用户执行写操作。
不适合做文件修改:对于上传到HDFS上的文件,不支持修改文件。Hadoop2.0以后虽然支持了文件的追加功能,但是还是不建议对HDFS上的文件进行修改。因为效率低下。HDFS适合一次写入,然后多次读取的场景。
3.HDFS的读写流程
(1)HDFS读取数据流程
HDFS读取数据流程
HDFS读取数据的具体流程如下:
1.客户端通过Distributed FileSystem向NameNode请求读取文件;
2.NameNode通过查询元数据信息,获取文件所在的DataNode节点地址;
3.HDFS客户端根据NameNode返回的数据地址向DataNode发起请求读取文件数据;
4.DataNode开始传输数据给客户端。
(2)HDFS写入数据流程
HDFS写入数据流程
HDFS写入数据的流程如下:
1.客户端通过Distributed FileSystem模块向NameNode请求写入数据文件;
2.NameNode收到请求后会进行校验:a.校验是否有写权限;b.校验路径下是否有同名文件;根据校验结果,NameNode返回是否可以上传。如果校验失败,会直接报错;如果成功会给客户端返回一个信号,表示可以上传;
3.客户端请求第一个Block块上传到哪几个DataNode节点上;
4.NameNode返回存储文件数据的DataNode节点;
5.客户端通过FSDataOutputStream模块请求向DataNode上传数据,DataNode收到请求会建立各数据节点和客户端的通信管道;
6.DataNode应答客户端的请求,并向DataNode上传第一个Block;当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器,之后重复执行4-6步。
4.SecondaryNameNode和NameNode的区别
HDFS已经有了NameNode,还要再另外增加个SecondaryNameNode呢,它们之间的区别和联系是什么呢?
区别:NameNode负责管理元数据和文件信息;SecondaryNameNode主要用于定期合并fsimage和edits。
联系:SecondaryNameNode中保存了一份和Namenode一致的fsimage和edits。在Namenode发生故障时,可以从SecondaryNameNode恢复数据。SecondaryNameNode的fsimage和edits可能不是最新的,因为SecondaryNameNode从NameNode下载fsimage和edits文件的时候,新的更新操作已经写到edit.new文件中去了,但是通过SecondaryNameNode的数据恢复可以将损失减小到最少。
那么,NameNode和SecondaryNameNode的工作机制是怎么样的呢?
NameNode和SecondaryNameNode的工作机制
NameNode和SecondaryNameNode工作机制主要包括两个阶段,NameNode启动阶段和SeconaryNameNode工作阶段。
NameNode启动阶段工作如下:
1.加载Fsimage和Edits文件到内存中,如果是第一次启动NameNode格式化后,系统首先创建Fsimage和Edits文件;
2.客户端发起对元数据进行增删改的请求;
3.NameNode记录操作日志,更新滚动日志;
4.NameNode在内存中对数据进行增删改查。
SeconaryNameNode工作阶段如下:
1.SecondaryNameNode向NameNode发起请求,是否需要checkpoint;
2.SecondaryNameNode请求执行checkpoint;
3.NameNode滚动正在写的edits日志;
4.NameNode将滚动前的Fsimage和Edits文件拷贝到SecondaryNameNode上;
5.SecondaryNameNode加载Fsimage和Edits文件到内存,并合并;
6. SecondaryNameNode生成新的镜像文件Fsimage.checkpoint;
7. SecondaryNameNode上的Fsimage.checkpoint复制到NameNode上;
8.NameNode将Fsimage.chkpoint重新命名成Fsimage。
NameNode和SecondaryNameNode工作机制详解:
NameNode启动时,先滚动Edits,并生成一个空的edits_inprogress,然后加载Edits和Fsimage到内存中,此时NameNode中就持有最新的元数据信息。Client开始对NameNode发送增删改的请求,这些请求的操作首先会被记录到edits_inprogress中(查询元数据的操作不会记录到Edits文件中,因为查询的操作不会更新元数据的信息),如果此时NameNode挂掉,重启后会从Edits中读取元数据的信息。然后,NameNode会在内存中执行元数据的增删改操作。由于Edits中记录的操作越来越多,Edits文件会越来越大,导致NameNode在启动加载Edits时会变慢。所以需要对Edits和Fsimage文件进行合并。所谓合并就是将Edits和Fsimage加载到内存中,按照Edits文件中的操作逐步执行,最终形成新的Fsimage。
SecondaryNameNode的作用就是帮助NameNode进行Edits和Fsimage的合并。SecondaryNameNode会首先询问NameNode是否需要CheckPoint(触发CheckPoint需要满足两个条件中的一个:1)Edits文件中数据写满了;2)定时时间到了。),并返回NameNode是否需要CheckPoint检查结果。SecondaryNameNode执行CheckPoint操作,首先会让NameNode滚动Edits,并生成一个新的edits_inprogress文件,其他未合并的Edits和Fsimage会拷贝到SecondaryNameNode的本地,然后将拷贝的Edits和Fsimage加载到内存中进行合并,生成Fsimage.checkpoint,然后将Fsimage.checkpoint拷贝到NameNode,重命名为Fsimage,并替换原来的fsimage文件。
NameNode在重新加载的时候只需要加载之前未合并的Edits和Fsimage即可,因为合并过的Edits中的元数据信息已经被记录到Fsimage。
5. HDFS文件操作方式
HDFS文件操作常见的有两种方式,即HDFS shell命令行操作和javaAPI方式。今天我们先了解下基于客户端的HDFS shell命令行的操作。HDFS shell可以对文件进行创建、修改、删除、修改权限等,文件夹的创建、删除、重命名等操作。HDFS shell的操作命令类似于lLinux的shell对文件的操作,如ls、mkdir、rm 等。可以执行命令hadoop fs,来查看HDFS的shell操作的所有命令。常见的HDFS shell操作命令如下:
选项名称
使用格式
含义
-ls
-ls <路径>
查看指定路径的当前目录结构
-lsr
-lsr <路径>
递归查看指定路径的目录结构
-du
-du <路径>
统计目录下各文件大小
-dus
-dus <路径>
汇总统计目录下文件(夹)大小
-count
-count [-q] <路径>
统计文件(夹)数量
-mv
-mv <源路径> <目的路径>
移动
-cp
-cp <源路径> <目的路径>
复制
-rm
-rm [-skipTrash] <路径>
删除文件/空白文件夹
-rmr
-rmr [-skipTrash] <路径>
递归删除
-put
-put <多个linux上的文件> <hdfs 路径>
上传文件
-copyFromLocal
-copyFromLocal <多个linux 上的文件> <hdfs 路径>
从本地复制
-moveFromLocal
-moveFromLocal <多个linux 上的文件> <hdfs 路径>
从本地移动
-getmerge
-getmerge <源路径> <linux 路径>
合并到本地
-cat
-cat <hdfs 路径>
查看文件内容
-text
-text <hdfs 路径>
查看文件内容
-copyToLocal
-copyToLocal [-ignoreCrc] [-crc] [hdfs 源路径] [linux 目的路径]
复制到本地
-moveToLocal
-moveToLocal [-crc] <hdfs 源路径> <linux目的路径>
移动到本地
-setrep
-setrep [-R] [-w] <副本数> <路径>
修改副本数量
-mkdir
-mkdir <hdfs 路径>
创建空白文件夹
-touchz
-touchz <文件路径>
创建空白文件
-stat
-stat [format] <路径>
显示文件统计信息
-tail
-tail [-f] <文件>
查看文件尾部信息
-chmod
-chmod [-R] <权限模式> [路径]
修改权限
-chown
-chown [-R] [属主][:[属组]]路径
修改属主
-chgrp
-chgrp [-R] 属组名称 路径
修改属组
-help
-help [命令选项]
帮助
如查看HDFS下/warehoue/ods/abc的目录结构,即执行命令:hdoop fs -ls /warehoue/ods/abc;其他命令类似。