1. 程式人生 > >Hadoop學習——hdfs上傳讀取刪除檔案的過程

Hadoop學習——hdfs上傳讀取刪除檔案的過程

Hadoop學習——hdfs上傳讀取刪除檔案的過程

在這裡插入圖片描述

  1. namnode,名位元組點,最主要管理HDFS的元資料資訊。
  2. datanode,資料節點,儲存檔案塊
  3. replication,檔案塊的副本,目的是確保資料儲存的可靠性
  4. rack 機器
  5. Client 客戶端。凡是通過指令或程式碼操作的一端都是客戶端
  6. Client 的Read(從HDFS下載檔案到本地)
  7. Client的Write(上傳檔案到HDFS上)

從HDFS上讀取檔案的過程

在這裡插入圖片描述

  1. 客戶端發起open File,目的是獲取要下載的檔案的輸入流。
    namenode

    收到請求之後,會檢查路徑的合法性,以及客戶端的許可權。

  2. 客戶端在發起open file的同時,還會呼叫getblockLocation。當第一步監測都通過之後,namenode會將元資料資訊全部或者部分封裝到輸入流中,返回給客戶端。

  3. 客戶端用輸入流,根據元資料資訊,去指定的datanode讀取檔案塊,一般去最近的節點上獲取資料。(按照blockid的順序讀取)。之所以不是namenode來拿資料返回給datanode,而是客戶端自己去找,是因為namenode僅有一個,會有單點問題,減少了namenode的壓力。

  4. 同上。如果沒有讀完,則仍舊請求namenode,去要下一個塊的資訊。

  5. 檔案下載完成後關閉連線。

  6. 讀取每個塊的過程中會有校驗的過程,校驗不一致,則通知namenode。重新讀取。

1、校驗是在傳送資料前將資料通過MD5算出一個唯一標識碼,
   並將該標識碼隨資料包一起傳送給客戶端。
2、客戶端收到資料後也以同樣方式算出一個標識碼,兩者進行比較,
   如果不同,則表示檔案傳輸缺失。

HDFS上傳檔案的過程

在這裡插入圖片描述

  1. 客戶端發起create file請求,目的是獲取hdfs檔案的輸出流。namenode收到請求後會檢測路徑的合法性,以及許可權。原生Hadoop許可權管理不是很完善,工作中用的是cdh(商業版hadoop
    )。
  2. 如果檢測都通過,namenode會為這個檔案生成塊的元資料資訊(比如檔案切塊分配塊id分配每個塊存在哪個datanode上),然後將該資訊返回給客戶端。
  3. 客戶端拿出輸出流之後,採用pipeline(資料流管道)機制做資料的傳送。副本一般都是3個,但是為什麼在拷貝中是一個datanode,然後在datanode之間線性傳輸,而不是一次給三個datanode那樣拓撲式傳輸呢?這樣的資料以管道的方式,順序的沿著一個datanode傳輸,這樣能夠充分利用每個機器的頻寬,避免網路瓶頸和高延遲時的連線,最小化推送所有資料的延時。線上性推送模式下,每臺機器所有的出口寬頻都用於以最快的速度傳輸資料,而不是在多個接受者之間分配寬頻
    packet是一個64kb大小的資料包,即客戶端在傳送檔案塊時,會把檔案打散成一個個的資料包,傳送給datanode
    4.5 每臺datanode收到packet後,會向上遊datanodeack確認,如果接受失敗,會進行重發。
    6.當一個檔案上傳完後,關流。

HDFS刪除檔案的過程

  1. 當客戶端發起一個刪除指令hadoop fs -rm /park01/1.txt,這個指令會傳給namenode
  2. namenode收到指令後,做路徑和許可權檢測,如果檢測都通過,會將對應的檔案資訊從記憶體中刪除。此時,檔案資料並不是馬上就從叢集上被刪除。
  3. datanodenamenode傳送心跳時,會領取刪除指令,然後從磁碟上將檔案刪除。

hdfs讀取檔案的原始碼分析

DFSClicent類,利用ClientProtocol這個介面,通過rpc的形式與namenode進行通訊。ClientProtocol裡,會呼叫namenode的方法。

DFSInputStream是在DFSClicent通過ClientProtocol介面,利用rpc在向namenode發起open file命令是,namenode會返回客戶端一個DFSInputStream流,該流裡封裝著元資料資訊(即LocatedBlocksl類)以及DatanodeInfo節點資訊。客戶端再通過流中的BlockReaderdatanode讀取資料。

hdfs上傳檔案的原始碼分析

  客戶端在檔案上傳的時候發起write請求,namenode返回一個DFSOutputStream輸出流。輸出流會將檔案打散成64kb的包(Packet),並且每個包含有一個512b的校驗碼(DataChecksum),然後建立一個數據佇列dataqueue,將所有資料包加到·dataqueue佇列中,最後啟動DataStreamer執行緒。

上邊說過:
在打散包時,會對每個包算出一個校驗碼,在傳送過程中也將校驗碼傳送到
datanode,datanode在接受後,也會以相同邏輯算一次校驗碼,
通過自己算出來的和傳過來的校驗碼兩者是否一致,來確定資料的完整性。

  DataStreamer(後臺執行緒繼承了Daemon)執行緒通過資料管道,將包傳送給第一個datanode,並且將資料再放一份到一個新的佇列中ackqueueackqueue的作用在傳送失敗的時候,可以從該佇列裡恢復,確保資料的完整。

  ResponseProcessor執行緒就是專門來收集拷貝後的ack如果失敗了之後,它會執行從ackqueue裡取資料重新發送,如果傳送成功了。則刪除ackqueue的資料。

注意:
ackqueue和dataque都是LinkedList<Packet>型別,Packet即是上邊的資料塊,
LinkedList的特點是無界,並且增刪快的特點。

datanode原始碼

  DataNode是一個類。

  DataNodeProtocol介面是namenodedatanode之間互動的介面,比如sendHeartbeat心跳方法。

  BlockerSender是從datanode的角度來看,它作為傳送給客戶端資料、datanode之間傳輸資料的介面。
  另外,在叢集中當資料分佈不均勻時,開啟負載均衡工具時,也會用到BlockerSender。即hadoop安裝目錄下sbin目錄中的start-balancer.sh,在執行如下命令時:

start-balancer.sh -t 10%  //10%表示各節點之間資料的偏差率不能高於10%

  注意該命令不是永久的,如果再填入新節點,也需要執行一下,才會有效。

ClientDatanodeProtocol即客戶端和datanode互動的介面。

其他的還沒學到,簡單的記錄一下。