03-HDFS

一、HDFS知识点

HDFS的本质是一个文件系统,特点是分布式,需要在多台机器启动多个NN,DN进程组成一个分布式系统

1、HDFS不支持对文件的随机写

HDFS不支持对一个文件的并发写入,也不支持对文件的随机修改,可以追加,但是不能修改。

原因: 文件在HDFS上存储时,以block为基本单位存储。

① 没有提供对文件的在线寻址(打开)功能

② 文件以块形式存储,修改了一个块中的内容,就会影响当前块之后所有的块,效率低

2、HDFS不适合存储小文件

根本原因: HDFS存储了大量的小文件,会降低NN的服务能力!

NN负责文件元数据(属性,块的映射)的管理,NN在运行时,必须将当前集群中存储所有文件的元数据全部加载到内存!

NN需要大量内存!

举例:当前运行NN的机器,有64G内存,除去系统开销,分配给NN50G内存!

文件a (1k), 存储到HDFS上,需要将a文件的元数据保存到NN,加载到内存
文件名 创建时间 所属主 所属组 权限 修改时间+ 块的映射(1块)
150B

最多存储50G/150B个文件a
50G/150B * 1k

文件b (128M), 存储到HDFS上,需要将b文件的元数据保存到NN,加载到内存
文件名 创建时间 所属主 所属组 权限 修改时间+块的映射(1块)
150B
最多存储50G/150B个文件b
50G/150B * 128M

3、同一个文件在同一时刻只能由一个客户端写入

4、块大小

块大小取决于hdfs-site.xml中的dfs.blocksize进行配置,2.x默认为128M,1.x默认为64M

默认为128M的原因,基于最佳传输损耗理论!

不论对磁盘的文件进行读还是写,都需要先进行寻址!

最佳传输损耗理论:在一次传输中,寻址时间占用总传输时间的1%时,本次传输的损耗最小,为最佳性价比传输!

目前硬件的发展条件,普通磁盘写的速率大概为100M/S, 寻址时间一般为10ms!

10ms / 1% = 1s
1s * 100M/S=100M

块在传输时,每64K还需要校验一次,因此块大小,必须为2的n次方,最接近100M的就是128M!

如果公司使用的是固态硬盘,写的速度是300M/S,将块大小调整到 256M
如果公司使用的是固态硬盘,写的速度是500M/S,将块大小调整到 512M

5、块大小需要合适调节

太大时:

当前有文件a, 1G

128M一块      1G存8块      取第一块
1G一块          1G存1块      取第一块

只需要读取a文件0-128M部分的内容时(1G一块需要扫描更多数据)

①在一些分块读取的场景,不够灵活,会带来额外的网络消耗
②在上传文件时,一旦发生故障,会造成资源的浪费

太小时:

文件a,128M

1M一块          128个块          生成128个块的映射信息
128M一块      1个块              一个块的映射信息

①块太小,同样大小的文件,会占用过多的NN的元数据空间
②块太小,在进行读写操作时,会消耗额外的寻址时间

6、副本数的概念指的是最大副本数

具体存放几个副本需要参考DN节点的数量,每个DN节点最多只能存储一个副本。

7、默认块大小为128M,128M指的是块的最大大小!每个块最多存储128M的数据,如果当前块存储的数据不满128M

存了多少数据,就占用多少的磁盘空间。

一个块只属于一个文件。

8、shell操作命令

hadoop fs : 既可以对本地文件系统进行操作还可以操作分布式文件系统。

hdfs dfs : 只能操作分布式文件系统。

9、块的属性

length: 块的实际大小

offset: 块的便宜量,这个块从文件的哪部分开始保存数据

二、HDFS的读写流程

1、HDFS的写数据流程

① 服务端启动HDFS中的NN和DN进程,提供一个分布式文件系统客户端

② 由客户端向NN发送请求,请求上传文件,NN对请求进行合法性检查(权限,路径是否合法,路径是否已经存在)

