第三章 大数据存储
发布网友
发布时间:2022-11-25 06:48
我来回答
共1个回答
热心网友
时间:2023-10-09 00:08
一,HDFS的基本特征与构架
1.基本特征
(1)大规模数据分布存储能力:以分布式存储能力和良好的可扩展性。(基于大量分布节点上的本地文件系统,构建一个逻辑上具有巨大容量的分布式文件系统,并且整个文件系统的容量可随集群中节点的增加而线性扩展)
(2)高并发访问能力:提供很高的数据访问宽带(高数据吞吐率),并且可以把带宽的大小等比例扩展到集群中的全部节点上
(3)强大的容错能力:(设计理念中硬件故障被视作常态)保证在经常有节点发生硬件故障的情况下正确检测硬件故障,并且能自动从故障中快速恢复,确保数据不丢失(采用多副本数据块形式存储)
(4)顺序式文件访问:(大数据批处理都是大量简单数据记录的顺序处理)对顺序读进行了优化,支持大量数据的快速顺序读出,代价是对于随机的访问负载较高
(5)简单的一致性模型(一次写多次读):支持大量数据的一次写入,多次读取;不支持已写入数据的更新操作,但允许在文件尾部添加新的数据
(6)数据块存储模式:默认的块大小是64MB。好处:减少元数据的数量,允许这些数据块通过随机方式选择节点,分布存储在不同地方
2.基本框架与工作过程
(1)基本组成结构与文件访问过程
[1]HDFS;一个建立在一组分布式服务器节点的本地文件系统之上的分布式文件系统(采用经典主-从结构)
[2]主控节点NameNode:
1)是一个主服务器,用来管理整个文件系统的命名空间和元数据,以及处理来自外界的文件访问请求
2)保存了文件系统的三中元数据
命名空间:整个分布式文件系统的目录结构
数据块与文件名的映射表
每个数据块副本的位置信息,每一个数据块默认有3个副本
[3]从节点DataNode:
1)用来实际存储和管理文件的数据块
2)为了防止数据丢失,每个数据块默认有3个副本,且3个副本会分别复制在不同节点上,以避免一个节点失效造成一个数据块的彻底丢失
[4]程序访问文件时,实际文件数据流并不会通过NameNode传送,而是从NameNode获得所需访问数据块的存储位置信息后,直接去访问对应的DataNode获取数据
[5]设计好处:
1)可以允许一个文件的数据能同时在不同DataNode上并发访问,提高数据访问的速度
2)减少NameNode的负担,避免使NameNode成为数据访问瓶颈
[6]基本访问过程:
1)首先,用户的应用程序通过HDFS的客户端程序将文件名发送至NameNode
2)NameNode接收到文件名之后,在HDFS目录中检索文件名对应的数据块,再根据数据块信息找到保存数据块的DataNode地址,讲这些地址回送到客户端
3)客户端接收到这些DataNode地址之后,与这些DataNode并行的进行数据传输操作,同时将操作结果的相关日志提交到NameNode
2.数据块
(1)为了提高硬盘的效率,文件系统中最小的数据读写单元是数据块
(2)HDFS数据块的默认大小是64MB,实际部署中,可能会更多
(3)将数据块设置大的原因是减少寻址开销的时间
(4)当应用发起数据传输请求:
[1]NameNode首先检索文件对应的数据块信息,找到数据块对应的DataNode
[2]DataNode根据数据块信息在自身的存储中寻找相应的文件,进而与应用程序之间交换数据
[3]因为检索过程是但进行,所以要增加数据块大小,这样就可以减少寻址的频度和时间开销
3.命名空间
(1)文件命名遵循“目录/子目录/文件”格式
(2)通过命令行或者是API可以创建目录,并且将文件保存在目录中。可以对文件进行创建,删除,重命名操作
(3)命令空间由NameNode管理。所有对命名空间的改动都会被记录
(4)允许用户配置文件在HDFS上保存的副本数量,保存的副本数称作“副本因子”
4.通信协议
(1)采用TCP协议作为底层的支撑协议
(2)应用协议
[1]应用可以向NameNode主动发起TCP连接
[2]应用和NameNode交互协议称为Client协议
[3]NameNode和DataNode交互的协议称为DataNode协议
(3)用户和DataNode的交互是通过发起远程调用(RPC),并由NameNode响应来完成的。另外,NameNode不会主动发起远程过程调用请求
5.客户端:是用户和HDFS通信最常见的渠道,部署的HDFS都会提供客户端
二,HDFS可靠性设计
1.HDFS数据块多副本存储设计
(1)采用了在系统中保存多个副本的方式保存数据,且同一个数据块的多个副本会存放在不同节点上
(2)优点:
[1]采用多副本,可以让客户从不同数据块中读取数据,加快传输速度
[2]HDFS的DataNode之间通过网络传输数据,如果采用多个副本可以判断数据传输是否出错
[3]多副本可以保证某个DataNode失效的情况下,不会丢失数据
2.可靠性的设计实现
(1)安全模式:
[1]HDFS启动时,NameNode进入安全模式
[2]处于安全模式的NameNode不能做任何文本操作,甚至内部的副本创建不允许
[3]NameNode需要和各个DataNode通信,获得其中保存的数据块信息,并对数据块信息进行检查
[4]只有通过了NameNode检查,一个数据块被认为安全。当被认为安全的数据块所占比例达到某个阈值,NameNode退出
(2)SecondaryNmaeNode
[1]使用它来备份NameNode元数据,以便在其失效时能从中恢复出其上的元数据
[2]它充当NameNode的一个副本,本身并不处理任何请求。
[3]作用:周期性保存NameNode的元数据
(3)心跳包和副本重新创建
[1]心跳包:位于HDFS核心的NameNode,通过周期性的活动检查DataNode的活动
[2]检测到DataNode失效,保存在其上的数据不可用。则其上保存的副本需要重新创建这个副本,放到另外可用的地方
(4)数据一致性
[1]采用了数据校验和机制
[2]创建文件时,HDFS会为这个文件生成一个校验和,校验和文件和文件本身保存在同一空间上,
[3]传输数据时会将数据与校验和一起传输,应用收到数据后可以进行校验
(5)租约
[1]防止同一个文件被多个人写入数据
[2]NameNode保证同一个文件只会发放一个允许的租约,可以有效防止出现多人写入的情况
(6)回滚
三,HDFS文件存储组织与读写
1.文件数据的存储组织
(1)NameNode目录结构
[1]借助本地文件系统来保存数据,保存文件夹位置由配置选项({dfs.name.dir}/{/tmp/dfs/name})决定
[2]在NameNode的${dfs.name.dir}之下有3个文件夹和1个文件:
1)current目录:
文件VERSION:保存了当前运行的HDFS版本信息
FsImages:是整个系统的空间镜像文件
Edit:EditLog编辑文件
Fstime:上一次检查点时间
2)previous.checkpoint目录:和上一个一致,但是保存的是上一次检查点的内容
3)image目录:旧版本的FsImage存储位置
4)in_use.look:NameNode锁,只在NameNode有效(启动并且能和DataNode正常交互)时存在。
(2)DataNode目录结构
[1]借助本地文件系统来保存数据。保存文件夹位置由配置选项{dfs.data.dir}决定
[2]在其之下有4个子目录和2个文件
1)current目录:已经成功写入的数据块,以及一些系统需要的文件
a)文件VERSION:保存了当前运行的HDFS版本信息
b)subdirXX:当同一目录下文件超过一定*,新建一个目录,保存多出来的数据块和元数据
2)tmp目录和blockBeingWritten目录:正在写入的数据块,是HDFS系统内部副本创建时引发的写入操作对应的数据块
3)detach目录:用于DataNode升级
4)Storage目录:防止版本不同带来风险
5)in_user.lock文件:DataNode锁。只有在DataNode有效时存在。
(3)CheckPointNode目录结构:和上一个基本一致
2.数据的读写过程
(1)数据读取过程
[1]首先,客户端调用FileSystem实例的open方法,获得这个文件对应的输入流,在HDFS中就是DFSInputStream
[2]构造第一步的输入流时,通过RPC远程调用NameNode可以获得NameNode中此文件对应的数据块保存位置,包括这个文件副本的保存位置(注:在输入流中会按照网络拓扑结构,根据与客户端距离对DataNode进行简单排序)
[3]-[4]获得此输入流后,客户端调用READ方法读取数据。输入流选择最近的DFSInputStream会根据前面的排序结果,选择最近的DataNode建立连接并读取数据。
[5]如果已达到数据块末端,关闭这个DataNode的连接,然后重新查找下一个数据块
[6]客户端调用close,关闭输入流DFSInputStream
(2)数据输入过程
[1]-[2]:客户端调用FileSystem实例的create方法,创建文件。检查后,在NameNode添加文件信息,创建结束之后,HDFS会返回一个输出流DFSDataOutputStream给客户端
[3]调用输出流的write方法向HDFS中对应的文件写入数据。
数据首先会被分包,这些分包会写入一个输出流的内部队列Data队列中,接收完整数据分包,输出流回想NameNode申请保存文件和副本数据块的若干个DataNode
[4]DFSDataOutputStream会(根据网络拓扑结构排序)将数据传输给距离上最短的DataNode,这个节点接收到数据包后传给下一个。数据在各节点之间通过管道流通,减少传输开销
[5]数据节点位于不同机器上,数据需要通过网络发送。(为保证数据节点数据正确,接收到数据的节点要向发送者发送确认包)
[6]执行3-5知道数据全部写完,DFSDataInputStream继续等待知道所有数据写入完毕并确认,调用complete方法通知NameNode文件写入完成
[7]NameNode接收到complete消息之后,等待相应数量的副本写入完毕后,告知客户端
传输过程,当某个DataNode失效,HDFS执行:
1)关闭数据传输的管道
2)将等待ACK队列的数据放到Data队列头部
3)更新正常DataNode中所有数据块版本。当失效的DataNode重启,之前的数据块会因为版本不对被清除
4)在传输管道中删除失效的DataNode,重新建立管道并发送数据包
4.HDFS文件系统操作命令
(1)HDFS启动与关闭
[1]启动过程:
1)进入到NameNode对应节点的Hadoop安装目录
2)执行启动脚本:bin/start-dfs.sh
[2]关闭过程:bin/stop-dfs.sh
(2)文件操作命令格式与注意事项
[1]基本命令格式:
1)bin/hadoop dfs-cmd <args> args-> scheme://authority/path
2)args参数基本格式前面是scheme,authority是机器地址和对应端口
a)本地文件,scheme是file
b)HDFS上文件,scheme是hdfs
(3)文件操作基本格式
[1]hadoop dfs-cat URL [URL ...]
[2]作用:将参数所指示文件内容输出到stdout