HDFS设计

HDFS概述

HDFS是Hadoop里的一个模块,用来作为分布式文件系统存储数据的

HDFS特点

大文件:HDFS可以存储几百MB,几百GB甚至几百TB

流式数据访问:一次写入,多次读取,每次分析涉及大部分文件,因此读取大部分数据的延迟比一条数据延迟更重要

商用硬件:HDFS具备多个副本,可以保证在一条节点宕机之后,可以通过副本实现数据的完整,所以可以在普通的主机上运行

不适合低延迟访问:由于HDFS是为大文件存储设计的,是要以牺牲访问时间为代价的

不适合大量小文件:HDFS的架构是管理节点-工作节点,namenode是管理节点,datanode是工作节点,namenode负责存储文件元数据,文件的编辑日志以及文件所有的位置信息,但是这些位置信息不是永久保存,他是在datanode启动时,向namenode报告产生的,这些文件元数据和位置信息是存在内存的,所以有大量的小文件,会导致namenode内存不足.

不支持多用户写入和任意修改:一个文件只允许一个用户写入,并且只能以追加的方式写到文件的尾部,不支持文件任意位置修改

HDFS设计

1,数据块

每个磁盘都有默认的块大小,这是磁盘读取和写入的最小单位,文件系统块大小是几倍大的磁盘块,磁盘块一般是512B,但是HDFS的块大小是128MB,他和磁盘块设计类似,也是把单一的文件系统分为多个块,不同的是,HDFS中不足块大小文件不会占用一个块的空间

HDFS中块为什么那么大

获取磁盘数据的时间,主要包含寻址+数据复制,HDFS存储的文件往往比较大,如果块设计的太小,会导致文件拆分很多小文件,存储在不同的块上,导致寻址时间过长.

2,namenode和datanode

datanode是工作节点,他根据客户端或namenode的需要检索数据块,并向namenode定期发送的所存储的块列表

没有namenode整个HDFS将不能运行,因为我们不知道所有文件的存储位置,也就不能重建文件,因此namenode容错非常重要,目前提供两种

第一种:可以配置使namenode在多个文件系统备份文件元数据和编辑日志,这些文件写操作都是原子性的,一般配置是,在持久化本地磁盘的同时,也写入到一个远程的挂在的文件系统,

第二种:运行一个辅助的namenode,但它不起namenode的作用,这个辅助的namenode是定期合并元数据和编辑日志,防止编辑日志过大,这个namenode运行在单独的物理机上,需要的cpu和内存和主namenode是一样的,在主namenode故障时可以启用辅助namenode,但是辅助namenode的数据是滞后主namenode,会导致部分数据丢失,这时可以把第一种的远程挂在的元数据复制到辅助namenode上并作为新主namenode运行

3,块缓存

频繁读取的文件,可以显示的缓存在datanode上,是以堆外缓存的方式存在的,用户可以在通过在缓存池中增加一个cache directive来告诉namenode需要缓存那些文件以及多久.

4,HDFS Federation(联邦)

对于单个namenode,如果文件过多,会导致需要的内存很大,大内存会导致namenode的冷启动时间很长(需要加载元数据和编辑文件很大),jvm调优很难,Full GC时间很长,

Federation的原理是把文件的命名空间隔离开,namenode相互不影响,每个namenode存储一部分元数据和编辑日志,比如有/user和/shop命名空间,这两个可以分别放在不同的namenode上

1.这些namenode直接相互独立,各自分工管理自己的区域,且不需要互相协调,一个namenode挂掉了不会影响其他的namenode
2.datanode被用作通用的数据存储设备,每个datanode要向集群中所有的namenode注册,且周期性的向所有namenode发送心跳和报告,并执行来自所有namenode的命令Federation不足:Federation只是把风险降低,并没有消除,每个namenode还是存在单点问题,还需要用上面两个方法配合消除单点问题

5,高可用HDFS

不管是远程挂载+辅助namenode还是Federation,都不能消除单点namenode单点问题,Federation本身就不能消除单点,需要依赖远程挂载+辅助namenode,但是远程挂载+辅助namenode恢复过程是一个冷启动过程,需要把远程挂载文件复制到辅助namenode上,并启动.在这个启动过程中需要加载文件元数据,编辑日志,接受数据节点的上报位置信息(当达到一定量才能退出安全模式),这个过程依赖文件多少,时间可能几十分钟,甚至更长.

下面我们来看一下HDFS实现高可用性的架构图:

 

从架构图我们可以看到:

Active NameNode 和 Standby NameNode:两台 NameNode 形成互备,一台处于 Active 状态,为主 NameNode,另外一台处于 Standby 状态,为备 NameNode,只有主 NameNode 才能对外提供读写服务。

主备切换控制器又称故障转移控制器,ZKFailoverController:ZKFailoverController 作为独立的进程运行,对 NameNode 的主备切换进行总体控制。ZKFailoverController 能及时检测到NameNode 的健康状况,在主NameNode 故障时借助 Zookeeper 实现自动的主备选举和切换。(ZKFailoverController存在每一个namenode中)

Zookeeper 集群:为主备切换控制器提供主备选举支持。

共享存储系统:共享存储系统是实现NameNode 的高可用最为关键的部分,共享存储系统保存了 NameNode 在运行过程中所产生的 HDFS 的元数据。主NameNode和备NameNode 通过共享存储系统实现元数据同步。在进行主备切换的时候,新的主 NameNode 在确认元数据完全同步之后才能继续对外提供服务。

DataNode 节点:除了通过共享存储系统共享 HDFS 的元数据信息之外,主 NameNode 和备 NameNode 还需要共享 HDFS 的数据块和 DataNode 之间的映射关系。DataNode 会同时向主 NameNode 和备 NameNode 上报数据块的位置信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值