分布式存储的核心属性和功能作用
为什么使用分布式文件系统?
当存储海量数据时,当磁盘空间不够时,往往是通过扩容来解决,但是升级扩容的成本高。
单节点不能完成高并发,需要支撑海量数据的计算。
分布式存储能无线拓展,不像单机主板有限,连接的磁盘有限。
元数据记录
分布式文件系统如何快速定位文件?通过元数据去记录,元数据相当于书的目录,是记录数据的数据,记录文件名,大小,存储机器IP这些信息。
NameNode记录的元数据类型有两种:
- 文件自身的属性信息
文件名称,权限,修改时间,大小等
- 文件块位置映射信息
记录文件块和DataNode之间的映射信息,即哪个块位于哪个结点上
分块存储
文件过大,导致单机装不下,将文件分块存储,对每个块进行并行操作,能提高操作效率,但记录时也要记录每个块的存储信息,也就是元数据。当文件大小超过128M就分块,所以一个块的大小小于等于128M。
副本机制
不同机器设置备份,冗余存储,保障数据安全,比如node1存储第一个文件块和第二个文件块的备份,node2存储第二个文件块和第一个文件块的备份。文件的所有block都有副本,副本系数可以在文件创建时指定,也可以在之后改变,副本系数由dfs.replication控制,默认值是3,也就是会算复制两份,连同本身共三份。
主从架构
提供给用户统一个接口去访问,一个HDFS集群由一个NameNode和一定数量的DataNode组成,各司其职,主角色来维护元数据和目录树结构,DataNode需要去管理具体的数据块,将存储信息反馈给主角色NameNode,例如要删除一个文件,用户去操作NameNode,而真正干活的是DataNode,NameNode去指挥DataNode删除文件。
namespace
HDFS支持传统的层次型文件组织结构,用户可以创建删除目录文件,NameNode负责维护文件系统的namespace名称空间,任何对文件系统名称或属性的修改都将被NameNode记录下来,HDFS给客户端提供一个统一的抽象目录树,客户端通过路径(url)来访问资源,如hdfs://192.168.88.151:9870/dir-a/file.data
HDFS简介
HDFS(Hadoop Distributed File System)Hadoop分布式文件系统
HDFS的架构图
HDFS使用多台计算机存储文件,并提供一个统一的访问接口
HDFS的设计目标
HDFS适合大文件处理,并不适合小文件的处理
HDFS更注重数据的吞吐,不注重数据的交互式访问,所以处理延迟较高
HDFS不能编辑修改
HDFS Shell命令行
介绍
通过Shell命令行来操作文件系统
HDFS Shell CLI(command-line interface 命令行界面)支持多种文件系统,包括本地文件系统和分布式文件系统,具体操作什么文件系统取决于命令行中的文件路径URL的前缀协议。
可以在/export/server/hadoop-3.3.0/etc/hadoop/core-site.xml中设置默认访问的文件系统
hdfs dfs也可以访问文件系统,只不过只能访问HDFS文件系统。
可以通过hadoop fs -help来查看每个命令的用法
创建文件夹
查看指定目录内容
上传文件到HDFS指定目录下
localsrc的标准格式是 file:///
dst的标准格式是 hdfs://node1:8020/
查看HDFS文件内容
下载HDFS文件
指定到本地目录的具体某个文件名(这个文件可有可无),就等于给下载的文件改名。
拷贝HDFS文件
追加数据到HDFS文件中
将本地文件追加到HDFS文件里
HDFS的各角色职责
主角色:NameNode
是分布式文件系统的核心,架构中的主角色,维护和管理文件系统的元数据,包括名称空间目录树结构,文件块的位置信息,访问权限,它是访问HDFS的唯一入口
NameNode元数据的存储
内存读写速度快,但断电丢失数据,所以还要硬盘定时的进行持久化。
NameNode的数据保存在内存中,当系统重启时,需要DataNode向NameNode重新汇报信息。
单点故障:一个地方出现了问题,导致整体不能工作
主角色需要大内存
从角色:DataNode
负责具体数据块的存储,扩容集群指的是增加DataNode节点.
从角色需要大磁盘
主角色辅助角色:secondarynamenode
是NameNode的辅助节点,但不能替代NameNode,主要是帮助主角色进行元数据文件的合并动作。
HDFS的写数据流程(上传文件)
几个概念
Pipeline:管道,上传文件的一种传输方式。
客户端上传到node1的HDFS文件系统(即保存到DataNode中),node1保存数据后再复制到第二个节点依此类推。
线性传输沿着一个方向传输,充分利用每台机器的带宽,能够减少延迟,而不是采用拓扑式传输,让客户端发给node1-node3。
ACK应答响应
- ACK(AcKnowledeg character)即确认字符,在数据通信中,接收方发给发送方的一种传输类控制字符,表示发送的数据已经确认接收无误。比如node1给node2发送数据abc,那么node2按字符给node1发送确认。
- 在HDFS的pipeline管道传输数据的过程中,传输的反方向会进行ACK校验,确保传输安全
默认三副本存储策略
- 第一块副本:看用户客户端本地有没有DataNode,也就是客户端这台机器是否在集群中,否则就近随机。
- 第二块副本:不同于第一块副本的不同机架。
- 第三块副本:第二块副本相同机架的不同机器。
流程
- 1.HDFS客户端创建对象实例DistributeFileSystem,该对象封装了与HDFS文件系统操作的相关方法。
- 2.调用DistributedFileSystem对象的create()方法,通过RPC请求NameNode创建文件。
NameNode执行各种检查判断:目标文件是否存在,父目录是否存在,客户端是否具有创建权限。
检查通过后,NameNode为本次请求记下一条记录,返回FSDataOutputStream输出流对象给客户端用于写数据。
- 3.客户端通过FSDataOutputStream输出流开始写入数据。
- 4.写入数据时,将数据分成一个个数据包(packet 默认64k),内部组件DataStreamer请求NameNode挑选出适合存储数据副本的一组DataNode地址,默认是3副本存储。
- 5.传输的反方向上,通过ACK机制校验数据包传输是否成功。
- 6.客户端完成数据写入后,在FSDataOutputStream输出流上调用close()方法关闭
- 7.DistributedFileSystem联系NameNode告知其文件写入完成,等待NameNode确认。
如果有至少一个上传成功,客户端通知NameNode,如果有缺失的副本(即复制传输失败),NameNode会找其他的机器进行复制。