一、hdfs写数据
1、客户端通过Hadoop文件系统相关API 发送请求。打开一个要写入的文件,如果该用户拥有足够的权限,这一请求会被发送到NameNode,在NameNode上建立该文件的元数据。
2、刚建立的新文件元数据并未将该文件和任何数据块关联,客户端仅收到打开文件成功的响应。
3、客户端在API层面上将数据写入流中,数据被自动拆分成数据包,数据包保存在内存队列中。
4、客户端有一个独立的线程,它从队列中读取数据包,并同时向NameNode请求一组DataNode列表,以便写入下一个数据块的多个副本。
客户端直接连接到列表中的第一个DataNode,而该DataNode又连接到第二个DataNode,最终,客户端将剩余数据包全部写入磁盘,关闭数据流并通知NameNode文件写操作完毕。整个过程中,DataNode将确认接收数据被成功写入,客户端维护着一个列表,记录了哪些数据包尚未收到消息,DataNode写满后,客户端重新向NameNode申请下一个DataNode。
如果在复制过程中,发生错误,管道会立即关闭,已经发出未收到确认的数据包会被回退到队列中。