HDFS:架构图
1.block:文件存储到hdfs上时被切分成若干个数据块,每个block数据块的大小默认128M(hdfs-1.x默认:64M)
如果文件不到128M,则可以单独存成一个block。每一个块都有3个副本(一共三个)存储在datanode
上。3个副本的存储策略:第一个存储在当前机架上的节点选择磁盘不满、cpu不忙的节点,第二个存储
在不同机架上,第三个存储在同第二个机架的不同节点。
**2.datanode:**存放数据块的信息,当datanode启动时向namenode汇报块信息,保持和namenode的心跳机制
当namenode超过10分钟没有收到datanode的汇报信息时,则会认为改datanode丢失,此时
namenode会寻找一个新的datanode并从拥有改block块的其他副本上拷贝block块至新的
datanode上。
**3.namenode:**namenode等待接受客户端的写入写出,同时接受datanode的汇报信息,与datanode保持着心
条机制。namenode上保存着目录树,其中包括文件信息,文件分割成具体block块的信息,
以及每一个block块归属datanode的信息。这些信息不会被持久化,需要每次启动时datanode的汇报
namenode使用内存作为存储介质。优点:计算速度快 缺点:内存中的数据掉电易失、内存的大小限制
namenode的存储量,如果内存被占满将无法存储数据。当namenode启动的时候会在fsimage的基础上
执行一遍日志文件,然后创建一个新的空的fsimage。namenode的每一个操作都会记录在日志文件里,
长时间造成日志文件过大,导致namenode启动时间过长,此时出现了secondarynode。同时nameno
de启动时会进入安全模式,当namenode和datanode进行完心跳机制后,namenode上存储玩所有的
datanode的元数据信息,并进行检测完成后,namenode解除安全模式可进行正常的读写操作。
secondarynamenode日志合并图:
4.secondarynamenode
sn会定时将fsimage和edites文件合并(触发点:默认日志文件64M,或者1个小时,这个参数可以调)
当触发条件时,sn会将fsimage从namenode上拷贝一份到sn上,将日志文件拷贝到sn上,进行合并,
生成fsimage.ckpt 将其拷贝给namenode,namenode会将fsimage覆盖原fsimage。
hdfs的读写流程:
-
hdfs的读流程
1.客户端会发一个rpc请求到namenode上,namenode会返回要读取文件的block块信息,和block块所在 datanode的信息。
2.客户端得到这个信息后会创建一个fsdatainputstream对象
3.客户端会选择距离客户端最近的datanode来读取block,如果客户端本身就是datanode那么将从本地读取
每次读取完一个block块时都会进行checksum验证,如果读取datanode出错时,客户端便会通知namenode
然后再从下一个拥有改block块的datanode读取。
4.当读取完后会关闭与datanode的链接,并寻找下一个要读取的block块的最佳datanode
5.当读取完列表的block后,文件还没有结束,会向namenode再次发送信息,获取下一批block信息。
2.hdfs的写操作
1…客户端会发一个rpc请求到namenode上,namenode会检查要创建的文件是否存在,创建是否有权限进行创建如果成功则会创建一个文件,如果失败则会抛出一个异常,并且创建一条记录
2.客户端得到这个信息后会创建一个fsdataoutputstream对象
3.要写入的文件会被切分成多个packets,并且内部使用dataqueue数据队列的形式,同时客户端会向namenode申请新的blocks获取这些适合存储的datanode列表
4.此时客户端会和datanode创建pipeline,将一个个packets写入datanode中一个packets64b大小,当写入一个packets第一个datanode会向第二个datanode写入以此类推,同时客户端还继续给第一个datanode发送packets
当一个packets成功存储后会犯一个ack packets 通过pipeline传给客户端,此时客户端(内部维护着一个ack queue)便会删除其内的客户端通过ack queue删除相对应的ack packet
个ack packets 通过pipeline传给客户端,此时客户端(内部维护着一个ack queue)便会删除其内的客户端通过ack queue删除相对应的ack packet
5.如果传输过程中,某个datanode出现故障,那么当前的pipeline会被关闭,出现故障的datanode从当前的pineline中移除,剩余的block会继续给剩下的datanode继续以pipeline形式进行传输,同时namenode会分配一个新的datanode,进行拷贝已经传输完成的datanode上的数据