day37-s-hadoop-hdfs
day37-s-hadoop-hdfs
hadoop-hdfs
NameNode工作机制

1 第一阶段:NameNode启动
1) 第一次启动NameNode格式化,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
2) 客户端对元数据进行增删改查的请求
3) NameNode记录操作日志,更新滚动日志
4) NameNode在内存中对元数据进行增删改查
2 第二阶段:Secondary NameNode工作
1) SecondaryNameNode 询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结果。
2) Secondary NameNode请求执行CheckPoint。
3) NameNode滚动正在写的Edits日志
4) 将滚动前的编辑日志和镜像文件拷贝到SecondaryNameNode
5) SecondaryNameNode加载编辑日志和镜像文件到内存,并合并
6) 生成新的镜像文件fsimage,chkpoint
7) 拷贝fsimage.chkpoint 到NameNode
8) NameNode将fsimage.chkpoint重命名成fsimage
NameNode和SecondaryName Node工作机制详解
Fsimage:NameNode内存中元数据序列化后形成的文件
Edits:记录客户端更新元数据信息的每一步操作(可通过Edits运算出元数据)
NameNode启动时,先滚动Edits并生成一个空的edits.inprogress,然后加载Edits和Fsimage到内存中,此时NameNode内存就持有最新的元数据信息。Client开始对NameNode发送元数据的增删改查的请求,这些请求的操作首先会被记录到edits.inprogres中(查询元数据的操作不会被记录在Edits中,因为查询操作不会更改元数据信息),如果此时NameNode挂掉,重启后会从Edits中读取元数据的信息。然后,NameNode会在内存中执行元数据的增删改查的操作。
由于Edits中记录的操作会越来越多,Edits文件会越来越大,导致NameNode在启动加载Edits时会很慢,所以需要对Edits和Fsimage进行合并(所谓合并,就是将Edits和Fsimage加载到内存中,照着Edits中的操作一步步执行,最终形成新的Fsimgage)。SecondaryNameNode的作用就是帮助NameNode进行Edits和Fsimage的合并工作。
SecondaryNameNode首先会询问NameNode是否需要CheckPoint(触发CheckPoint需要满足两个条件中的任意一个,定时时间到和Edits中数据写满了)。直接带回NameNode是否检查结果。SecondaryNameNode执行CheckPoint操作,首先会让NameNode滚动Edits并生成一个空edits.inprogress,滚动Edits的目的是给Edits打个标记,以后所有新的操作都写入edits.inprogress,其他未合并的Edits和Fsimage会拷贝到SecondaryNameNode的本地,然后将拷贝的Edits和Fsimage加载到内存进行合并,生成fsiage.chkpoint,然后将fsimage.chkpoint拷贝到NameNode,重命名为Fsimage后替换掉原来的Fsimage。NameNode在启动时就只需要加载之前未合并的Edits和Fsimage即可,因为合并过的Edits中的元数据信息已经被记录在Fsiage中。
Fsimage(镜像文件)和Edits(编辑日志)解析
Fsimage是在什么时候产生的:
NameNode被格式化之后,会产生fsimage文件
1 Fsimage文件:HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目录和文件inode的序列化信息
2 Edits文件:存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到Edits文件中
3 seen_txid文件保存的是一个数字,就是最后一个edits_的数字
4 每次NameNode启动的时候都会将Fsimage文件读入内存,加载Edits里面的更新操作,保证内存中的元数据信息是最新的、同步的,可以堪称NameNode启动的时候就将Fsimage和Edits文件进行了合并。
oiv查看Fsimage文件
产看oiv和oev命令
oev apply the offline edits viewer to an edits file 转换edits文件
oiv apply the offline fsimage viewer to an fsimage 转换fsimage文件
基本语法
hdfs oiv -p 文件类型 -i 镜像文件 -o 转换后文件输出路径
hdfs oiv -p xml -i 文件 -o 路径
CheckPoint时间设置
通常情况下,SecondaryNameNode每隔一个小时执行依次
配置文件
hdfs-default.xml
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
</property>
一分钟检查一次操作次数,3当操作次数达到1百万时,SecondaryNameNode执行一次
<property>
<name>dfs.namenode.checkpoint.txns</name>
<value>1000000</value>
<description>操作动作次数</description>
</property>
<property>
<name>dfs.namenode.checkpoint.check,period</name>
<value>60</value>
<description>1分钟检查一个操作次数</description>
</property>
NameNode故障处理(扩展)
NameNode故障后,可以采用如下两种方法恢复数据。
- 方法1:将SecondaryNameNode中数据拷贝到NameNode存储数据的目录
kill -9 NameNode
删除NameNode存储的数据(hadoop/data/tmp/dfs/name)
拷贝SecondaryNameNode中数据到原NameNode存储数据目录
重新启动NameNode
-
方法2:使用-importCheckpoint 选项启动NameNode守护进程,从而将SecondaryNameNode中数据拷贝到NameNodezhong
- 修改hdfs-site.xml
<property> <name>dfs.namenode.checkpoint.period</name> <value>120</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/opt/module/hadoop-3.1.3/data/tmp/dfs/name</value> </property>- kill -9 NameNode进程
- 删除NameNode存储的数据(hadoop/data/tmp/dfs/name)
- 如果SecondaryNameNode不和NameNode在一个主机节点上,需要将SecondaryNameNode存储数据的目录拷贝到NameNode存储数据的平级目录,并删除in_use.lock文件
secondaryNameNode 没有edits的数据
fsimage:不能查看数据保存在那个节点中,这个元数据保存在内存中
edits:对元数据的操作
集群安全模式
概述
1 NameNode启动
NameNode启动时,首先将镜像文件(Fsimage)载入内存,并执行编辑日志(Edits)中的各项操作。一旦在内存中成功建立文件系统元数据的映像,则创建一个新的Fsimage文件和一个空的编辑日志。此时NameNode开始监听DataNode请求。在这个过程期间,NameNode一直运行在安全模式,即NameNode的文件系统对于客户端来说是只读的。
2 DataNode启动
系统中的数据块的位置并不是由NameNode维护的,而是以块列表的形式存储在DataNode中。在系统的正常操作期间,NameNode会在内存中保留所有块位置的映射信息。在安全模式下,各个DataNode会向NameNode发送最新的块列表信息,NameNode了解到足够多的块位置信息之后,即可高效运行文件系统。
3 安全模式退出判断
如果满足“最小副本条件”,NameNode会在30秒钟之后就退出安全模式。所谓的最小副本条件指的是在整个文件系统中99.99%的块满足最小副本级别(默认值:dfs.replication.min=1)。在启动一个刚刚格式化的HDFS集群时,因为系统中还没有任何块,所以NameNode不会进入安全模式。
基本语法
集群处于安全模式,不能执行重要操作(写操作)。集群启动完成后,自动退出安全模式。
hdfs dfsadmin -safemode get 查看安全模式状态
hdfs dfsadmin -safemode enter 进入安全模式状态
hdfs dfsadmin -safemode leave 离开安全模式状态
hdfs dfsadmin -safemode wait 等待安全模式状态
NameNode多目录配置
可以让NameNode的数据存到多个目录
在不同的目录存储相同的数据,为什么要这么做?
可以有备份,保证数据的安全性,可靠性。
linux支持挂载,每个目录挂载一个磁盘,这要就达到了一个备份的效果。
每个目录必须挂载不同的磁盘,这样才有意义。在一个磁盘上做多目录就是没有意义的。
- 修改hdfs-site.xml
<!--设置多目录,就在namenode保存的数据的路径中,添加一个路径即可-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.data.dir}/name1;file://${hadoop.data.dir}/name2</value>
</property>
在第一次进行namenode格式化的时候,才会生效
第一个规划集群的时候,就配置好的。
DataNode
DataNode工作机制

