HDFS的简单介绍

HDFS(Hadoop Distributed File System):

分布式文件系统(为文件组织位置,格式化硬盘,简而言之就是让数据能对号一一入座的一种方法,作为Hadoop的基础存储系统,实现了一个分布式,高容错,可线性扩展的文件系统

为什么需要引进HDFS?

因为传统的网络文件系统(NFS)虽然也称为分布式文件系统,但是其存在一些限制。由于NFS中,文件是存储在单机上,因此无法提供可靠性保证,当很多客户端同时访问NFS Server时,很容易造成服务器压力,造成性能瓶颈。另外如果要对NFS中的文件进行操作,需要首先同步到本地,这些修改在同步到服务端之前,其他客户端是不可见的。

HDFS支持大文件存储

为什么不能支持小文件存储?

小文件存储会影响内存(小文件存储会产生大量元数据,元数据都会存在内存中,导致占用过多的内存空间)

采用流式的数据访问方式

一次写入、多次读取数据集经常从数据源生成或者拷贝一次,然后在其上做很多分析工作 ,分析工作经常读取其中的大部分数据

HDFS结构图

 

Namenode负责构建命名空间,管理文件的元数据等

Datanode负责实际存储数据,负责读写工作

HDFS的Block块比一般单机文件系统大得多,默认为128M。HDFS的文件被拆分成block-sized的chunk,chunk作为独立单元存储。比Block小的文件不会占用整个Block,只会占据实际大小。例如, 如果一个文件大小为1M,则在HDFS中只会占用1M的空间,而不是128M。

在HDFS中,Namenode可能成为集群的单点故障,Namenode不可用时,整个文件系统是不可用的。HDFS针对单点故障提供了2种解决机制:

1)备份持久化元数据

将文件系统的元数据同时写到多个文件系统, 例如同时将元数据写到本地文件系统及NFS。 2)Secondary Namenode

Secondary节点定期合并主Namenode的namespace image和edit log, 避免edit log过大,通过创建检查点checkpoint来合并。它会维护一个合并后的namespace image副本, 可用于在Namenode完全崩溃时恢复数据。

HDFS数据写入流程

 

HDFS数据写入流程如下:

  1. 业务应用调用HDFS Client提供的API,请求写入文件。

  2. HDFS Client联系NameNode,NameNode在元数据中创建文件节点。

  3. 业务应用调用write API写入文件。

  4. HDFS Client收到业务数据后,从NameNode获取到数据块编号、位置信息后,联系DataNode,并将需要写入数据的DataNode建立起流水线。完成后,客户端再通过自有协议写入数据到DataNode1,再由DataNode1复制到DataNode2, DataNode3。

  5. 写完的数据,将返回确认信息给HDFS Client。

  6. 所有数据确认完成后,业务调用HDFS Client关闭文件。

  7. 业务调用close, flush(刷写client的缓冲区,让其他client立即可以看到写入的内容)后HDFS Client联系NameNode,确认数据写完成,NameNode持久化元数据。

(1.客户端向namenode申请写入数据,告知其文件属性 2.namenode判断有无写入权限,给数据分配合适节点(datanode) 3.客户端根据分配节点照道相应datanode写入数据,写入三次(第一次写入,后两次为第一次的复制) 4.判断写入是否完成,发送ack回应 5.全部写入成功后关闭写入,namenode会对元数据进行持久化操作)

HDFS读取数据

 

HDFS数据读取流程如下:

  1. 业务应用调用HDFS Client提供的API打开文件。

  2. HDFS Client联系NameNode,获取到文件信息(数据块、DataNode位置信息)。

  3. 业务应用调用read API读取文件。

  4. HDFS Client根据从NameNode获取到的信息,联系DataNode,获取相应的数据块。(Client采用就近原则读取数据)。

  5. HDFS Client会与多个DataNode通讯获取数据块。

  6. 数据读取完成后,业务调用close关闭连接。

HDFS中的HA

 

  • HDFS的高可靠性(HA)主要体现在利用zookeeper实现主备NameNode,以解决单点NameNode故障问题。

  • ZooKeeper主要用来存储HA下的状态文件,主备信息。ZK个数建议3个及以上且为奇数个。

  • NameNode主备模式,主提供服务,备同步主元数据并作为主的热备。

  • ZKFC(ZooKeeper Failover Controller)用于监控NameNode节点的主备状态。

  • JN(JournalNode)用于存储Active NameNode生成的Editlog。Standby NameNode加载JN上Editlog,同步元数据。

  • editlog(日志):记录namenode日常操作,排错

  • fsimage(镜像):快照的作用(一段时间内会对namenode当中元数据进行快照,形成文件)

  • 元数据同步

    • 主NameNode对外提供服务。生成的Editlog同时写入本地和JN,同时更新主NameNode内存中的元数据。

    • 备NameNode监控到JN上Editlog变化时,加载Editlog进内存,生成新的与主NameNode一样的元数据。元数据同步完成。

    • 主备的FSImage仍保存在各自的磁盘中,不发生交互。FSImage是内存中元数据定时写到本地磁盘的副本,也叫元数据镜像。

       

1.主namenode会更新内存 2.操作日志,生成新的日志(日志是滚动的) 3.当两个标准:日志更新超过1h或者日志当中的数据超过64M,standby从active下载日志,第一次会同时去下载的fsimage,进行合并生成fsckpt(fscheckpoint)在自己内存中去进行保存 4.standby会将fsckpt上传到active中主namenode会对原fsimage 进行更行替换并将fsckpt重名为fsimage 5.再次到达标准时,第二次只需要下载日志,不需要在下载fsimage了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值