大数据技术基础笔记3 分布式文件系统HDFS

Posted Lora鳃鳃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据技术基础笔记3 分布式文件系统HDFS相关的知识,希望对你有一定的参考价值。

3.1 分布式文件系统

计算机集群结构
• 分布式文件系统把文件分布存储到多个计算机节点上,成千上万的计算机节点构成计算机集群。
• 与之前使用多个处理器和专用高级硬件的并行化处理装置不同的是,目前的分布式文件系统所采用的计算机集群,都是由普通硬件构成的,这就大大降低了硬件上的开销。
在这里插入图片描述

分布式文件系统的结构
分布式文件系统在物理结构上是由计算机集群中的多个节点构成的,这些节点分为两类
-主节点(Master Node)/名称结点(NameNode)
-从节点(Slave Node)/数据节点(DataNode)
在这里插入图片描述
• 分布式文件系统需满足:
– 透明性
• 对用户来说,无需关心文件被划分成多少块,无需关心文件存在哪里,无需关心集群节点增加或减少造成的影响
– 并发控制
• 一个用户访问文件,不影响其他用户对同一个文件的访问
– 文件复制
• 支持多副本
– 硬件和操作系统异构性
– 可伸缩性
• 节点可随时加入或退出
– 容错
– 安全

3.2 HDFS简介

• 总体而言,HDFS实现了以下目标:
• 兼容廉价的硬件设备
• 流数据读写
• 大数据集
• 简单的文件模型
• 强大的跨平台兼容性
• HDFS特殊的设计,在实现上述优良特性的同时,也使得自身具有一些应用局限性,主要包括以下几个方面:
• 不适合低延迟数据访问
• 无法高效存储大量小文件
• 不支持多用户写入及任意修改文件

3.3 HDFS相关概念


• HDFS默认一个块64MB,一个文件被分成多个块,以块作为存储单位,块的大小远远大于普通文件系统,可以最小化寻址开销。
• HDFS采用抽象的块概念可以带来以下几个明显的好处:
– 支持大规模文件存储,一个文件的大小不会受到单个节点的存储容量的限制,可以远远大于网络中任意节点的存储容量
– 简化系统设计,很容易计算出一个节点可以存储多少文件块;元数据可以单独管理和存储
– 适合数据备份:每个文件块都可以冗余存储到多个节点上,大大提高了系统的容错性和可用性

名称节点和数据节点
在这里插入图片描述
• 名称节点(NameNode)负责管理分布式文件系统的命名空间(Namespace),名称节点记录了每个文件中各个块所在的数据节点的位置信息
• 名称节点保存了两个核心的数据结构,即FsImage和EditLog
– FsImage用于维护文件系统树以及文件树中所有的文件和文件夹的元数据
– 操作日志文件EditLog中记录了所有针对文件的创建、删除、重命名等动态操作

• FsImage文件、editLog文件
在这里插入图片描述
• FsImage文件包含文件系统中所有目录和文件inode的序列化形式。
– inode是一个文件或目录的元数据的内部表示,并包含此类信息:文件的复制等级、修改和访问时间、访问权限、块大小以及组成文件的块。对于目录,则存储修改时间、权限和配额元数据
– FsImage文件没有记录文件包含哪些块以及每个块存储在哪个数据节点。
– 由名称节点把这些映射信息保留在内存中,当数据节点加入HDFS集群时,数据节点会把自己所包含的块列表告知给名称节点,此后会定期执行这种告知操作,以确保名称节点的块映射是最新的。
• 名称节点启动时:
– 将FsImage文件中的内容加载到内存中
– 执行EditLog文件中的各项操作,使得内存中的元数据和实际的同步,内存中的元数据支持客户端的读操作
– 一旦在内存中成功建立文件系统元数据的映射,则创建一个最新的FsImage文件和一个空的EditLog文件
• 名称节点启动之后:
– HDFS中的更新操作会写到EditLog文件中,而不会修改FsImage文件(太大,GB级别,频繁访问影响系统性能)
– EditLog从空文件开始写,要小很多
• 在名称节点运行期间,HDFS的所有更新操作都是直接写到EditLog中,久而久之, EditLog文件将会变得很大,带来问题:
– 当名称节点需要重启的时候,名称节点需要先将FsImage里面的所有内容映像到内存中,然后再一条一条地执行EditLog中的记录,当EditLog文件非常大的时候,会导致名称节点启动操作非常慢,而在这段时间内HDFS系统处于安全模式,一直无法对外提供写操作,影响了用户的使用
• 解决方案:
– 使用第二名称节点SecondaryNameNode
– 用来保存名称节点中对HDFS 元数据信息的备份,一般单独运行在一台机器上

数据节点(DataNode)
• 数据节点是分布式文件系统HDFS的工作节点,负责数据的存储和读取,会根据客户端或者是名称节点的调度来进行数据的存储和检索,并且向名称节点定期发送自己所存储的块的列表
• 每个数据节点中的数据会被保存在各自节点的本地Linux文件系统中

3.4 HDFS体系结构

HDFS体系结构概述
• HDFS采用了主从(Master/Slave)结构模型,一个HDFS集群包括一个名称节点(NameNode)和若干个数据节点(DataNode)。
– 名称节点作为中心服务器,负责管理文件系统的命名空间(目录及文件创建、属性修改、删除等)、客户端对文件的访问入口(响应客户端提出的目录文件的创建修改删除查询等操作,为客户端提供具体文件的位置)。
– 集群中的数据节点一般是一个节点运行一个数据节点进程,负责处理文件系统客户端的读/写请求,在名称节点的统一调度下进行数据块的创建、删除和复制等操作。每个数据节点的数据实际上是保存在本地Linux文件系统中的。

