第3章 分布式文件系统HDFS

2019-12-16  本文已影响0人  迪丽娜扎

3.1 分布式文件系统

1. 计算机集群的结构(物理结构)

节点:集群的最小单位,一个计算节点由处理器、内存、高速缓存、本地磁盘构成。(说白了一个计算节点就是一台计算机)

机架:一个机架上存放8~64个计算节点,不同节点之间通过网络互连。

集群:由若干个机架构成,机架之间由高一级的网络或交换机互连。

从网络角度看,一个集群十份像一个局域网

2. 分布式文件系统的结构(逻辑结构)

从分布式文件系统的逻辑结构来看,计算节点分为名称节点和数据节点两大类。

(主节点)名称节点:负责① 文件和目录的创建、删除、重命名;② 管理数据节点和文件块的映射关系

(从节点)数据节点:负责数据的存储和读取

3. 分布式文件系统的设计要求

无感知操作:用户仅需通过逻辑路径访问文件,而不需要关系文件存储的具体节点位置

多客户端并发控制:支持多个客户端的同时访问

文件多副本/跨平台/可伸缩/容错/安全

3.2 HDFS简介

HDFS是占据统治地位的分布式文件系统,其优缺点也是典型的分布式文件系统的优缺点,描述如下。

优点:

① 兼容廉价设备;

② 流数据读写,为批量处理数据而设计;

③ 大数据集存储:单个文件在GB~TB级别;

④ 简单的文件模型:一次写入、多次读取

⑤ 跨平台兼容:使用Java编写

缺点:

① 不适用于低延迟访问;

② 无法高效存储大量小文件;

③ 不支持多用户同时写入或修改同一文件。

3.3 HDFS的相关概念

1. 块

块的概念:在所有的文件系统中,为了提高磁盘读写效率,一般以块为单位,而不是以字节为单位。

HDFS中的块:① 普通文件系统中一个块的大小可能是几十个字节,HDFS的块大小则是64M,进一步提高了读写的效率;② 普通文件系统中若一个文件的大小占据不了一个块,也会为其分配以整个块,且该块中剩余的空间不可用,但HDFS里的块是能连续用的。

使用块的好处:① 可以把一个超大的文件拆成很多个块,从而可以分布式存储;② 简化了系统设计,以块为单位进行空间和元数据管理等;③ 适合备份

HDFS的三级寻址:第一步、从名称节点找到组成目标文件的数据块的位置列表;第二步、根据位置列表获取实际存储各个数据块的数据节点的位置;第三步、数据节点根据数据块信息在本地Linux文件系统中找到对应的文件,并返回给客户端。

2. 名称节点

负责管理分布式文件系统的命名空间,保存了FsImage和EditLog两个核心结构。

其中FsImage维护了文件系统树以及树中所有的文件和文件夹的元数据。而EditLog保存了所有针对文件的创建、删除、重命名等操作。两者的关系如下:

名称节点并不持久化保存文件信息,而是在每次启动时扫描所有数据节点进行重构 -> 生成了FsImage结构 -> 执行EditLog文件中的各种操作,从而更新FsImage到最新,而EditLog被清零 -> 把用户的操作记录到EditLog中 -> (关机了,把EditLog保存到硬盘,FsImage直接扔掉)

3. 数据节点

根据客户端或名称节点的调度来存储、检索、存储、发送数据块

4. 第二名称节点

第二名称节点是为了防止EditLog文件不断变大、缩短名称节点重启时间而设计的,操作如下:

每隔一段时间,第二名称节点向名称节点通信,要求其停止更新EditLog,并暂时把用户操作写到EditLog.new里 -> 第二名称节点把FsIamge和已停更的EditLog拉到本地,加载到内存,并把EditLog合并到FsImage -> 第二名称节点把更新后的FsIamge发给第一名称节点 -> 第一名称节点用新收到的FsImage替换旧的,并用EditLog.new替换EditLog

第二名称节点还可以起到冷备份的作用

3.4 HDFS体系结构

构成:主从结构模型,一个名称节点+若干个数据节点。

