Hadoop-005-HDFS分布式文件存储原理

一、HDFS数据如何存储

分布式存储:每个服务器(节点)存储文件的一部分, 本文提到的part只是为方便理解, 指的文件部分数据, 并不是真实存在的概念
已部署三节点集群,有一个文件file需要存储 file文件会被分成3份 part1 part2 part3 block block block block block block block block block

二、HDFS如何保证安全

问题1、文件大小不同,如何管理?

HDFS集群设定统一的管理单位: Block块 , 它是HDFS集群最小的物理单位, 默认大小是256MB ,支持修改, 文件分成3 个Part,每个Part又分为3个Block块存入对应服务器

问题2、如何避免某个Block丢失或者损坏?

如上所示分为多个Block块存储, 如果任意一个Block块 丢失就导致文件不完整了
Block块 越多,损坏的几率就越大

通过配置多个副本可以解决, 给每个Block块 设置2个副本(可修改),每个块都有2个副本备份在其它服务器上,大大提升了数据安全性; 如下图所示

三、Block的配置

1、如何配置HDFS数据块的副本数量

如果需要自定义这个属性,请修改每一台服务器的hdfs-site.xml文件,并设置此属性。这个属性默认是3,一般情况下无需主动配置

powershell 复制代码
<property>
    <name>dfs.replication</name>
    <value>3</value>
</property>

除了配置文件外,可在上传文件的时候,临时决定被上传文件以多少个副本存储。

powershell 复制代码
hadoop fs -D dfs.replication=2 -put test.txt /
如上命令,就可以在上传test.txt的时候,临时设置其副本数为2

对于已经存在HDFS的文件,修改dfs.replication属性不会生效,如果要修改已存在文件可以通过命令

powershell 复制代码
hadoop fs -setrep [-R] 2 path
如上命令,指定path的内容将会被修改为2个副本存储。
	-R选项可选,使用-R表示对子目录也生效。

2、fsck命令检查文件的副本数

使用hdfs提供的fsck命令来检查文件的副本数

powershell 复制代码
hdfs fsck path [-files [-blocks [-locations]]]
	fsck可以检查指定路径是否正常
	-files可以列出路径内的文件状态
	-files -blocks  输出文件块报告(有几个块,多少副本)
	-files -blocks -locations 输出每一个block的详情

3、调整Block块默认大小

hdfs默认设置为256MB一个,也就是1GB文件会被划分为4个block存储。

Block块大小可以在 hdfs-site.xml中配置如下属性参数调整:

powershell 复制代码
<property>
   <name>dfs.blocksize</name>
   <value>268435456</value>
   <description>设置HDFS块大小,单位是b,如上设置为256MB</description>
</property>

四、Namenode元数据

1、如何管理Block块

NameNode基于一批edits和一个fsimage文件的配合, 完成整个文件系统的管理和维护

edits文件,是一个流水账文件,记录了hdfs中的每一次操作,以及本次操作影响的文件其对应的block, 将全部的edits文件,合并为最终结果,即可得到一个FSImage文件。
合并元数据的事情就是SecondaryNameNode干的, 它会通过http从NameNode拉取数据(edits和fsimage)

然后合并完成后提供给NameNode使用。

powershell 复制代码
1. 每次对HDFS的操作,均被edits文件记录
2. edits达到大小上限后,开启新的edits记录
3. 定期进行edits的合并操作
如当前没有fsimage文件,  将全部edits合并为第一个fsimage
如当前已存在fsimage文件,将全部edits和已存在的fsimage进行合并,形成新的fsimage
powershell 复制代码
对于元数据的合并,是一个定时过程,基于以下只要有一个达到条件就执行。:
dfs.namenode.checkpoint.period,默认3600(秒)即1小时
dfs.namenode.checkpoint.txns,默认1000000,即100W次事务


检查是否达到条件,默认60秒检查一次,基于:
dfs.namenode.checkpoint.check.period,默认60(秒),来决定

2、HDFS写入流程

powershell 复制代码
1. 客户端向NameNode发起请求
2. NameNode审核权限、剩余空间后,满足条件允许写入,并告知客户端写入的DataNode地址
3. 客户端向指定的DataNode发送数据包
4. 被写入数据的DataNode同时完成数据副本的复制工作,将其接收的数据分发给其它DataNode
5. DataNode1复制给DataNode2,然后基于DataNode2复制给Datanode3和DataNode4
6. 写入完成客户端通知NameNode,NameNode做元数据记录工作

注意:

1.NameNode不负责数据写入,只负责元数据记录和权限审批

2.客户端直接向1台DataNode写数据,这个DataNode一般是离客户端最近(网络距离)的那一个

3.数据块副本的复制工作,由DataNode之间自行完成(构建一个PipLine,按顺序复制分发,如图1给2, 2给3和4)

3、HDFS读取流程

powershell 复制代码
1.客户端向NameNode申请读取某文件
2.NameNode判断客户端权限等细节后,允许读取,并返回此文件的block列表
3.客户端拿到block列表后自行寻找DataNode读取即可

1.数据同样不通过NameNode提供

2.NameNode提供的block列表,会基于网络距离计算尽量提供离客户端最近的

这是因为1个block有3份,会尽量找离客户端最近的那一份让其读取

相关推荐
子非衣11 小时前
CenOS7安装RabbitMQ(含延迟队列插件)
分布式·rabbitmq·ruby
linweidong11 小时前
中科曙光Java后端开发面试题及参考答案
分布式·设计模式·spring mvc·tcp协议·三次握手·后端开发·java面经
rustfs12 小时前
使用 RustFS和 Arq,打造 PC 数据安全备份之道
分布式·docker·云原生·rust·开源
后季暖12 小时前
kafka原理详解
分布式·kafka
回家路上绕了弯13 小时前
Seata分布式事务实战指南:从原理到微服务落地
分布式·后端
LDG_AGI13 小时前
【机器学习】深度学习推荐系统(二十六):X 推荐算法多模型融合机制详解
人工智能·分布式·深度学习·算法·机器学习·推荐算法
利刃大大13 小时前
【RabbitMQ】重试机制 && TTL && 死信队列
分布式·后端·消息队列·rabbitmq·队列
talle202113 小时前
Hadoop分布式资源管理框架【Yarn】
大数据·hadoop·分布式
LDG_AGI14 小时前
【机器学习】深度学习推荐系统(二十五): X 推荐算法特征系统详解:230+ 特征全解析
人工智能·分布式·深度学习·算法·机器学习·推荐算法
LDG_AGI14 小时前
【机器学习】深度学习推荐系统(二十八):X 推荐算法listwiseRescoring(同刷多样性降权)机制详解
人工智能·分布式·深度学习·算法·机器学习·推荐算法