③ 如果合法,NN响应客户端允许上传

④ 客户端根据自己设置的块大小,读取文件中第一块的内容,请求NN分配DN列表

⑤NN参考客户端上传的文件的副本数,根据机架感知,返回对应的DN列表

⑥客户端会请求距离最近的DN节点,再由DN列表中的每个DN节点都请求距离最近的DN节点,建立数据传输通道

⑦ 通道建立完成,客户端将第一块的数据,封装为一个个packet,发送到通道的下一个节点

     通道的每一个DN节点在收到packet后,进行校验,检验合法,罗盘存储,将packet发送到下一个DN节点,回复客户端ack确认消息!

⑧ 第一个块传输完成后,DN向NN上报块的消息,只要有一个DN节点上报块信息,NN就认为这个块已经传输完成,通道关闭,开始下一个块的传输

⑨下一个块依次按照④-⑧流程传输

⑩ 所有的块传输完成后,NN响应客户端传输完成,客户端关闭输出流

2、异常写流程

①-⑥见上

⑦客户端每读取64K的数据,封装为一个packet,封装成功的packet,放入到一个队列中,这个队列称为dataQuene(待发送数据包)

在发送时,先将dataQuene中的packet按顺序发送,发送后再放入到ackquene(正在发送的队列)。

每个节点在收到packet后,向客户端发送ack确认消息!

如果一个packet在发送后,已经收到了所有DN返回的ack确认消息,这个packet会在ackquene中删除!

假如一个packet在发送后,在收到DN返回的ack确认消息时超时,传输中止,ackquene中的packet会回滚到dataQuene。

重新建立通道,剔除坏的DN节点。建立完成之后,继续传输!

只要有一个DN节点收到了数据,DN上报NN已经收完此块,NN就认为当前块已经传输成功!

副本数如果暂时不满足条件,之后NN会自动检查,维护副本数!

3、读流程

① 启动服务端NN,DN进程,提供一个分布式文件系统客户端

② 由客户端向NN发送请求,请求下载一个文件,NN对请求进行合法性检查(权限,路径是否合法)

③ 如果合法,NN响应客户端允许下载,同时返回当前下载文件的所有元数据信息(块的映射信息)

④ 客户端根据返回的元数据信息,去每个对应的DN节点按照顺序依次下载每个块

4、拓扑距离

拓扑距离指网络中各个节点之间抽象的一种距离!通常指两个节点到达共同祖先节点的和,一般为2n

5、机架感知

2.7.2的默认的机架感知策略:

在本地机架挑选一个节点,保存第一个副本!如果本地机架没有DN节点,挑选距离本地机架最近的一个节点!

在本机机架挑选另一个节点,保存第二个副本!如果本地机架没有DN节点,挑选距离本地机架最近的一个节点!

在其他机架选择一个节点,保存第三个副本!

三、NN的工作原理

1、NN的作用

  • NN保存HDFS上所有文件的元数据!
  • NN负责接受客户端的请求!
  • NN负责接受DN上报的信息,给DN分配任务(维护副本数)!

2、元数据的存储

元数据存储在fsiamge文件+edits文件中

fsimage (元数据的快照文件)
edits (记录所有写操作的文件)

NN负责集群中所有客户端的请求和所有DN的请求!在一个集群中,通常NN需要一个高配置,保证NN可以及时处理客户端或DN的请求,一旦NN无法及时处理请求,HDFS就已经瘫痪。

2.1、fsimage文件的产生

① 第一次格式化NN时,此时会创建NN工作的目录,其次在目录中生成一个fsimage_000000000000文件

② 当NN在启动时,NN会将所有的edits文件和fsiamge文件加载到内存合并得到最新的元数据,将元数据持久化到磁盘生成新的fsimage文件

③ 如果启用了2nn,2nn也会辅助NN合并元数据,会将合并后的元数据发送到NN

2.2、edits

NN在启动之后,每次接受的写操作请求,都会将写命令记录到edits文件中,edits文件每间隔一定的时间和大小滚动!