在这里插入图片描述

3.5 HDFS存储原理

1 冗余数据保存
HDFS采用了多副本方式对数据进行冗余存储,通常一个数据块的多个副本会被分布到不同的数据节点上,带来以下优点:
加快数据传输速度
容易检查数据错误
保证数据可靠性

2 数据存取策略
数据的存放策略:
第一个副本:放置在上传文件的那个数据节点(即客户端节点);如果是集群外提交,则随机挑选一台磁盘不太满、CPU不太忙的节点
第二个副本:放置在与第一个副本不同的机架的节点上
第三个副本:与第一个副本相同机架的其他节点上
其他更多副本:随机节点

数据读取的策略:
HDFS提供了一个API可以确定一个数据节点所属的机架ID,客户端也可以调用API获取自己所属的机架ID
当客户端读取数据时,从名称节点获得数据块不同副本的存放位置列表,列表中包含了副本所在的数据节点,可以调用API来确定客户端和这些数据节点所属的机架ID,当发现某个数据块副本对应的机架ID和客户端对应的机架ID相同时,就优先选择该副本读取数据,如果没有发现,就随机选择一个副本读取数据

3 数据错误与恢复
硬件出错看作一种常态,而不是异常,主要包括以下几种情形:名称节点出错、数据节点出错和数据出错。
1 . 名称节点出错:
名称节点保存了所有的元数据信息,其中,最核心的两大数据结构是FsImage和Editlog,如果这两个文件发生损坏,那么整个HDFS实例将失效。
HDFS设置了备份机制,把这些核心文件同步复制到备份服务器SecondaryNameNode上。当名称节点出错时,就可以根据备份服务器SecondaryNameNode中的FsImage和Editlog数据进行恢复。但不能保证百分百的恢复。

2 . 数据节点出错
每个数据节点会定期向名称节点发送“心跳”信息,向名称节点报告自己的状态
当数据节点发生故障,或者网络发生断网时,名称节点就无法收到来自一些数据节点的心跳信息,这时,这些数据节点就会被标记为“宕机”,节点上面的所有数据都会被标记为“不可读”,名称节点不会再给它们发送任何I/O请求。
当由于一些数据节点的不可用,而导致一些数据块的副本数量小于冗余因子,名称节点会定期检查这种情况,一旦发现某个数据块的副本数量小于冗余因子,就会启动数据冗余复制,为它生成新的副本。
HDFS和其它分布式文件系统的最大区别就是可以调整冗余数据的位置

3 . 数据出错
网络传输和磁盘错误等因素,都会造成数据错误。
客户端在读取到数据后,会采用md5和sha1对数据块进行校验,以确定读取到正确的数据。
在文件被创建时,客户端就会对每一个文件块进行信息摘录,并把摘录信息写入到同一个路径的隐藏文件里。
当客户端读取文件的时候,会先读取该信息文件,然后,利用该信息文件对每个读取的数据块进行校验,如果校验出错,客户端就会请求到另外一个数据节点读取该文件块,并且向名称节点报告这个文件块有错误,名称节点会定期检查并且重新复制这个块。

3.6 HDFS数据读写过程

1 读数据的过程
在这里插入图片描述

2 写数据的过程
在这里插入图片描述

3.7 HDFS编程实践

HDFS常用命令
HDFS有很多shell命令,其中,fs命令可以说是HDFS最常用的命令
利用该命令可以查看HDFS文件系统的目录结构、上传和下载数据、创建文件等。该命令的用法为:
hadoop fs [genericOptions] [commandOptions]
备注:Hadoop中有三种Shell命令方式:
hadoop fs适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统
hadoop dfs只能适用于HDFS文件系统
hdfs dfs跟hadoop dfs的命令作用一样,也只能适用于HDFS文件系统

hadoop fs -ls <path>
显示<path>指定的文件的详细信息
hadoop fs -mkdir <path>
创建<path>指定的文件夹
hadoop fs -cat <path>
将<path>指定的文件的内容输出到标准输出(stdout)
hadoop fs -copyFromLocal <localsrc> <dst>
将本地源文件<localsrc>复制到路径<dst>指定的文件或文件夹中

小结
分布式文件系统是大数据时代解决大规模数据存储问题的有效解决方案,HDFS开源实现了GFS,可以利用由廉价硬件构成的计算机集群实现海量数据的分布式存储
HDFS具有兼容廉价的硬件设备、流数据读写、大数据集、简单的文件模型、强大的跨平台兼容性等特点。但是,也要注意到,HDFS也有自身的局限性,比如不适合低延迟数据访问、无法高效存储大量小文件和不支持多用户写入及任意修改文件等
块是HDFS核心的概念,一个大的文件会被拆分成很多个块。HDFS采用抽象的块概念,具有支持大规模文件存储、简化系统设计、适合数据备份等优点
HDFS采用了主从(Master/Slave)结构模型,一个HDFS集群包括一个名称节点和若干个数据节点。名称节点负责管理分布式文件系统的命名空间;数据节点是分布式文件系统HDFS的工作节点,负责数据的存储和读取
HDFS采用了冗余数据存储,增强了数据可靠性,加快了数据传输速度。HDFS还采用了相应的数据存放、数据读取和数据复制策略,来提升系统整体读写响应性能。HDFS把硬件出错看作一种常态,设计了错误恢复机制
本章最后介绍了HDFS的数据读写过程以及HDFS编程实践方面的相关知识

以上是关于大数据技术基础笔记3 分布式文件系统HDFS的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop技术之HDFS分布式文件系统基础

大数据之HDFS

秒懂HDFS | 大数据技术分享

大数据笔记:HDFS集群搭建-伪分布式模式

大数据笔记——Apache Hadoop的体系结构

hadoop入门1