HDFS 在读写数据中的工作流程由三部分组成,即客户端、NameNode 和DataNode。其中,Distributed FileSystem 可以理解为HDFS 客户端的API,通过它可以实现客户端到NameNode 的调用。其读取数据流程如图3.18 所示。
图3.18 读取数据流程
下面详细介绍HDFS 在读写数据中的工作流程:
①客户端通过Distributed FileSystem 向NameNode 请求下载文件,NameNode 中存储着文件的元数据(元数据包括两个部分:a. 文件与Block 的映射表;b. Block 与DataNode 的映射表),通过查找其元数据,找到Block 所在的DataNode 地址。需要注意的是:这里NameNode 只会返回文件中开始的一部分Block,而不是全部Block。
②Distributed FileSystem 向客户端返回一个支持文件定位的输入流对象FSDataInputStream,该对象主要用来为客户端提供读取数据的功能。
③目前客户端中已经有了请求数据的DataNode 地址和一个可以读取数据的流对象,就可以读取Block 了。客户端会在输入流基础上调用Read(),连接元数据中最近的DataNode,并在数据流中重复调用Read(),直到其最近的DataNode 中的Block 读取完毕,关闭对该DataNode 的连接;然后查找存储下一个数据块距离客户端最近的DataNode,循环往复直至读取完毕,调用Close()关闭流操作。
需要注意的是:如果所连接的DataNode 在读取中出现故障,客户端就会尝试连接存储这个Block 的下一个最近DataNode,并记录该节点故障情况,以防再重新连接浪费资源。(www.xing528.com)
下面对文件写入流程进行详细介绍,在HDFS 中新文件写入的流程图如图3.19 所示。
图3.19 写入数据流程
①客户端通过Distributed FileSystem 向NameNode 请求上传文件。
②NameNode 检查目标文件是否存在,并验证新文件是否存在于文件系统中且客户端拥有创建文件权限。若可以上传,Distributed FileSystem 返回一个FSDataOutputStream 用于客户端写入数据。
③FSDataOutputStream 会将文件分割成多个文件包,并拼接成队列,将用于上传的合适DataNode 组成一个通信管道。
④客户端调用DataStreamer 开始向DataNode 上传文件包。DataStreamer 在创建文件流时,已经初始化,其主要作用是将队列中的文件包以流的方式发送到第一个DataNode,然后将其推送给第二个DataNode,直到最后一个DataNode。
⑤当文件数据上传成功以后,调用Close()方法关闭数据流。这步操作会在连接NameNode确认文件写入完成之前将所有剩下的文件包放入DataNode 管道,等待通知确认信息。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。