2.3、txid

每次写操作命令,分解为若干步,每一步都会有一个id,这个id称为txid!

2.4、checkpoint

每次Namenode会定期进行checkpoint,主要了为了防止在运行期间产生大量的edits文件,导致下次重启时恢复时间过长!

定期将edits文件中新的内容,持久化到fsimage文件中,进行快照存储!

默认的机制:

  ① 没间隔1h,执行一次
  ② 距离上次,又新产生了100w次txns操作

2.5、SecondaryNamenode

如果配置了SecondaryNamenode,2nn会帮助NN进行checkpoint操作!

2.6、NN的元数据分两部分

①inodes : 记录在fsimage文件中或edits文件中

②blocklist: 块的位置信息(每次DN在启动后,自动上报的)

3、Datanode

3.1、作用

① 接受客户端的读写块请求

② DN负责维护块的完整性,通过定期检查块的校验和判断块是否损坏,损坏的块,DN会自动删除,在下次启动时,不会上报给NN

③ DN负责定期向NN汇报块的信息,接收NN的其他任务(复制块等)

3.2、Datanode的掉线时长

DN和NN每间隔dfs.heartbeat.interval(3s)进行一次心跳!

如果DN和NN上一次心跳距离当前时间,已经过了2*dfs.namenode.heartbeat.recheck-interval(5min)+10*dfs.heartbeat.interval,NN会将DN的状态标记为DEAD!

四、其他配置

1、NN的多目录配置

NN的多目录指对元数据进行多个目录的同时备份,通过hdfs-site.xml中的dfs.namenode.name.dir进行设置!

2、DN的多目录配置

如果机器添加了新的磁盘,希望DN在写入块时,向新磁盘的目录进行写入!

配置DN的多目录,通过hdfs-site.xml中dfs.datanode.data.dir进行配置

3、服役新节点

① 准备机器,安装软件,配置NN,RM的相关配置

② 启动datanode和nodemanager进程即可

服役了新的DN节点后,可以执行再平衡的命令,这个命令可以将集群中块进行重新平衡分配!
./start-balancer.sh

4、白名单

  • 白名单是为了阻止某个进程加入集群!
  • 白名单之外的机器,无法进入集群!
  • 白名单通过hdfs-site.xml中的dfs.hosts配置!
  • 可以使用 hdfs dfsadmin -refreshNodes刷新配置,读取此配置信息!

5、黑名单

  • 退役datanode!
  • 黑名单通过hdfs-site.xml中的dfs.hosts.exclude配置!
  • 黑名单中的机器在最后一次启动时,会将当前机器的块移动到其他节点!

注意: 如果当前集群中在线的DN节点不满足某些文件的副本数要求,当前退役节点是无法退役完成!

 

五、总结

1、 NN主要负责元数据的存储

2、两种存储的文件格式

edits: 在NN启动后,保存新写入的命令

fsimage: 在合并了edits和fsimage文件后,将新的元数据持久化到新的fsimage文件中

合并的时机: 需要满足checkpoint的条件
① 默认1h
② 两次checkpoint期间已经额外产生了100w txid的数据

3、存储的元数据分为两种

① inodes : 记录文件的属性和文件由哪些块组成,记录到edits和fsimage文件中

② 块的位置映射信息: 由NN启动后,接收DN的上报,动态生成!

4、NN的启动过程

① 先加载fsimage_000000xx文件

② 将fsimage文件xx之后的edits文件加载

③ 合并生成最新的元数据,记录checkpoint,如果满足要求,执行saveNamespace操作,不满足等满足后执行

  saveNamespace操作必须在安全模式执行

④ 自动进入安全模式,等待DN上报块
  DN上报的块的最小副本数总和 / 块的总数 > 0.999,自动在30s离开安全模式!

  安全模式只能有限读,不能写!

posted @ 2022-03-01 22:24  bug开发工程师  阅读(141)  评论(0编辑  收藏  举报