0.概述

(1)分布式文件管理系统,适合一次写入,多次读出
(3)仅支持数据append(追加),不支持随机修改。

1.HDFS组成

image.png
image.png

2.文件块大小

image.png
image.png
重点:
(1)太小,寻址时间长
(2)太大,传输时间长,处理速度慢
块大小设置主要取决于磁盘传输速率。

3.写数据流程

3.1特殊点总结

1.请求上传时,NN需要检查是否存在,是否覆盖。
7.网络上传输数据使用数据包packet,包大小例如4k,包由thunk(512字节+4位校验码组成)
7.在DN中数据先到内存,再到磁盘。

(1)中途DN2挂了,汇报后找下一个节点继续生成副本,不会结束。重新启动后删除未完成或完成了的副本,因为过时了。
(2)DN每隔一段时间会向NN汇报一次块信息。
image.png
(1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
(2)NameNode返回是否可以上传。
(3)客户端请求第一个 Block上传到哪几个DataNode服务器上。
(4)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。
(5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
(6)dn1、dn2、dn3逐级应答客户端。
(7)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
(8)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。

3.2如果他们之间的一个datanode突然坏掉了怎么办。

1、如果传输过程中,有某个datanode出现了故障,那么当前的pipeline会被关闭,出现故障的datanode会从当前的pipeline中移除,剩余的block会继续剩下的datanode中继续以pipeline的形式传输,同时Namenode会分配一个新的datanode,保持replicas设定的数量。
2、关闭pipeline,将ack queue中的数据块放入data queue的开始。
3、当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后能够察觉其数据块是过时的,会被删除。
4、失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点。
5、元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份。
6、客户端调用create()来创建文件
7、DistributedFileSystem用RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件。
8、元数据节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建新文件。
9、DistributedFileSystem返回DFSOutputStream,客户端用于写数据。
10、客户端开始写入数据,DFSOutputStream将数据分成块,写入data queue。
11、Data queue由Data Streamer读取,并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块)。分配的数据节点放在一个pipeline里。
12、Data Streamer将数据块写入pipeline中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。
13、DFSOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功。

4.节点间的距离计算

image.png
1.副本存储节点选择:不同节点或机架
2.读数据时就近原则

5.副本存储节点选择(机架感知)

image.png
2.0的时候,第二个副本跟第一个副本在同一个机架,第三个副本在不同机架。
(2)源码说明
Crtl + n 查找BlockPlacementPolicyDefault,在该类中查找chooseTargetInOrder方法。

6.读数据流程

1.NN查看是否存在目标文件,是否剪切源数据。
2.读取数据先就近原则挑选最近的服务器,距离相同时则随机。
image.png

(1)客户端通过DistributedFileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
(2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
(3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
(4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。

7.NN和2NN工作机制

NN和2NN工作机制.xlsx

7.1思路

问题1:NN中元数据的存储?
NN中元数据存储在内存中,但内存断电丢失,所以在磁盘中备份元数据fsimage

问题2:如何更新fsimage?
同步更新效率太低,延迟更新数据丢失,因此引入edits文件,只追加修改元数据的命令,之后通过合并edits和fsimage合成元数据。

问题3:NN如何向2NN磁盘写入fsimage?
NN中的edits传输到2NN中,2NN将它读取到内存并恢复成元数据。edits文件来自于客户端输入的命令。

问题4:edits过大怎么处理?
引入新节点SecondaryNamenode专门用于fsimage和edits的合并,同时负责往NN的磁盘写入fsimage。

问题5:NN什么时候将edits传输给2NN?
触发checkpoint。1.预防太少:一小时一次
2.数据太多:操作命令次数达到100万次。

问题6:edits传输时怎么记录命令?
生成edits2_inprogress,即引入日志的滚动。
image.png

因此,2NN永远比NN少一部分数据(edits_inprogress),不能作为热备。

7.2查看fsimage和edits

image.png

(1)oiv查看fsimage

hdfs oiv -p 文件类型(xml) -i镜像文件 -o 转换后文件输出路径
例:
hdfs oiv -p xml -i fsimage_0000025 ./fsimage.xml

(2)oev查看edits

hdfs oev -p 文件类型(xml) -i编辑日志 -o 转换后文件输出路径
hdfs oev -p xml -i edits_00012-00013 -o ./edits.xml

(3)Fsimage没有记录块对应的DataNode,为什么?

因为集群启动后,DataNode后上报数据块的信息,并且每隔一段时间后再次上报。

(4)NameNode如何确定下次开机启动时合并那些edits?

合并后缀带prossed字样的。

7.3checkpoint设置

对hdfs-site.xml进行设置

(1)时间

默认2NN每小时执行一次

  1. <property>
  2. <name>dfs.namenode.checkpoint.period</name>
  3. <value>3600</value>
  4. </property>

(2)次数

一分钟检查一次操作次数,次数达到100w时2NN执行一次

  1. <property>
  2. <name>dfs.namenode.checkpoint.txns</name>
  3. <value>1000000</value>
  4. <description>操作动作次数</description>
  5. </property>
  6. <property>
  7. <name>dfs.namenode.checkpoint.check.period</name>
  8. <value>60</value>
  9. <description> 1分钟检查一次操作次数</description>
  10. </property >

8.安全模式

安全模式下无法进行写操作,集群启动完成后才退出安全模式。
image.png

8.2安全模式相关操作

  1. 1bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式状态)
  2. 2bin/hdfs dfsadmin -safemode enter (功能描述:进入安全模式状态)
  3. 3bin/hdfs dfsadmin -safemode leave (功能描述:离开安全模式状态)
  4. 4bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式状态)

wait:在安全模式退出后立马执行相关操作。

9.DN工作机制

image.png

  1. DN中每个块都有一个对应的meta数据存放块的元数据。

一个数据块在DN上存储两个文件,一个数据本身,一个是元 数据包括数据块长度,校验和以及时间戳。

  1. DN每6小时(默认)向NN上传一次所有块的信息。
  2. DN每3s向NN发送一次心跳确定存活,如果NN有命令将随心跳一起回来。
  3. 10min+30s如果NN如果没有收到心跳,则认为该DN死亡。

9.2DN保证数据完整性

(1)当DataNode读取Block的时候,它会计算CheckSum。
(2)如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏。
(3)Client读取其他DataNode上的Block。
(4)常见的校验算法crc(32),md5(128),sha1(160)
(5)DataNode在其文件创建后周期验证CheckSum。
image.png
校验位越长越安全,但是效率越低。

9.3DN掉线时限参数设置

修改hdfs-site.xml 配置文件,其中heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval的单位为秒。

  1. <property>
  2. <name>dfs.namenode.heartbeat.recheck-interval</name>
  3. <value>300000</value>
  4. </property>
  5. <property>
  6. <name>dfs.heartbeat.interval</name>
  7. <value>3</value>
  8. </property>

10.添加新节点

1.克隆一台新机器
2.对新节点修改ip地址
3.修改hostname
4.所有节点的hosts都已经存在了hadoop105(如果没有需要添加)
5.删除hadoop根目录的data和logs(将/tmp/*删除)
因为data和logs都是hadoop102的。如果不删除会造成hadoop102和hadoop105节点无法正常运行。
6.works不用配置(works的作用 :在启动整个模块时会根据works中的地址去启动各节点的服务)。
注意:works不是决定谁是集群中的节点

11.退役节点

11.1白名单

只有白名单上的节点属于集群。

1.hadoop/etc/hadoop创建dfs.hosts文件
vim dfs.hosts
2.添加/删除白名单节点名
3.在hdfs.site.xml配置中添加内容
<property>
<name>dfs.hosts</name>
<value>/opt/module/hadoop-3.1.3/etc/hadoop/dfs.hosts</value>
</property>

4.刷新NN和yarn
hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes

5.数据不平衡进行均衡sbin
./start-balancer.sh

11.2黑名单

退役后才能去掉节点,退役可以防止数据丢失。

1.hadoop/etc/hadoop创建dfs.hosts.exclude文件
vim dfs.hosts.exclude
2.添加退役节点名
3.在hdfs.site.xml配置中添加内容
<property>
<name>dfs.hosts.exclude</name>
      <value>/opt/module/hadoop-3.1.3/etc/hadoop/dfs.hosts.exclude</value>
</property>

4.刷新NN和yarn

5.等待退役节点状态为decommissioned
(所有块已经复制完成),停止该节点及节点资源管理器。
注意:如果副本数是3,服役的节点小于等于3,
是不能退役成功的,需要修改副本数后才能退役

12.DN多目录配置

1.在hdfs.site.xml添加
<property>
        <name>dfs.datanode.data.dir</name>
<value>file:///${hadoop.tmp.dir}/dfs/data1,file:///${hadoop.tmp.dir}/dfs/data2</value>
</property>