HDFS在 Hadoop1.x与Hadoop2.x的区别

这里,先简单介绍一下hdfs吧!

特点:
优点

	高容错性
		保存多个副本,且提供容错机制。
		副本丢失或宕机自动恢复。默认存3份。
	运行在廉价的机器上(商用机)
		通过副本提高可靠性
		提供了容错和恢复机制
	适合批处理
		移动计算而非数据
		数据位置暴露给计算框架。NameNode上有位置
	适合大数据的处理
		TB,甚至PB级数据
		百万规模以上的文件数量
		10K+节点规模
	流式数据访问
		HDFS的构建思路是这样的:一次写入、多次读取是最高效的访问模式。数据集通常由数据源生成或从数据源复制而来,接着长时间在此数据集上进行各种分析。每次分析都将涉及该数据集的大部分数据甚至全部数据,因此读取整个数据集的时间延迟比读取第一条记录的时间延迟更重要。

缺点

	不擅长低延迟数据访问
		比如毫秒级
	不擅长小文件的分区
		占用NameNode大量内存
		磁盘寻道时间超过读取时间
	不擅长并发写入,文件随机修改
		一个文件只能有一个写入者
		仅支持append,(日志),不允许修改文件。

文件的数据类型

元数据   描述文件信息的数据
	大小,名称,所有者,权限,时间,块的大小,副本数
		- 文件与文件的块的大小可以不同,文件与文件的分部署可以不同
		- 但是一共文件中块的大小必须相同,除了最后一个。块的大小一旦被确认,就不能修改
		- 文件的副本数可以被修改
文件的真实数据
	文件真正存放的内容,这个数据就是存储在硬盘上的二进制数据

HDFS名词

- fsimage:当前内存中文件系统的快照(序列化)
- edits:日志
hadoop1.x的节点功能

在这里插入图片描述

NameNode NN

偷懒,直接放截图了
在这里插入图片描述

DataNode 数据节点 DN

在这里插入图片描述

SecondaryNameNode SNN

SecondaryNameNode: 记录NameNode行为 合并Fsimage与Edits
在这里插入图片描述
在这里插入图片描述

安全模式

在这里插入图片描述

机架感知策略

在这里插入图片描述

HDFS写入数据的流程
宏观流程

在这里插入图片描述

  • 1、HDFS客户端向HDFS集群发送数据请求
  • 2、HDFS接受请求,并检验命令的准确性 然后通过远程IPC访问NN
  • 3、检查(权限,路径,文件是否存在…)
  • 4、不通过: 抛出异常 通过: 返回成功消息,并且创建该文件的一个映射对象(NN的内存中(文件元数据,文件与BLK的映射,BLK与DN的映射))
  • 5、如果NN返回的是异常,就将异常返回给客户端 如果返回的是成功 创建一个客户端的输出流
  • 6、客户端创建(FsDataOutputStream)
  • 7、客户端询问NN 第一个BLK存放到那个节点 (此时NN利用机架感知策略 分配)
  • 8、根据NN返回的节点,创建管道(pipeline),管道其实就是Socket连接 客户端连接第一个节点,第一个连接第二个,第二个连接第三个…
  • 9、HDFS客户端的BLK快,会被分成packet(64k大小,Block为128M(2048个packet)),然后将一个个packet传过去(每次传输过程,都是在同时输入与输出,所以,并不影响速度),这个过程有一个ack状态,记录是否到达最后,当到达最后之后,会把这个状态,依次返回,返回给客户端。客户端接收到ack的状态,就知道,这一个packet发送成功了,直到2048个packet全部传输完成,这个Block也就发送成功了。管道就会被撤销。
  • 10、客户端继续询问NN 下一个BLK存放到那个节点 (此时NN利用机架感知策略 分配)
  • 11、8,9
  • 12、全部BLK传递完成之后,NN在Entry中存储所有的File与BLK与DN的映射关系。
  • 13、关闭HDFS客户端的输出流(FsDataOutputStream)
微观流程

在这里插入图片描述

  • 1、客户端利用Buffered 缓冲 ,将文件分为一个个512byte大小的块,然后再加上一个4byte大小的,记录校验这个块的信息 把他们两个合起来,依次拼接,直到这个块的大小到了64k 组成一个packet。
  • 2、将这个packet 放入到 DataQueue队列(队列采用的是先进先出的方式)。客户端这个有一个DataStreamer的角色,会依次从DataQueue队列取数据,通过输出流,传到对应的DN上。同时也会往AckQueue队列放一份。
  • 3、每个packet在传过去的时候,会带着一个ACK,它会判断,我此次传递的是不是最后一个DN,如果是最后一个,这时候ACK就会返回,返回到客户端ResponseProcess 。
  • 4、ResponseProcess会对返回的ACK进行校验,查看本次传输过去的一个packet是否成功
    4.1成功了,就去把AckQueue队列里的这个packet删除掉
    4.2- 没成功,DataStreamer从DataQueue队列拉取重新拉取,然会重新传输
  • 补充:
    • DataQueue队列里的packet 不会一直保留,当数量达到一定时,就会删除
    • AckQueue队列里的packet 会在ack显示传输成功之后,删除对应的packet。
读取数据流程

在这里插入图片描述

  • 1、客户端发送读取请求,通过远程IPC调用Open方法,连接到NN
  • 2、DFS去校验请求,查看文件的权限,信息。不存在:抛出异常。存在:为客户端创建一个输入流
  • 3、创建输入流 FSDataInputStream
  • 4、客户端请求文件和BLK的关系,请求BLK与DN的关系
  • 5、客户端获取到第一个Block信息,然后通过就近原则,选择对应的DN数据进行读取
  • 6、依次读取其他Block的信息,直到最后一个,然后将这边Block合成一个文件
  • 7、关闭 FSDataInputStream
HDFS1.x中HDFS的困境

NameNode 单点故障

  • 1、因为NN只有一个,如果出现故障,需要整个集群等待故障恢复
  • 2、因为NN所有的操作都在内存中完成,如果HDFS文件数目特别多,导致NN OOM(内存溢出),整个集群都会停滞,后期NN的吞吐量也是集群的瓶颈
  • 3、现在NN只有一个,但是公司有可能有10个项目,他们要把自己的资源都交给一个NN管理,无法对资源进行有效的划分(资源隔离)
  • 4、日志文件(edits_inprogress)也存放在NN中,如果NN出现不能恢复的情况,有极大可能性导致数据的丢失

为了解决第一条问题 Hadoop2.x 提出高可用
为了解决第二三条问题 Hadoop2.x 提出联邦机制(Federation)
为了解决第四条问题 Hadoop2.x 提出OJM

Hadoop2.x架构

在这里插入图片描述

ZKFC工作流程

在这里插入图片描述

NameNode脑裂

在这里插入图片描述

Federation(联邦)机制

在这里插入图片描述

  • 就是使得HDFS支持多个命名空间,并且允许在HDFS中同时存在多个NameNode
  • 可以同时让多个NN参与到数据的管理
  • 首先支持多个NN,每个NN管理维护一个NameSpace
  • 块池Block Pool
    • Block pool(块池)就是属于单个命名空间的一组block(块)管理区域
    • 每一个datanode为所有的block pool存储
    • Datanode是一个物理概念,而block pool是一个重新将block划分的逻辑概念
    • 一个Namenode失效不会影响其下的datanode为其他Namenode的服务
    • datanode与Namenode建立联系并开始会话后自动建立Block pool

发博客只为记录知识,如有错误,望指出,感激不尽!
over 感谢观看!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值