HDFS元数据管理机制
问题1:NameNode如何管理和存储元数据?
计算机中存储数据两种:内存或者是磁盘
元数据存储磁盘:存储磁盘无法面对客户端对元数据信息的任意的快速低延迟的响应,但是安全性高
元数据存储内存:元数据存放内存,可以高效的查询以及快速响应客户端的查询请求,数据保存在内
存,如果断点,内存中的数据全部丢失。
解决方案:内存+磁盘;NameNode内存+FsImage的文件(磁盘)
新问题:磁盘和内存中元数据如何划分
两个数据一模一样,还是两个数据合并到一起才是一份完整的数据呢?
一模一样:client如果对元数据进行增删改操作,需要保证两个数据的一致性。FsImage文件操作起来
效率也不高。
两个合并=完整数据:NameNode引入了一个edits文件(日志文件:只能追加写入)edits文件记录的
是client的增删改操作,
不再选择让NameNode把数据dump出来形成FsImage文件(这种操作是比较消耗资源)。

元数据管理流程图

  • 第一阶段:NameNode启动
    第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加
    载编辑日志和镜像文件到内存。
    客户端对元数据进行增删改的请求。
    NameNode记录操作日志,更新滚动日志。
    NameNode在内存中对数据进行增删改
  • 第二阶段:Secondary NameNode工作
    Secondary NameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否执
    行检查点操作结果。
    Secondary NameNode请求执行CheckPoint。
    NameNode滚动正在写的Edits日志
    将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。
    Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
    生成新的镜像文件fsimage.chkpoint。
    拷贝fsimage.chkpoint到NameNode。
    NameNode将fsimage.chkpoint重新命名成fsimage

Fsimage与Edits文件解析

NameNode在执行格式化之后,会在/opt/lagou/servers/hadoop-2.9.2/data/tmp/dfs/name/current
目录下产生如下文件

Fsimage文件:是namenode中关于元数据的镜像,一般称为检查点,这里包含了HDFS文件系统所有目录以及文件相关信息(Block数量,副本数量,权限等信息)
Edits文件 :存储了客户端对HDFS文件系统所有的更新操作记录,Client对HDFS文件系统所有的更新操作都会被记录到Edits文件中(不包括查询操作)
seen_txid:该文件是保存了一个数字,数字对应着最后一个Edits文件名的数字
VERSION:该文件记录namenode的一些版本号信息,比如:CusterId,namespaceID等


Fsimage文件内容

https://hadoop.apache.org/docs/r2.9.2/hadoop-project-dist/hadoophdfs/HdfsImageViewer.html

查看oiv和oev命令

[root@linux121 current]$ hdfs
oiv Offline Image Viewer View a Hadoop fsimage INPUTFILE using the specified
PROCESSOR,saving the results in OUTPUTFILE.
oev Offline edits viewer Parse a Hadoop edits log file INPUT_FILE and save results in
OUTPUT_FILE

基本语法
hdfs oiv -p 文件类型(xml) -i 镜像文件 -o 转换后文件输出路径

[root@linux121 current]$ cd /opt/lagou/servers/hadoop-
2.9.2/data/tmp/dfs/name/current
[root@linux121 current]$ hdfs oiv -p XML -i fsimage_0000000000000000265 -o
/opt/lagou/servers/fsimage.xml
[root@linux121 current]$ cat /opt/lagou/servers/fsimage.xml

内容

