1、写数据流程
(1) 客户端client通过Distributed FileSystem模块向NameNode请求上传文件,NameNode会检查目标文件是否已经存在,父目录时候存在。
(2) NameNode会返回是否可以上传,如果不可以上传则返回异常。
(3) 当确定可以上传是,客户端client会请求第一个block上传到哪几个datanode服务器上。
(4) NameNode会返回3个DataNode节点,设计为dn1,dn2,dn3
(5) 客户端client会通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求后会调dn2,dn2会调dn3,是为了完成通信管道(pipeline)
(6) dn1,dn2,dn3通过逐级应答客户端client
(7) 客户端client得到应答后,开始往dn1上传第一个block,(具体是从磁盘读取数据到本地缓存),以packet(64KB)为单位,dn1收到一个packet就会传给dn2,dn2传给dn3;dn1每传个packet会放入一个应答队列中等待应带.
(8) 当一个block传输完成后,client会再向NameNode请求第二block得服务,然后重复上面3-7得操作
(9) 当所有得block都完成传输后,将会返回一个ack packet(确认队列),在 pipeline 里传递 至客户端,在客户端的开发库内部维护着"ack queue",成功收到 datanode 返回的 ack packet 后会从"data queue"移除相应的 packet
(10) 如果传输过程中,有某个 DataNode出现了故障,那么当前的 pipeline 会被关闭,出现故 障的 DataNode会从当前的 pipeline 中移除,剩余的 block 会继续剩下的 DataNode中继续 以 pipeline 的形式传输,同时 NameNode会分配一个新的 DataNode 用户传输。
(11) 关于确认队列返回给NameNode,一般是所有block都完成后返回,称之为强一致性,也可以修改为最终一致性,就是任意一个DataNode写完后都可以单独向NameNode汇报
2、读数据流程
(1) 首先client调用FileSystem.open()方法,获取到DistributedFileSystem实例
(2) DistributedFileSystem向NameNode发起RPC(远程过程调用)请求获得文件得开始部分或者全部block列表,每个返回的块里面都包含了所在DataNode的地址。这些DataNode会根据Hadoop的集群拓步结构得出与客户端的距离,然后进行距离的排序,如果是单节点的,那么就直接从本地读取文件内容。
(3) DistributedFileSystem会像客户端client返回一个支持文件定位的输入流对象FSDataInputStream,用于客户端读取数据。FSDataInputStream包含一个FDInputStream对象,这个对象用于管理DataNode和NameNode之间的I/O。
(4) 客户端client会调用read()方法(PS:read()方法是并行读取block信息,读取完一个 block 都会进行 checksum 验证,如果读取 DataNode 时出现错误,
(5) 客户端会通知 NameNode,然后再从下一个拥有该 block 副本的DataNode 继续读),DFSInputStream就会找出距离client最近的DatNode并进行连接
(6) 因为DFSIputStream对象包含文件开始部分的数据所在的DataNode地址,首先它会连接包含文件第一个块最近的DatNode。之后会重复调用read()方法,直到把这个块全部读完为止,读完该块之后就会关闭与刚才DataNode的连接,去读下个一block块。
(7) 如果第一批block都读完了,DFSInputStream就会去向NameNode获取下一批block的所对应的DataNode地址,然后继续读,当所有的block都读完,就会关闭所有的流。最终会把读取的所有block合并成一个最终的文件
3、读写过程中保持数据的完整性
1)当DataNode读取block的时候,它会计算checksum
2)如果计算后的checksum,与block创建时(第一次上传是会计算checksum值)
值不一样,说明block已经损坏。
3)client读取其他DataNode上的block.
4)datanode在其文件创建后周期验证checksum
3、NameNode
(1)它被称为Master、主管、管理者,也叫做HDFS的元数据节点,在集群中只能有一个处于active状态的NameNode对外提供服务。
(2)NameNode在内存中保存这整个文件系统的系统名称和文件数据块的地址映射。以及每个文件备份多少都是由NameNode来管理。
(3)处理Client端的读写请求。
4、DataNode
(1)也叫slave(后来称为Worker),是实际存储数据块的节点。
(2)NameNode下达的命令,由DataNode进行实际操作,如读/写操作。
5、SecondaryNameNode 与 NameNode
SecondaryNameNode主要有两个作用:一是镜像备份,二是日志与镜像的定期合并(合并到NameNode的edit logs到fsimage文件中)。
第一阶段:NameNode启动
(1) 第一次NameNode格式化后,创建fsimage和edits文件,如果哦不是第一次启动,直接加载编辑日志和镜像文件到内存。
(2) Client对元数据进行增删改的请求。
(3) NameNode记录操作日志,更新滚动日志。
(4) NameNode在内存中数据进行增删改查。
第二阶段:Secondary NameNode工作
(1) Secondary NameNode询问NameNode是否需要checkpoint。会直接带回NameNode是否现需要检查结果。
(2) Secondary NameNode 请求执行checkpoint。
(3) NameNode滚动正在写的edits日志。
(4) 将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode.
(5) Secondary NaemNode 加载编辑日志和镜像文件到内存,并合并。
(6) 生成新的镜像文件fsimage.chkpoint。
(7) 拷贝fsimage,chkpoint到NameNode.
(8) NameNode 将fsimage.chkpoint重命名成fsimage。