这里,先简单介绍一下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 感谢观看!