<?xml version="1.0"?>
<fsimage>
<version>
<layoutVersion>-63</layoutVersion>
<onDiskVersion>1</onDiskVersion>
<oivRevision>826afbeae31ca687bc2f8471dc841b66ed2c6704</oivRevision>
</version>
<NameSection>
<namespaceId>1393381414</namespaceId>
<genstampV1>1000</genstampV1>
<genstampV2>1024</genstampV2>
<genstampV1Limit>0</genstampV1Limit>
<lastAllocatedBlockId>1073741848</lastAllocatedBlockId>
<txid>265</txid>
</NameSection>
<INodeSection>
<inode>
<id>16398</id>
<type>DIRECTORY</type>
<name>history</name>
<mtime>1592376391028</mtime>
<permission>root:supergroup:0777</permission>
<nsquota>-1</nsquota>
<dsquota>-1</dsquota>
</inode>
<inode>
<id>16399</id>
<type>DIRECTORY</type>
<name>done_intermediate</name>
<mtime>1592375256896</mtime>
<permission>root:supergroup:1777</permission>
<nsquota>-1</nsquota>
<dsquota>-1</dsquota>
</inode>
<inode>
<id>16400</id>
<type>DIRECTORY</type>
<name>root</name>
<mtime>1592378079208</mtime>
<permission>root:supergroup:0777</permission>
<nsquota>-1</nsquota>
<dsquota>-1</dsquota>
</inode>
<inode>
<id>16413</id>
<type>FILE</type>
<name>job_1592375222804_0001-1592375231176-root-word+count-
1592375281926-1-1-SUCCEEDED-default-1592375261492.jhist</name>
<replication>3</replication>
<mtime>1592375282039</mtime>
<atime>1592375281980</atime>
<preferredBlockSize>134217728</preferredBlockSize>
<permission>root:supergroup:0777</permission>
<blocks>
<block>
<id>1073741834</id>
<genstamp>1010</genstamp>
<numBytes>33584</numBytes>
</block>
</blocks>
<storagePolicyId>0</storagePolicyId>
</inode>
<inode>
<id>16414</id>
<type>FILE</type>
<name>job_1592375222804_0001_conf.xml</name>
<replication>3</replication>
<mtime>1592375282121</mtime>
<atime>1592375282053</atime>
<preferredBlockSize>134217728</preferredBlockSize>
<permission>root:supergroup:0777</permission>
<blocks>
<block>
<id>1073741835</id>
<genstamp>1011</genstamp>
<numBytes>196027</numBytes>
</block>
</blocks>
<storagePolicyId>0</storagePolicyId>
</inode>
<inode>
<id>16415</id>
<type>DIRECTORY</type>
<name>done</name>
<mtime>1592376776670</mtime>
<permission>root:supergroup:0777</permission>
<nsquota>-1</nsquota>
<dsquota>-1</dsquota>
</inode>
<inode>
<id>16427</id>
<type>DIRECTORY</type>
<name>logs</name>
<mtime>1592378009623</mtime>
<permission>root:root:0770</permission>
<nsquota>-1</nsquota><dsquota>-1</dsquota>
</inode>
<inode>
<id>16428</id>
<type>DIRECTORY</type>
<name>application_1592376944601_0001</name>
<mtime>1592378045481</mtime>
<permission>root:root:0770</permission>
<nsquota>-1</nsquota>
<dsquota>-1</dsquota>
</inode>
<inode>
<id>16430</id>
<type>DIRECTORY</type>
<name>wcoutput</name>
<mtime>1592378037463</mtime>
<permission>root:supergroup:0755</permission>
<nsquota>-1</nsquota>
<dsquota>-1</dsquota>
</inode>
<inode>
<id>16436</id>
<type>FILE</type>
<name>part-r-00000</name>
<replication>3</replication>
<mtime>1592378037264</mtime>
<atime>1592378037074</atime>
<preferredBlockSize>134217728</preferredBlockSize>
<permission>root:supergroup:0644</permission>
<blocks>
<block>
<id>1073741842</id>
<genstamp>1018</genstamp>
<numBytes>43</numBytes>
</block>
</blocks>
<storagePolicyId>0</storagePolicyId>
</inode>
<inode>
<id>16445</id>
<type>FILE</type>
<name>linux123_39919</name>
<replication>3</replication>
<mtime>1592378045469</mtime>
<atime>1592378045331</atime>
<preferredBlockSize>134217728</preferredBlockSize>
<permission>root:root:0640</permission>
<blocks>
<block>
<id>1073741848</id>
<genstamp>1024</genstamp>
<numBytes>56910</numBytes>
</block>
</blocks>
<storagePolicyId>0</storagePolicyId>
</inode>
<inode>
<id>16446</id>
<type>DIRECTORY</type>
<name>0617</name>
<mtime>1592387393490</mtime>
<permission>root:supergroup:0755</permission>
<nsquota>-1</nsquota>
<dsquota>-1</dsquota>
</inode>
<inode>
<id>16449</id>
<type>FILE</type>
<name>banzhang.txt</name>
<replication>1</replication>
<mtime>1592388309046</mtime>
<atime>1592388309026</atime>
<preferredBlockSize>134217728</preferredBlockSize>
<permission>root:supergroup:0644</permission>
<storagePolicyId>0</storagePolicyId>
</inode>
</INodeSection>
</fsimage>

问题:Fsimage中为什么没有记录块所对应DataNode?

