HDFS读写文件
HDFS读文件:
首先,由Client下达命令交给Distributed File System系统翻译成Linux命令,然后把命令发送给NameNode,NameNode去搜索fsimage和edit logs,搜到以后把文件的块地址(get block locations)返回给Client,Client到对应的DataNode地址去读信息,优先级为:主副本>同机架副本>相邻机架副本.最后返回一个FSDataInputStream对象给Client,然后close这个流,Client获取对应信息
HDFS写文件
首先,调用Distributed File System的create方法创建新文件,Client写数据到DFSOutputStream,DFSOutputStream分包,每128M一块,向NameNode申请blocks,获取用来存储replications的合适的datanode列表,然后通过FSDataOutputStream来把包输出到DataNode中的第一个节点上,此为主节点,将该包存储以后传递给同机架下的第二个节点,存储后再传递给相邻机架上的第三个节点.在最后一个DataNode存储完毕后会返回一个ack packet(确认队列),当Client成功收到DataNodeff返回的ack packet后,通知DataNode把文件标示为已完成,移除相应的packet并关闭FSDataOutputStream
如果传输过程中,某个DataNode出现故障:
出现故障的DataNode会被移除,文件会继续被写到剩余的DataNode中,因为此数据块的副本数没有达到配置要求,NameNode会分配一个新的DataNode,随后的文件会正常执行写入操作,保持replications设定的数量.
当Client结束写入数据,调用Stream的close()方法关闭数据流
以上仅供个人理解所用