1 一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,快数据的校验和,以及时间戳
2 DataNode启动后向NameNode注册,通过后,周期性(6小时)的向NameNode上报所有的快信息
3 心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。
4 集群运行中可以加入和退出一些机器
DataNode节点保证数据完整性的方法
1 当DataNode读取Block的时候,他会计算
2 如果计算后CheckSum,与Block创建时值不一样,说明Block已经损坏
3 Client读取其他DataNode上2的Block
4 常见的校验算法crc(32) md5(128) sha1(160)
5 DataNode在其文件创建后周期验证CheckSum
数据完整性

掉线时限设置
1. DataNode进程死亡或者网络故障造成DataNode无法与NameNode通信
2. NameNode不会立即把该节点判定为死亡,要经过一段时间,这段时间暂称作超时时长
3. HDFS默认的超时时长为10分30秒
4. 如果定义超过时间TimeOut,则超时时长的计算公式为:
TimeOut=2*dfs.namenode.heartbeat.recheck-interval+10*dfs.heartbeat.interval
而默认的dfs.namenode.heratbeat.recheck-interval大小为5分钟,dfsheartbeat.interval默认为3秒
需要注意的时hdfs-site.xml配置文件中的heartbeat.recheck.interval 的单位为毫秒
dfs.heartbeat.interval的单位为秒
- hdfs-site.xml
<property>
<name>dfs.blockreport.intervalMsec</name>
<value>21600000</value>
<description>Determines block reporting interval in milliseconds.</description>
</property>
- hdfs-site.xml
<property>
<name>dfs.namenode.heartbeat.recheck-interval</name>
<value>300000</value>
</property>
<property>
<name>dfs.heartbeat.interval</name>
<value>3</value>
</property>
服役新数据节点
- 需求
随着公司业务的增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有集群基础上动态添加新的数据节点
- 环境准备
1. 在node主机克隆一台新主机
2. 修改IP地址和主机名称
3. 删除原来HDFS文件系统留存的文件(/opt/modult/hadoop/data和log)
4. source 配置文件
- 服役新节点具体步骤
- 直接启动DataNode,即可关联到集群
退役旧数据节点
添加白名单和黑名单
添加到白名单的主机节点,都允许访问NameNode,不在白名单的主机节点,都会被直接退出
添加到黑名单的主机节点,不允许访问NameNode,会在数据迁移后退出
实际情况下,白名单用于确定允许访问NameNode的DataNode节点,内容配置一般与workers文件内容一直。白名单用于在集群运行过程中退役DataNode节点。
配置白名单和黑名单的步骤
- 在NameNode的/opt/module/hadoop-3.1.3/etc/hadoop目录下分别创建whitelist和blacklist
touch whitelist
touch blacklist
- whitelist中添加
node1
node2
node3
node4
- 在NameNode的hdfs-site.xml 配置文件中增加dfs.hosts 和 dfs.hosts.exclude配置
<property>
<name>dfs.hosts</name>
<value>/opt/module/hadoop-3.1.3/etc/hadoop/whitelist</value>
</property>
<property>
<name>dfs.hosts.exclude</name>
<value>/opt/module/hadoop-3.1.3/etc/hadoop/blacklist</value>
</property>
-
配置分发
-
重新启动集群
黑名单退役
准备使用黑名单退役
-
编辑blacklist,添加node4
-
刷新NameNode
hdfs dfsadmin -refershNodes