用户访问:形式上像普通文件系统一样,通过文件名路径进行文件的读写,实际上① 同一个文件会被分成若干个文件快并被存储到不同的数据节点上 ② 客户端首先向名称节点发送请求查询文件在数据节点的位置,然后去访问。

部署:任何支持JVM的机器都可以部署名称节点和数据节点。

命名空间:只有一个命名空间,且只有一个名称节点,使用传统的分级文件体系

通信协议:TCP/IP,客户端通过一个端口向名称节点主动发起TCP连接,使用客户端协议与名称节点进行交互

客户端:客户端本身不是HDFS的一部分(尽管在硬件上来说“客户端”可能是某台机架上的某台机器),客户端提供打开、读取、写入,并支持shell命令行

局限性:单个名称节点限制了命名空间、文件系统的吞吐量、程序隔离等。

3.5 HDFS的存储原理

3.5.1 冗余存储

数据的冗余存储:一个数据块的多个副本会被存储到多个不同的数据节点上。

冗余存储的好处:① 加快数据传输速度,多个客户端可以分别访问同一数据块的不同副本,② 检查数据错误,③ 保证数据可靠

3.5.2 数据读取策略

数据的存储策略:默认冗余度为3。① 第一副本:若是集群内部发起的存储请求,则把第一副本存放到发起请求的数据节点上,若是外部请求,则挑选一台磁盘不太满,CPU不太忙的数据节点进行存储,② 第二副本:放在与第一副本不同机架的数据节点上,③ 第三副本:放在与第一副本相同机架的其它数据节点上。

数据的读取策略:首先考察数据的不同副本所在的机架,若有与客户端在同一机架上的,则优先选择该副本进行读取,否则就随机选择一个。(进一步印证了“客户端”也是集群的某个机架上的一个节点)

3.5.3 数据错误与恢复

名称节点出错:① 把名称节点的元数据信息同步存储到其它文件系统;② 第二节点冷备份

数据节点出错:数据节点会定时向名称节点发送信息表示自己还活着,若没有则会被数据节点标记为宕机,之后名称节点将不再向该节点发送IO请求,并启动数据冗余复制,为该数据节点上的文件生成新的副本

数据出错:使用校验信息进行校验。

3.6 HDFS的数据读写过程

FileSystem:一个通用文件系统的抽象基类

DistributedFileSystem:FileSystem在HDFS文件系统的实现

3.6.1 读数据的过程

总体包括open、read、close三步

1. .open():① DistributedFileSystem创建输入流DFSInputStream,② 输入流远程调用名称节点,获取文件开始部分的数据块的位置,此时DFSInputStream已经是一个实例

2. .read():① 选择距离客户端最近的数据节点建立连接并读取数据,② 数据被读取到客户端,数据块读取完成后关闭与相应数据节点的连接,③ 查找下一个数据块的位置,进行读取,循环执行。

3. close():关闭输入流

3.6.2 写数据的过程

总体包括create、write、close三步

1. .create():① DistributedFileSystem创建输出流DFSOutputStream,② 输出流远程调用名称节点,在文件系统创建新的文件,③ 名称节点做权限、是否已存在等检查,然后完成创建,此时DFSInputStream已经是一个实例

2. .write():① 待写入数据被分包,这些包进入输出流对象的内部队列,② 输出流向名称节点申请保存位置(若干个数据节点),这些数据节点形成数据流管道,包被写入第一个数据节点,然后由第一个数据节点发送到第二个数据节点,以此类推,完成冗余写入,③ 由最后一个数据节点依次向前返回确认包,确认已被成功写入

3. .close():数据全部写完后,关闭输出流

3.7 HDFS常用命令

3.7.1. shell命令

HDFS的shell命令分为三大类:hadoop fs/hadoop dfs/ hdfs dfs。

1. 并不是只有fs/dfs这一种命令(这个命令可以描述为“文件系统命令”),但这个命令最常用。其它的见下图。

2. 而dfs命令下传的参数,则与linux的shell命令很相似。如下图所示。

3.7.2. Java Api

上一篇 下一篇

猜你喜欢

热点阅读