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离开安全模式!
安全模式只能有限读,不能写!