此时的node4节点处于Decommissioning退役中(推荐使用)
此时node4 需要把自己维护的数据 迁移到别的节点里面

此时node4节点处于Decommissioned 已经退役掉了
此时node4依旧与namenode发送通信,只不过被nameNode拒绝,node4仍然活着
白名单退役【不推荐】
白名单退役会直接将节点抛弃,没有迁移数据的过程,会造成数据丢失
会直接把节点给关闭掉
DataNode多目录的设置
DataNode也可以配置多个目录,每个目录存储的数据不一样。即:数据不是副本
具体配置
- hdfs-site.xml
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///${hadoop.tmp.dir}/data1,file:///${hadoop.tmp.dir}/data2</value>
</property>
-
停止集群,删除data和logs中所有数据
-
格式化集群并重新启动
hdfs namenode -format # 格式化集群
start-dfs.sh # 重新启动
hadoop2.x新特性
小文件存档
- HDFS存储小文件弊端
每个文件均按快存储,每个块的元数据存储在NameNode的内存中,因此HDFS存储小文件会非常低效。因为大量的小文件会耗尽NameNode中的大部分内存。但注意,存储小文件所需要的磁盘容量和数据库的大小无关。例如:一个1MB的文件设置为128MB的块存储,实际使用的是1MB的磁盘空间,而不是128MB。
- 解决存储小文件
HDFS存档文件或HAR文件,是一个跟高效的文件存档工具,它将文件存入HDFS块,在减少NameNode内存使用的同时,允许对文件进行透明的访问。具体说来,HDFS存档文件对内还是一个一个独立文件,对NameNode而言却是一个整体,减少了NameNode的内存。
-
案例操作
- 需要启动YARN进程
yarn-start.sh- 把目录里面的所有文件归档成一个xx.har的归档文件,并保存到指定目录
hadoop archive -archiveName input.har -p /samilfile /

