hdfs基础

Namenode作用?

1 管理,维护文件系统的元数据/名字空间/目录树   管理数据与节点之间的映射关系(管理文件系统中的每个文件/目录的block信息)

2 管理datanode汇报的心跳日志/报告

3 客户端与datanode之间的桥梁(元数据信息共享)

Datanode的作用?

1 负责数据的读写操作

2 周期性的向namenode汇报心跳日志 /报告

3 执行数据流水线的复制

Secondarynamenode存在的意义?

1 进行fsimage和edit的合并操作,减少edit日志大小,加快集群的启动速度

2 强fsimage与edit进行备份,防止丢失

fsimage与edi的作用是什么?

1 在集群二次启动时,使用fsimage和edits合并进行恢复元数据

2  Secondarynamenode周期性的拉取fsimage和edits进行合并生成新的fsimage

Secondarynamenode的工作机制是什么?

  1 namenode创建一个edits.new

  2 snn从NameNode节点拷贝fsimage和edits文件到snn

  3 snn将两个文件导入内存进行合并操作生成一个新的fsimage.ckpt文件

  4 snn将新的fsimage.ckpt文件发送到namenode节点

  5 重命名为fsimage替换原先的fsimage

  6 原先的edits生成edits.new文件

  7 将edits替换为新的edits.new

HDFS数据完整性如何保证?

数据写入完毕以后进行校验,数据读取之前进行校验对比判断是非有数据丢失

namenode会周期性的通过datanode汇报的心跳信息中获取block的校验和进行检查数据完整性,如果发现校验不一致,会从其他副本节点复制数据进行恢复,从而保证数据的完整性

hdfs特性?(适用场景:一次写入,多次读取)

1.海量数据存储

2.大文件存储

3.高容错性

  数据自动保存多个副本,通过增加副本的形式,提高容错性

  某一个副本丢失以后,可以自动恢复,这是hdfs内部机制实现的

hdfs的缺点?

1 不擅长低延时的数据访问,由于hadoop针对高数据吞吐做了优化,牺牲了数据的延迟,所有对于低延迟访问数据的业务需求不适合hdfs

2 不擅长大量小文件存储,存储大量小文件的话,会占用NameNode大量的内存来存储文件,目录和块信息,这样是不可取,因为namenode的内存是有限的

3 不支持多用户并发写入一个文本,同一个时间,只能有一个用户执行写操作

4 不支持文件的随机修改(多次写入,一次读取),仅支持数据末尾append(追加),不支持随机修改

 

hdfs的数据写入流程?

1 client发起文件写入请求,通过rpc与namenode建立通讯,namenode检查目标文件,返回是否可以上传

2 client请求第一个block该传输到哪些datanode服务器上

3 namenode根据副本数量和副本放置策略进行节点分配,返回Datanode节点 如A,B,C

4 client请求A节点建立pipline管道,A接收到请求会继续调用B,然后B调用C,将整个pipline管道建立完成,后逐级返回消息到client

5 client收到A返回的消息之后开始往A上传第一个block块,block块被切分成64k的packet包不断的在pipline管道里传递,从A到B,B到C进行复制存储

6 当一个block块传输完成之后,client在此请求namenode上传第二个block块的存储节点,不算往复存储

7 当所有block块传输完成后,client调用fsdataoutputStream的close方法关闭输出流,最后调用fileSystem的complete方法告知namenode数据写入成功

 

hdfs的数据读取流程?

1 client发起文件读取请求,通过rpc与namenode建立通讯,namenode检查目标文件,来确定请求文件block的位置信息

2 namenode会视情况返回文件的部分或者全部block块列表,对于每个block块,namenode都会返回有该block副本的datanode地址

3 这些返回的datanode地址会按照集群拓扑结构得出datanode与客户端的距离,然后进行排序,排序规则:网络拓扑结构中距离client近的排靠前;心跳机制中超时汇报的DN状态为stale,这样的排靠后

4 client选取排序靠前的datanode调用fsdatainputSteam的read方法来读取block数据,如果客户端本身就是datanode,那么将从本地直接获取block块数据

5 当读完一批的block块后,若文件读取还没结束,客户端会继续向namenode获取下一批的block列表,继续读取

6 所有block块读取完成后,client调用FSDataInputSteam.close()方法,关闭输入流,并将所有的block块合并成一个完整的最终文件

 

上一篇:NameNode 用了什么神秘技术来支撑元数据百万并发读写的


下一篇:Python-Tkinter的Entry详解