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块合并成一个完整的最终文件
标签:hdfs,文件,基础,fsimage,client,datanode,namenode,block 来源: https://www.cnblogs.com/fengyouheng/p/15416897.html