在内存元数据中是有记录块所对应的dn信息,但是fsimage中就剔除了这个信息;HDFS集群在启动的
时候会加载image以及edits文件,block对应的dn信息都没有记录,集群启动时会有一个安全模式
(safemode),安全模式就是为了让dn汇报自己当前所持有的block信息给nn来补全元数据。后续每隔
一段时间dn都要汇报自己持有的block信息

Edits文件内容

  1. 基本语法
    hdfs oev -p 文件类型 -i编辑日志 -o 转换后文件输出路径

[root@linux121 current]$ hdfs oev -p XML -i edits_0000000000000000266-
0000000000000000267 -o /opt/lagou/servers/hadoop-2.9.2/edits.xml
[root@linux121 current]$ cat /opt/lagou/servers/hadoop-2.9.2/edits.xml
  • 内容

<?xml version="1.0" encoding="UTF-8"?>
<EDITS>
<EDITS_VERSION>-63</EDITS_VERSION>
<RECORD>
<OPCODE>OP_START_LOG_SEGMENT</OPCODE>
<DATA>
<TXID>113</TXID>
</DATA>
</RECORD>
<RECORD>
<OPCODE>OP_SET_PERMISSIONS</OPCODE>
<DATA>
<TXID>114</TXID>
<SRC>/wcoutput/_SUCCESS</SRC>
<MODE>493</MODE>
</DATA>
</RECORD>
<RECORD>
<OPCODE>OP_SET_PERMISSIONS</OPCODE>
<DATA>
<TXID>115</TXID>
<SRC>/wcoutput/part-r-00000</SRC>
<MODE>493</MODE>
</DATA>
</RECORD>
<RECORD>
<OPCODE>OP_SET_PERMISSIONS</OPCODE>
<DATA>
<TXID>116</TXID>
<SRC>/wcoutput</SRC>
<MODE>511</MODE>
</DATA>
</RECORD>
<RECORD>
<OPCODE>OP_SET_PERMISSIONS</OPCODE>
<DATA>
<TXID>117</TXID>
<SRC>/wcoutput/_SUCCESS</SRC>
<MODE>511</MODE>
</DATA>
</RECORD>
<RECORD>
<OPCODE>OP_SET_PERMISSIONS</OPCODE>
<DATA>
<TXID>118</TXID>
<SRC>/wcoutput/part-r-00000</SRC>
<MODE>511</MODE>
</DATA>
</RECORD>
<OPCODE>OP_DELETE</OPCODE>
<DATA>
<TXID>119</TXID>
<LENGTH>0</LENGTH>
<PATH>/wcoutput/part-r-00000</PATH>
<TIMESTAMP>1592377324171</TIMESTAMP>
<RPC_CLIENTID></RPC_CLIENTID>
<RPC_CALLID>-2</RPC_CALLID>
</DATA>
</RECORD>
<RECORD>
<OPCODE>OP_SET_PERMISSIONS</OPCODE>
<DATA>
<TXID>120</TXID>
<SRC>/</SRC>
<MODE>511</MODE>
</DATA>
</RECORD>
<RECORD>
<OPCODE>OP_SET_PERMISSIONS</OPCODE>
<DATA>
<TXID>121</TXID>
<SRC>/tmp</SRC>
<MODE>511</MODE>
</DATA>
</RECORD>
<RECORD>
<OPCODE>OP_SET_PERMISSIONS</OPCODE>
<DATA>
<TXID>122</TXID>
<SRC>/tmp/hadoop-yarn</SRC>
<MODE>511</MODE>
</DATA>
</RECORD>
<RECORD>
<OPCODE>OP_SET_PERMISSIONS</OPCODE>
<DATA>
<TXID>123</TXID>
<SRC>/tmp/hadoop-yarn/staging</SRC>
<MODE>511</MODE>
</DATA>
</RECORD>
<RECORD>
<OPCODE>OP_SET_PERMISSIONS</OPCODE>
<DATA>
<TXID>124</TXID>
<SRC>/tmp/hadoop-yarn/staging/history</SRC>
<MODE>511</MODE>
</DATA>
</RECORD>
<RECORD>
<OPCODE>OP_SET_PERMISSIONS</OPCODE>
<DATA>
<TXID>125</TXID>
<SRC>/tmp/hadoop-yarn/staging/history/done</SRC>
<MODE>511</MODE>
</DATA>
</RECORD>
<RECORD>
<OPCODE>OP_SET_PERMISSIONS</OPCODE>
<DATA>
<TXID>126</TXID>
<SRC>/tmp/hadoop-yarn/staging/history/done/2020</SRC>
<MODE>511</MODE>
</DATA>
</RECORD>
<RECORD>

