本文主要是介绍HDFS的体系结构和常用操作,涉及到的知识点如下:
- HDFS的体系结构
- 数据上传
- 数据下载
HDFS的体系结构
Hadoop的生态圈,包括HDFS、Yarn、HBase都是主从结构。对于HDFS来说,它的主节点是NameNode,从节点是DataNode,还有一个更新最新状态的SecondaryNameNode,下面我们对这几个结点做详细的解释。
NameNode:名称节点
(1)职责:
- 管理、维护HDFS;
- 接收客户端的请求:上传、下载、创建目录等;
- 维护两个非常重要的文件:edits文件 –> 记录了操作日志;fsimage文件 –> 记录HDFS元信息
(2)HDFS操作日志:edits文件
位置:find . -name edits* (在当前目录下查找以edits打头的文件)
最新的操作日志以edits_inprogress***开头
记录:Edits文件保存了自最后一次检查点之后所有针对HDFS文件系统的操作,比如:增加文件、重命名文件、删除目录等等
都是二进制
HDFS提供了一个工具:edits viewer 日志查看器,可以将操作日志转化为XML格式来查看。命令如下:
hdfs oev 命令将日志(二进制)输出为XML文件 -i表示输入,-o表示输出 hdfs oev -i edits_inprogress_0000000000000000208 -o ~/a.xml
(3)HDFS的元信息:fsimage文件
位置:和edits文件在一起
记录:fsimage是HDFS文件系统存于硬盘中的元数据检查点,里面记录了自最后一次检查点之前HDFS文件系统中所有目录和文件的序列化信息(数据块的位置、冗余信息)
也是二进制
HDFS提供了一个工具:image viewer查看器,可以将操作日志转化为文本或者XML格式来查看
hdfs oiv 命令将日志(二进制)输出为文本文件 -i表示输入,-o表示输出 hdfs oiv -i fsimage_0000000000000000207 -o ~/b.txt (文本) hdfs oiv -i fsimage_0000000000000000207 -o ~/c.xml -p XML(xml文件)
DataNode:数据结点
数据块大小:
- 1.x版本 64M
- 2.x笨笨 128M
位置:find . -name blk*(blk是block的简写)
一般原则:数据块的冗余度一般跟数据结点个数一致,最大不要超过3。在生产环境下,至少2个数据结点
blk_*表示数据块
blk_*.meta表示数据块的元信息
SecondaryNameNode:第二名称结点
作用:把edits中最新的状态信息合并到fsimage文件中,即日志合并。合并原理图如下。
NameNode和SecondaryNameNode在一起的原因是为了效率问题,因为两者在一起,SecondaryNameNode在合并最新的edits到fsimage中时,只需要执行cp操作即可;在合并后,把最新的fsimage上传回NameNode下的fsimage
什么时候合并?当HDFS发出检查点(checkpoint)的时候。默认会在两种情况下发出检查点:
(1)每隔60分钟。可通过修改参数,改变时间
(2)当edits文件达到64M。可通过修改参数,改变阈值
补充:Oracle数据库中也有检查点,如果发生检查点,会以最高优先级唤醒数据库写进程(DBWn)把内存中的脏数据写到数据文件上(持久化)
注意:NameNode和SecondaryNameNode名字看起来差不多,但是两者并没有什么关系
HDFS存在的问题:
(1)NameNode单点故障,即一旦出现问题整个系统就瘫痪
解决方案:Hadoop1.0中,没有解决方案。
Hadoop2.0中,使用Zooker实现Name的HA(高可用性,后面会讲到)功能。
(2)NameNode压力过大,且内存受限,影响系统扩展