大数据技术之HDFS

Java
300
0
0
2023-06-05
标签   大数据

HDFS 是Hadoo平台的核心,其全称是 hadoop Distributed File System,即分布式文件系统。 HDFS是一个高容错性的系统,适合部署在廉价的服务器上,从而可有效降低了数据的存储成本。同时,HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。

1.HDFS的技术架构

HDFS 采用了主从(Master/Slave)结构模型,一个HDFS集群是由一个NameNode和若干个DataNode组成的。其中 Namenode 作为主服务器,管理文件系统的命名空间和客户端对文件的访问操作;集群中的DataNode管理存储的数据。


大数据技术之HDFS 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读取数据流程

HDFS读取数据的具体流程如下:

1.客户端通过Distributed FileSystem向NameNode请求读取文件;

2.NameNode通过查询元数据信息,获取文件所在的DataNode节点地址;

3.HDFS客户端根据NameNode返回的数据地址向DataNode发起请求读取文件数据;

4.DataNode开始传输数据给客户端。

(2)HDFS写入数据流程

大数据技术之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的工作机制是怎么样的呢?

大数据技术之HDFS 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命令行操作和 java API方式。今天我们先了解下基于客户端的HDFS shell命令行的操作。HDFS shell可以对 文件进行创建、修改、删除、修改权限等,文件夹的创建、删除、重命名等操作。HDFS shell的操作命令类似于l linux 的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 路径>

上传文件

– copy FromLocal

-copyFromLocal <多个linux 上的文件> <hdfs 路径>

从本地复制

-moveFromLocal

-moveFromLocal <多个linux 上的文件> <hdfs 路径>

从本地移动

-get merge

-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;其他命令类似。