备注:Edits中只记录了更新相关的操作,查询或者下载文件并不会记录在内!!
问题:NameNode启动时如何确定加载哪些Edits文件呢?
nn启动时需要加载fsimage文件以及那些没有被2nn进行合并的edits文件,nn如何判断哪些edits已经
被合并了呢?
可以通过fsimage文件自身的编号来确定哪些已经被合并

checkpoint周期

[hdfs-default.xml]


<!-- 定时一小时 -->
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
</property>
<!-- 一分钟检查一次操作次数,当操作次数达到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 >

NN故障处理

NameNode故障后,HDFS集群就无法正常工作,因为HDFS文件系统的元数据需要由NameNode来管
理维护并与Client交互,如果元数据出现损坏和丢失同样会导致NameNode无法正常工作进而HDFS文
件系统无法正常对外提供服务。
如果元数据出现丢失损坏如何恢复呢?

  1. 将2NN的元数据拷贝到NN的节点下
    此种方式会存在元数据的丢失。
  2. 搭建HDFS的HA(高可用)集群,解决NN的单点故障问题!!(借助Zookeeper实现HA,一个
    Active的NameNode,一个是Standby的NameNode)

Hadoop的限额与归档以及集群安全模式

高级命令
HDFS文件限额配置
HDFS文件的限额配置允许我们以文件大小或者文件个数来限制我们在某个目录下上传的文件数量
或者文件内容总量,以便达到我们类似百度网盘网盘等限制每个用户允许上传的最大的文件的量

  1. 数量限额
hdfs dfs -mkdir -p /user/root/lagou #创建hdfs文件夹
hdfs dfsadmin -setQuota 2 /user/root/lagou # 给该文件夹下面设置最多上传两
个文件,上传文件,发现只能上传一个文件
hdfs dfsadmin -clrQuota /user/root/lagou # 清除文件数量限制
  1. 空间大小限额

hdfs dfsadmin -setSpaceQuota 4k /user/root/lagou # 限制空间大小4KB
#上传超过4Kb的文件大小上去提示文件超过限额
hdfs dfs -put /export/softwares/xxx.tar.gz /user/root/lagou
hdfs dfsadmin -clrSpaceQuota /user/root/lagou #清除空间限额
#查看hdfs文件限额数量
hdfs dfs -count -q -h /user/root/lagou

HDFS的安全模式

安全模式是HDFS所处的一种特殊状态,在这种状态下,文件系统只接受读数据请求,而不接
受删除、修改等变更请求。在NameNode主节点启动时,HDFS首先进入安全模式,DataNode在
启动的时候会向NameNode汇报可用的block等状态,当整个系统达到安全标准时,HDFS自动离
开安全模式。如果HDFS出于安全模式下,则文件block不能进行任何的副本复制操作,因此达到
最小的副本数量要求是基于DataNode启动时的状态来判定的,启动时不会再做任何复制(从而达
到最小副本数量要求),HDFS集群刚启动的时候,默认30S钟的时间是出于安全期的,只有过了
30S之后,集群脱离了安全期,然后才可以对集群进行操作

hdfs dfsadmin -safemode

Hadoop归档技术

主要解决HDFS集群存在大量小文件的问题!!
由于大量小文件会占用NameNode的内存,因此对于HDFS来说存储大量小文件造成NameNode
内存资源的浪费!
Hadoop存档文件HAR文件,是一个更高效的文件存档工具,HAR文件是由一组文件通过archive
工具创建而来,在减少了NameNode的内存使用的同时,可以对文件进行透明的访问,通俗来说
就是HAR文件对NameNode来说是一个文件减少了内存的浪费,对于实际操作处理文件依然是一
个一个独立的文件。

  1. 启动YARN集群
start-yarn.sh
  1. 归档文件
    把/user/lagou/input目录里面的所有文件归档成一个叫input.har的归档文件,并把归档后文件存储到/user/lagou/output路径下
bin/hadoop archive -archiveName input.har –p
/user/root/input /user/root/output
  1. 查看归档

[root@linux121 hadoop-2.9.2]$ hadoop fs -lsr /user/root/output/input.har
[root@linux121 hadoop-2.9.2]$ hadoop fs -lsrhar:///user/root/output/input.har
  1. 解压
[root@linux121 hadoop-2.9.2]$ hadoop fs -cp har:/// user/root/output/input.har/* /user/root

