Hadoop之HDFS的數據流

1. HDFS 寫數據流程

1.1. 文件寫入

(1) 客戶端向 namenode 請求上傳文件,namenode 檢查目標文件是否已存在,父目錄是否存在;
(2) namenode 返回是否能夠上傳;
(3) 客戶端請求第一個 block 上傳到哪幾個 datanode 服務器上;
(4) namenode 返回3個 datanode 節點,分別爲 dn一、dn二、dn3;
(5) 客戶端請求 dn1 上傳數據,dn1 收到請求會繼續調用 dn2,而後 dn2 調用 dn3,將這個通訊管道創建完成;
(6) dn一、dn二、dn3 逐級應答客戶端;
(7) 客戶端開始往 dn1上傳第一個 block(先從磁盤讀取數據放到一個本地內存緩存),以 packet 爲單位,dn1 收到一個 packet 就會傳給 dn2,dn2 傳給 dn3;dn1 每傳一個 packet 會放入一個應答隊列等待應答;
(8) 當一個 block 傳輸完成以後,客戶端再次請求namenode 上傳第二個 block 的服務器。(重複執行3-7步)html

1.2. 網絡拓撲

在本地網絡中,兩個節點被稱爲「彼此近鄰」是什麼意思?在海量數據處理中,其主要限制因素是節點之間數據的傳輸速率——帶寬很稀缺。這裏的想法是將兩個節點間的帶寬做爲距離的衡量標準。
節點距離:兩個節點到達最近的共同祖先的距離總和。
例如,假設有數據中心 d1 機架 r1 中的節點 n1。該節點能夠表示爲 /d1/r1/n1。利用這種標記,這裏給出四種距離描述。
Distance(/d1/r1/n1, /d1/r1/n1)=0(同一節點上的進程)
Distance(/d1/r1/n1, /d1/r1/n2)=2(同一機架上的不一樣節點)
Distance(/d1/r1/n1, /d1/r3/n2)=4(同一數據中心不一樣機架上的節點)
Distance(/d1/r1/n1, /d2/r4/n2)=6(不一樣數據中心的節點)java

你們能夠算算下面兩個節點間的距離node

1.3. 機架感知

(1) 官方 ip 地址:
http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-common/RackAwareness.html
http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html#Data_Replication
(2) 低版本 Hadoop 副本節點選擇
第一個副本在 client 所處的節點上。若是客戶端在集羣外,隨機選一個。
第二個副本和第一個副本位於不相同機架的隨機節點上。
第三個副本和第二個副本位於相同機架,節點隨機。apache

(3) Hadoop2.7.2 副本節點選擇
第一個副本在 client 所處的節點上。若是客戶端在集羣外,隨機選一個。
第二個副本和第一個副本位於相同機架,隨機節點。
第三個副本位於不一樣機架,隨機節點。緩存

2. HDFS 讀數據流程

(1) 客戶端向 namenode 請求下載文件,namenode 經過查詢元數據,找到文件塊所在的 datanode 地址;
(2) 挑選一臺 datanode(就近原則,而後隨機)服務器,請求讀取數據;
(3) datanode 開始傳輸數據給客戶端(從磁盤裏面讀取數據放入流,以 packet 爲單位來作校驗);
(4) 客戶端以 packet 爲單位接收,先在本地緩存,而後寫入目標文件。服務器

3. 一致性模型

(1) debug 調試以下代碼網絡

@Test
public void writeFile() throws Exception{
    // 1 建立配置信息對象
    Configuration configuration = new Configuration();
    fs = FileSystem.get(configuration);
		
    // 2 建立文件輸出流
    Path path = new Path("hdfs://hadoop01:8020/user/hello.txt");
    FSDataOutputStream fos = fs.create(path);
		
    // 3 寫數據
    fos.write("hello".getBytes());
    // 4 一致性刷新
    fos.hflush();
		
    fos.close();
}

(2) 總結oop

寫入數據時,若是但願數據被其餘 client 當即可見,調用以下方法
FsDataOutputStream. hflush ();        //清理客戶端緩衝區數據,被其餘 client 當即可見spa

 

本文爲原創文章,若是對你有一點點的幫助,別忘了點贊哦!比心!如需轉載,請註明出處,謝謝!

相關文章
相關標籤/搜索