smailfile.har 对于namenode而言就是一个完整的文件 、 _SUCCESS _index _masterindex part-0- 查看归档文件
hadoop fs -ls har:///smailfile.harFound 3 items -rw-r--r-- 3 atguigu supergroup 147145 2022-04-25 01:19 har:///smailfile.har/LICENSE.txt -rw-r--r-- 3 atguigu supergroup 21867 2022-04-25 01:19 har:///smailfile.har/NOTICE.txt -rw-r--r-- 3 atguigu supergroup 1366 2022-04-25 01:19 har:///smailfile.har/README.txt- 解归档文件
需要对小文件进行计算,需要对 har 文件进行解档 hadoop fs -cp har:///smailfile.har/* /smailfile
回收站
开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除的作用。
开启回收站功能参数说明
1. 默认值fs.trash.interval=0, 0标识禁用回收站;其他值标识设置文件的存活时间
2. 默认值fs.trash.checkpoint.interval=0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等
3. 要求fs.trash.checkpoint.interval<=fs.trash.interval
回收站工作机制

启用回收站
- 修改core-site.xml
<!--单位分钟-->
<property>
<name>fs.trash.interval</name>
<value>1</value>
</property>
<property>
<name>fs.trash.checkpoint.interval</name>
<value>1</value>
</property>
查看回收站
回收站在集群中的路径:/user/atguigu/.Trash/..
修改访问垃圾会后在用户名称
- 进入垃圾回收站用户名称,默认是dr.who
[core-site.xml]
<property>
<name>hadoop.http.staticuser.user</name>
<value>atguigu</value>
</property>
- 通过程序删除的文件不会经过回收站,需要调用moveToTrash()才进入回收站
Trash trash=new Trash(conf);
trash.moveToTrash(path)
- 恢复回收站数据
hadoop fs -mv 回收占的文件 指定路径
- 删除不走回收站
hadoop fs -rm -skipTrash 文件
- 清空回收站
hadoop fs -expunge
其他
系统
系统:是指部分组成的整体。
系统是由相互作用依赖的若干组成部分结合而成的,具有特定功能的有机整体,而且这个有机整体又是它从属的更大系统的组成部分。
虚拟内存限制问题
在通过mapreudce进行计算的时候,需要去分配内存,如果用的内存超出虚拟内存的限制,就会把当前的这个job关闭。

浙公网安备 33010602011771号