第三章 分布式文件系统HDFS
3.1 HDFS简介
HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件的需求而开发的,可以运行于廉价的商用服务器上。它所具有的高容错、高可靠性、高可扩展性、高获得性、高吞吐率等特征,为海量数据提供了不怕故障的存储。
3.2 HDFS 结构和工作机制
HDFS集群包括,NameNode和DataNode以及Secondary Namenode。
3.2.1 NameNode和SecondaryNameNode的作用
NameNode负责管理整个文件系统的元数据,以及每一个路径(文件)所对应的数据块信息,主要三个功能,分别是
(1) 管理元数据
(2) 维护目录树
(3) 响应客户请求
Secondary NameNode用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。
3.2.2 NameNode和Secondary NameNode工作机制
1.镜像文件和编辑日志文件
1)第一阶段:namenode启动
(1)第一次启动namenode格式化后,创建fsimage和edits文件。如果不是第一次启动,直接加载编辑日志(edits)和镜像文件(fsimage)到内存
(2)客户端对元数据进行增删改的请求
(3)namenode记录操作日志,更新滚动日志
(4)namenode在内存中对数据进行增删改查
2)第二阶段:Secondary NameNode工作
(1)Secondary NameNode询问namenode是否需要checkpoint。直接带回namenode是否检查结果。
(2)Secondary NameNode请求执行checkpoint。
(3)namenode滚动正在写的edits日志
(4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode
(5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
(6)生成新的镜像文件fsimage.chkpoint
(7)拷贝fsimage.chkpoint到namenode
(8)namenode将fsimage.chkpoint重新命名成fsimage
3)chkpoint检查时间参数设置
(1)通常情况下,SecondaryNameNode每隔一小时执行一次。
在hadoop的配置文件下/opt/module/hadoop-2.8.4/etc/confs路径下[hdfs-default.xml]
dfs.namenode.checkpoint.period
3600
(2)一分钟检查一次操作次数,当操作次数达到1百万时,SecondaryNameNode执行一次。
dfs.namenode.checkpoint.txns
1000000
操作动作次数
dfs.namenode.checkpoint.check.period
60
1分钟检查一次操作次数
2.镜像文件和编辑日志文件
1)概念
namenode被格式化之后,将在/opt/module/hadoop-2.8.4/data/dfs/name/current目录中产生如下文件,注只能在NameNode所在的节点才能找到此文件
可以执行find . -name edits* 来查找文件
edits_0000000000000000000
fsimage_0000000000000000000.md5
seen_txid
VERSION
(1)Fsimage文件:HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目录和文件idnode的序列化信息。
(2)Edits文件:存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到edits文件中。
(3)seen_txid文件保存的是一个数字,就是最后一个edits_的数字
(4)每次Namenode启动的时候都会将fsimage文件读入内存,并从00001开始到seen_txid中记录的数字依次执行每个edits里面的更新操作,保证内存中的元数据信息是最新的、同步的,可以看成Namenode启动的时候就将fsimage和edits文件进行了合并。
2)oiv查看fsimage文件
(1)查看oiv和oev命令
[jareny@bigdata111 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)案例实操
[jareny@bigdata111 current]$ pwd
/opt/module/hadoop-2.8.4/data/dfs/name/current
[jareny@bigdata111 current]$ hdfs oiv -p XML -i fsimage_0000000000000000316 -o /opt/fsimage.xml
[jareny@bigdata111 current]$ cat /opt/module/hadoop-2.8.4/fsimage.xml
将显示的xml文件内容拷贝到IDEA中创建的xml文件中,并格式化。
3)oev查看edits文件
(1)基本语法
hdfs oev -p 文件类型 -i编辑日志 -o 转换后文件输出路径
-p –processor 指定转换类型: binary (二进制格式), xml (默认,XML格式),stats
-i –inputFile 输入edits文件,如果是xml后缀,表示XML格式,其他表示二进制
-o –outputFile 输出文件,如果存在,则会覆盖
(2)案例实操
[jareny@bigdata111 current]$ hdfs oev -p XML -i edits_0000000000000000135-0000000000000000135 -o /opt/module/hadoop-2.8.4/edits.xml -p stats
[jareny@bigdata111 current]$ cat /opt/module/hadoop-2.8.4/edits.xml
每个RECORD记录了一次操作,比如图中的
OP_ADD代表添加文件操作、OP_MKDIR代表创建目录操作。里面还记录了
文件路径(PATH)
修改时间(MTIME)
添加时间(ATIME)
客户端名称(CLIENT_NAME)
客户端地址(CLIENT_MACHINE)
权限(PERMISSION_STATUS)等非常有用的信息
将显示的xml文件内容拷贝到IDEA中创建的xml文件中,并格式化。
3.滚动编辑日志
正常情况HDFS文件系统有更新操作时,就会滚动编辑日志。也可以用命令强制滚动编辑日志。
1)滚动编辑日志(前提必须启动集群)
[jareny@bigdata111 current]$ hdfs dfsadmin -rollEdits
举例:原文件名edits_inprogress_000000000000