HDFS原理了解 (学习笔记)
HDFS简介
HDFS:Hadoop Distributed File System(hadoop分布式文件系统)
分布式,感觉好厉害的样子啊,有网络文件系统,有本地文件系统,现在又多了一个分布式的文件系统。之所以是要分布式,是数据要放到多个主机上面去。放的东西在集群中,就是分布式啦!
想要了解这个东东,先找一张原理图瞅瞅。
看不懂没关系,继续往下瞅就是了。
HDFS 1.0
每个一学习的模块要搞懂一个点内容,学完这个就需要对下面这些名词非常的了解。 Namenode
Datanode
块
冷备份(sendarynamenode)
Namenode
namenode又称为名称节点,是负责管理分布式文件系统的命名空间(Namespace),保存了两个核心的数据结构,即FsImage和EditLog。 你可以把它理解成大管家,它不负责存储具体的数据。
- FsImage用于维护文件系统树以及文件树中所有的文件和文件夹的元数据
- 操作日志文件EditLog中记录了所有针对文件的创建、删除、重命名等操作
注意,这个两个都是文件,也会加载解析到内存中。
为啥会拆成两个呢? 主要是因为fsimage这个文件会很大的,多了之后就不好操作了,就拆分成两个。把后续增量的修改放到EditLog中, 一个FsImage和一个Editlog 进行合并会得到一个新的FsImage.
因为它是系统的大管家,如果这个玩意坏了,丢失了怎么办。就相当于你系统的引导区坏了。那就玩完了。整个文件系统就崩溃了。 所以,这个重要的东西,需要备份。这个时候就产生了一个叫sendaryNamenode的节点用来做备份,它会定期的和namenode就行通信来完成整个的备份操作。具体的操作如下:
SecondaryNameNode的工作情况:
1. SecondaryNameNode会定期和NameNode通信,请求其停止使用EditLog文件,暂时将新的写操作写到一个新的文件edit.new上来,这个操作是瞬间完成,上层写日志的函数完全感觉不到差别;
2. SecondaryNameNode通过HTTP GET方式从NameNode上获取到FsImage和EditLog文件,并下载到本地的相应目录下;
3. SecondaryNameNode将下载下来的FsImage载入到内存,然后一条一条地执行EditLog文件中的各项更新操作,使得内存中的FsImage保持最新;这个过程就是EditLog和FsImage文件合并;
4. SecondaryNameNode执行完(3)操作之后,会通过post方式将新的FsImage文件发送到NameNode节点上
5. NameNode将从SecondaryNameNode接收到的新的FsImage替换旧的FsImage文件,同时将edit.new替换EditLog文件,通过这个过程EditLog就变小了
除了这个自带的备份操作,还需要进行人工的备份,把一份fsimage到多个地方进行备份,万一namenode的节点坏了呢。
DataNode
datanode数据节点,用来具体的存储文件,维护了blockId 与 datanode本地文件的映射。 需要不断的与namenode节点通信,来告知其自己的信息,方便nameode来管控整个系统。
这里还提到一个块的概念,就想linux本地文件系统中也有块的概念一样,这里也有块的概念。这里的块会默认是128m 每个块都会默认储存三份
HDFS 2.0
有问题,就得改。1.0上有很多的毛病,为了修复这些问题才出了2.0
* 单点故障问题
* 不可以水平扩展(是否可以通过纵向扩展来解决?)
* 系统整体性能受限于单个名称节点的吞吐量
* 单个名称节点难以提供不同程序之间的隔离性
* HDFS HA是热备份,提供高可用性,但是无法解决可扩展性、系统性能和隔离性
解决上面这些问题所使用的手段就是 热备份
federation
热备份 (HDFS HA)
- HDFS HA(High Availability)是为了解决单点故障问题
- HA集群设置两个名称节点,“活跃(Active)”和“待命(Standby)”
- 两种名称节点的状态同步,可以借助于一个共享存储系统来实现
- 一旦活跃名称节点出现故障,就可以立即切换到待命名称节点
- Zookeeper确保一个名称节点在对外服务
- 名称节点维护映射信息,数据节点同时向两个名称节点汇报信息
Federation(大概翻译成联盟)
多个命名空间。为了处理一个namenode的局限性,搞了几个namanode大家一起来管理。就像编程中的命名空间一样
- 在HDFS Federation中,设计了多个相互独立的名称节点,使得HDFS的命名服务能够水平扩展,这些名称节点分别进行各自命名空间和块的管理,相互之间是联盟(Federation)关系,不需要彼此协调。并且向后兼容
- HDFS Federation中,所有名称节点会共享底层的数据节点存储资源,数据节点向所有名称节点汇报
- 属于同一个命名空间的块构成一个“块池
HDFS Federation设计可解决单名称节点存在的以下几个问题:
1. HDFS集群扩展性。多个名称节点各自分管一部分目录,使得一个集群可以扩展到更多节点,不再像HDFS1.0中那样由于内存的限制制约文件存储数目
2. 性能更高效。多个名称节点管理不同的数据,且同时对外提供服务,将为用户提供更高的读写吞吐率
3. 良好的隔离性。用户可根据需要将不同业务数据交由不同名称节点管理,这样不同业务之间影响很小