1. 客户端通过分布式文件系统(DistributedFileSystem) 模块向namenode请求上传文件件,namenode检查目标文件是否已存在,父目录是否存在
2. namenode返回是否可以上传
3. 客户端请求第一个block上传到哪几个datanode服务器上
4. namenode返回3个datanode节点,分别是dn1,dn2,dn3
5. 客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将通信管道建立完成
6. dn1,dn2,dn3逐级应答客户端
7. 客户端开始往dn1上传第一个block(先从磁盘读取数据放在一个本地的内存缓存),以packet为单位,dn1收到一个packet就会传给dn2,dn2传给dn3,dn1每传一个packet会放入一𠆤应答队列等
待应答
8)当.一 个block传输完成,客户端请求namenode 上传第二个block到服务器,重复3-7步
大部分的HDFS程序对文件系统操作采用的一般是“一次写,多次读取”的操作模式。
客户端利用HDFS写数据主要有以下几个过程:
1.客户端通过调用,分布式文件系统对象中的creat()创建一个文件。分布式文件系统会通过rpc调用的名称节点来 明明,命名一个新的文件夹。
2.名称节点通过多种验证,确保请求客户端拥有创建文件的权限,新的文件不存在于文件系统中。当所有的验证通过时,名称节点就会创建一个新文件的记录,如果创建失败,就会显示IOException异常,如果创建成功,分布式文件系统会返回一个文件夹来给用户写数据, FSDataOutputStream包含了一个数据流对象,DFSDataOutputSystem,客户端会通过它来处理数据节点和名称节点之间的通信。
3.客户端调用FSDDataOutputSystem的write()函数,像对应的文件写入数据。
4.当客户端开始写入数据时,DFSDataOutputSystem会将文件分割成包,放进“数据队列”中,数据流系统会将这些小文件放进数据流中,DataStreamer的作用是请求名称节点为新的文件分配合适的数据节点放入副本,返回的节点就像成一个管道。如果副本有三个,管道中就会有三个数据节点,将文件包以流的形式,传递给队列中的第一个数据节点,第一个数据节点会存储这个包,然后将它推给第二个数据节点,依次重复进行,直到完成数据流管道中的最后一个节点。
5.DFSDataOutputSystem同时会保存一个包的内部队列,用来等待管道中的数据节点返回来确认信息,这个队列被称作确认队列,只有管道终结点全部返回,确认队列中数据才会全部删除。
当数据写入失败的节点,导致数据失败的时候,HDFS会做出以下反应,首先关闭,数据流通道,任何文件包都会放到队列前端,这样管道中失败的数据也不会被删除。
而当前正常存放的文件都会被与每一个数据节点相关联,如果这样如果失败的数据节点,过段时间从故障中恢复过了,其中的部分数据块就会被删除,然后数据流管道会把失败的数据节点删除。文件会继续被写到数据流管道的另外两个数据节点中,最后名称节点会注意现在的文本框儿副本。没有到达配置属性,会在另外的数据节点上安排创建一个副本。随后的文件会正常执行,写入操作。
6当客户端完成写入数据的操作后调用。DFSDataOutputStream的close( )方法将所有的数据块写入数据流管道中的数据节点。并等待确认返回成功,最后通过名称节点完成写入。
k