HDFS NN与2NN相关推荐

  1. Hadoop学习笔记-NN与2NN

    几个概念 NameNode被格式化之后,将在/opt/module/hadoop-3.1.3/data/tmp/dfs/name/current目录中产生如下文件: fsimage_000000000 ...

  2. Hadoop中NameNode和SecondaryNameNode、NN和2NN工作机制、Fsimage和Edits解析、oiv查看Fsimage、oev查看Edits、CheckPoint时间设置

    文章目录 9.NameNode和SecondaryNameNode 9.1NN和2NN工作机制 9.1.1第一阶段:NameNode启动 9.1.2第二阶段:Secondary NameNode工作 ...

  3. spark分区增减、JavaFX基本操作和HDFS NN DN概念

  4. 2.Hadoop3.x 基础知识

    文章目录 Hadoop3.x 基础知识 知识点一 : Hadoop 概论 1.Hadoop 常用版本 2.数据 存储单位 3.大数据 主要解决的问题 4.大数据 特点(4V) 5.大数据 应用场景 6 ...

  5. NN、DN、2NN、JN

    NN–NameNode NN负责对HDFS上的元数据进行整理 在NN上存放了两份重要信息:1.文件由哪些块组成.2.每个块存在哪个位置 除此之外还有一些非关键信息:文件名.上传者.上传时间 元数据在磁 ...

  6. hdfs安全模式退出_浅谈HDFS(二)之NameNode与SecondaryNameNode

    NN与2NN工作机制 思考:NameNode中的元数据是存储在哪里的? 假设存储在NameNode节点的硬盘中,因为经常需要随机访问和响应客户请求,必然效率太低,所以是存储在内存中的 但是,如果存储在 ...

  7. 大数据Hadoop3.1.3 HDFS 详细入门笔记

    网页右边,向下滑有目录索引,可以根据标题跳转到你想看的内容 如果右边没有就找找左边 主文章链接https://blog.csdn.net/grd_java/article/details/115639 ...

  8. 【大数据】Hadoop (二) HDFS

    课程链接: 尚硅谷大数据Hadoop 3.x(入门搭建+安装调优)_哔哩哔哩_bilibili (Hadoop到底是干什么用的? - 知乎 (zhihu.com) 资料 Hadoop中文文档 (apa ...

  9. (超详细)大数据Hadoop之HDFS组件

    一. HDFS简介 1.1 HDFS的概述 在Hadoop生态圈中,HDFS属于底层基础,负责存储文件. 1.2 HDFS产生背景 HDFS全称为Hadoop Distributed File Sys ...

最新文章

  1. mysql统计出每个姓氏的人数_你见过什么偏僻的姓氏?明明是老虎的虎姓氏却读māo...
  2. 分区供水条件口诀_经典口诀2020年一建市政管道篇
  3. MongoDB系列四(索引).
  4. [3rgb.com开发笔记] 初步设想篇
  5. error: The following untracked working tree files would be overwritten by merge:
  6. Pepperl+Fuchs收购德国手持RFID设备提供商Ecom仪器
  7. 关灯游戏java代码_江湖救急!在用JAVA做一个关灯游戏,有些不会的地方
  8. xp系统计算机远程桌面连接不上,在XP系统中远程桌面连接不上的解决方式
  9. springMvc ResultFul风格 url拼接问题
  10. Altium Designer Summer 9 Build 9.4.0.20159下载地址 + 破解补丁
  11. 安防 海康摄像机视频存储服务器
  12. 1953年克里克和沃森发现DNA双螺旋结构
  13. 某航空公司客户价值分析
  14. [笔记的明子] - C语言笔记
  15. codeforces 766E 二进制思想dp
  16. flarum头像插件的使用
  17. MySQL数据库的高级功能有哪些
  18. 美团、锤子科技 众多品牌从这里走出
  19. JAVA完整的银行存取系统
  20. w7怎样修改计算机用户,Win7系统更改用户账户控制设置的方法

热门文章

  1. ie自带css定位,IE浏览器的CSS定位问题
  2. 提交App Store被拒
  3. 链接href的多重使用
  4. 解决OpenCV在Cmake时,因网络问题无法下载部分所需文件
  5. [转] 200条装修小常识(结婚,不结婚的都要看一下,很有用的)
  6. 小米手机的性价比真的那么高吗?
  7. php move_uploaded_file liunx,php move_uploaded_file()上传文件实例及遇到问题的解决方法...
  8. 企业老板管理者,如何监控员工的电脑屏幕?
  9. 什么是Web服务端点?
  10. 嵌入式学习 开发板触屏失灵解决