读文件:
client node启动client JVM 调用FileSystem的open方法获取DistributedFileSystem实例
DistributedFileSystem通过RPC从nameNode获取第一批block的locations,这些block通过拓扑排序, 优先级:同节点>同机架>其他机架
前两步会返回一个FSDataInputStream对象,该对象呗封装成DFSInputStream对象,此对象可以管理DN和NN的数据流,客户端调用read方法,DFSInputStream就会找出离客户端最近的DN并连接.
数据从DN流向客户端
如果第一个block读完了,就关闭指向第一block块的DN链接,接着读下一个block
如果第一批block都读完了,DFSInputStream去NN拿下一批block的location,如果所有的block都读完,则关闭所有的流
写入文件:
首先把文件切分成block.
client一般都是把文件写入到3个DN中,所以NN中要增加一个文件,放到目录树中,存放元数据?,NN要返回3个DN的位置,client先拿到最近的DN的位置
每次写入一个packet大小(默认64K),第一个64k写到第一个节点上,再写下一个64k,当第一数据块写完,第一个DN再把数据传给第二个DN,以此类推..形成数据写入流水线
当最后一个节点写完了,会传递给前一个节点通知,当第一个节点收到此通知后,开始写下一个数据块
当所有数据块写完后,关闭所有的流,并通知NN,文件写完了.
副本存放策略
Hadoop 0.17之前的副本策略
第一个副本:存储在同机架的不同节点上。
第二个副本:存储在同机架的另外一个节点上。
第三个副本:存储在不同机架的另外一个节点。
其它副本:选择随机存储。
Hadoop 0.17 之后的副本策略
第一个副本:存储在同 Client 相同节点上。
第二个副本:存储在不同机架的节点上。
第三个副本:存储在第二个副本机架中的另外一个节点上。
其它副本:选择随机存储。