赞
踩
Hadoop分布式文件系统(HDFS)是一种适用于大数据处理的分布式文件系统。在HDFS中,数据被分割成块并分布在多台机器上存储,以实现高容量、高可靠性和高吞吐量的数据存储和处理。以下是关于HDFS的读写流程、NameNode和Secondary NameNode、DataNode的简单介绍。
(1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode审核权限、剩余空间后,满足条件允许写入;
(2)客户端请求第一个 Block上传到哪几个DataNode服务器上;
(3)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3;
(4)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
(5)dn1、dn2、dn3逐级应答客户端。
(6)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
(7)当一个Block传输完成之后,客户端再次请求NameNode上传下一个Block的服务器。(重复执行2-7步)。
注意:
HDFS通过机架感知来提高数据的读写性能和可靠性。机架感知是指在选择数据副本节点时,将优先选择同一机架内的节点,以减少数据跨机架传输的延迟和带宽消耗。具体的机架感知策略可以通过配置文件进行调整。
简单来说就是,当文件副本数为三时,HDFS的放置策略是,如果写入程序位于数据节点上,则将一个副本放置在本地机器上,否则放置在与写入程序位于同一机架中的随机数据节点上、另一个副本放在不同(远程)机架中的节点上,最后一个副本则放在同一远程机架中的不同节点上。
(1)客户端通过DistributedFileSystem向NameNode请求读取某文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
(2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
(3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
(4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。
思考:NameNode中的元数据是存储在哪里的?
首先,我们做个假设,如果存储在NameNode节点的磁盘中,因为经常需要进行随机访问,还有响应客户请求,必然是效率过低。因此,元数据需要存放在内存中。但如果只存在内存中,一旦断电,元数据丢失,整个集群就无法工作了。因此产生在磁盘中备份元数据的FsImage。
这样又会带来新的问题,当在内存中的元数据更新时,如果同时更新FsImage,就会导致效率过低,但如果不更新,就会发生一致性问题,一旦NameNode节点断电,就会产生数据丢失。因此,引入Edits文件(只进行追加操作,效率很高)。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中。这样,一旦NameNode节点断电,可以通过FsImage和Edits的合并,合成元数据。
但是,如果长时间添加数据到Edits中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。因此,需要定期进行FsImage和Edits的合并,如果这个操作由NameNode节点完成,又会效率过低。因此,引入一个新的节点SecondaryNamenode,专门用于FsImage和Edits的合并。
NameNode被格式化之后,将在/opt/module/hadoop-3.2.4/data/dfs/name/current目录中产生如下文件:
FsImage文件:HDFS文件系统元数据的一个永久性检查点,其中包含HDFS文件系统的所有目录和文件inode的序列化信息。
Edits文件:存放HDFS文件系统的所有更改操作的路径,文件系统客户端执行的所有写操作首先会被记录到Edits文件中。
seen_txid文件:保存的是一个数字,即最后一个edits的数字。
每次NameNode启动的时候都会将FsImage文件读入内存,加载Edits里面的更新操作,保证内存中的元数据信息是最新的、同步的,可以看成NameNode启动的时候就将FsImage和Edits文件进行了合并。
(1)查看oiv和oev命令
[amo@hadoop102 current]$ hdfs
oiv apply the offline fsimage viewer to an fsimage
oev apply the offline edits viewer to an edits file
(2)基本语法
hdfs oiv -p 文件类型 -i镜像文件 -o 转换后文件输出路径
(3)案例实操
[amo@hadoop102 current]$ hdfs oiv -p XML -i fsimage_0000000000000000877 -o /opt/module/fsimage.xml
2024-03-12 22:08:53,287 INFO offlineImageViewer.FSImageHandler: Loading 5 strings
2024-03-12 22:08:53,329 INFO namenode.FSDirectory: GLOBAL serial map: bits=29 maxEntries=536870911
2024-03-12 22:08:53,329 INFO namenode.FSDirectory: USER serial map: bits=24 maxEntries=16777215
2024-03-12 22:08:53,329 INFO namenode.FSDirectory: GROUP serial map: bits=24 maxEntries=16777215
2024-03-12 22:08:53,329 INFO namenode.FSDirectory: XATTR serial map: bits=24 maxEntries=16777215
[amo@hadoop102 current]$ cat /opt/module/fsimage.xml
思考:Fsimage中没有记录块所对应DataNode,为什么?
在集群启动后,要求DataNode上报数据块信息,并间隔一段时间后再次上报。
(1)基本语法
hdfs oev -p 文件类型 -i 编辑日志 -o 转换后文件输出路径
(2)案例实操
[amo@hadoop102 current]$ hdfs oev -p XML -i edits_0000000000000000876-0000000000000000877 -o /opt/module/edits.xml [amo@hadoop102 current]$ cat /opt/module/edits.xml <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <EDITS> <EDITS_VERSION>-65</EDITS_VERSION> <RECORD> <OPCODE>OP_START_LOG_SEGMENT</OPCODE> <DATA> <TXID>876</TXID> </DATA> </RECORD> <RECORD> <OPCODE>OP_END_LOG_SEGMENT</OPCODE> <DATA> <TXID>877</TXID> </DATA> </RECORD> </EDITS> [amo@hadoop102 current]$
思考:NameNode如何确定下次开机启动的时候合并哪些Edits?
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600s</value>
</property>
<property>
<name>dfs.namenode.checkpoint.txns</name>
<value>1000000</value>
<description>操作动作次数</description>
</property>
<property>
<name>dfs.namenode.checkpoint.check.period</name>
<value>60s</value>
<description> 1分钟检查一次操作次数</description>
</property>
<property>
<name>dfs.blockreport.intervalMsec</name>
<value>21600000</value>
<description>Determines block reporting interval in milliseconds.</description>
</property>
⦁ DN扫描自己节点块信息列表的时间,默认6小时
<property>
<name>dfs.datanode.directoryscan.interval</name>
<value>21600s</value>
<description>Interval in seconds for Datanode to scan data directories and reconcile the difference between blocks in memory and on the disk.
Support multiple time unit suffix(case insensitive), as described
in dfs.heartbeat.interval.
</description>
</property>
思考:如果电脑磁盘里面存储的数据是控制高铁信号灯的红灯信号(1)和绿灯信号(0),但是存储该数据的磁盘坏了,一直显示是绿灯,是否很危险?同理DataNode节点上的数据损坏了,却没有发现,是否也很危险,那么如何解决呢?
如下是DataNode节点保证数据完整性的方法。
需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval的单位为秒。
<property>
<name>dfs.namenode.heartbeat.recheck-interval</name>
<value>300000</value>
</property>
<property>
<name>dfs.heartbeat.interval</name>
<value>3</value>
</property>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。