讀程圖:
1、客戶端發送請求,調用DistributedFileSystem API的open方法發送請求到Namenode,獲得block的位置信息,因為真正的block是存在Datanode節點上的,而namenode里存放了block位置信息的元數據。
2、Namenode返回所有block的位置信息,並將這些信息返回給客戶端。
3、客戶端拿到block的位置信息后調用FSDataInputStream API的read方法並行的讀取block信息,圖中4和5流程是並發的,block默認有3個副本,所以每一個block只需要從一個副本讀取就可以。
4、datanode返回給客戶端。
寫流程:
1、客戶端發送請求,調用DistributedFileSystem API的create方法去請求namenode,並告訴namenode上傳文件的文件名、文件大小、文件擁有者。
2、namenode根據以上信息算出文件需要切成多少塊block,以及block要存放在哪個datanode上,並將這些信息返回給客戶端。
3、客戶端調用FSDataInputStream API的write方法首先將其中一個block寫在datanode上,每一個block默認都有3個副本,並不是由客戶端分別往3個datanode上寫3份,而是由
已經上傳了block的datanode產生新的線程,由這個namenode按照放置副本規則往其它datanode寫副本,這樣的優勢就是快。
4、寫完后返回給客戶端一個信息,然后客戶端在將信息反饋給namenode。
5、需要注意的是上傳文件的擁有者就是客戶端上傳文件的用戶名,舉個例子用windows客戶端上傳文件,那么這個文件的擁有者就是administrator,和linux上的系統用戶名不是一樣的。