2014-06-19 158 views
6

我有一個關於HDFS文件寫入和讀取的基本問題。例如,如果我正在使用默認配置寫入文件,則Hadoop內部必須將每個塊寫入3個數據節點。我的理解是,對於每個塊,首先客戶端將塊寫入管道中的第一個數據節點,然後通知第二個數據節點,依此類推。一旦第三個數據節點成功接收到該數據塊,就會通過數據節點1向數據節點2和客戶端提供確認。只有在接收到該數據塊的確認後,才認爲寫入成功,並且客戶端繼續寫入下一個區塊Hadoop:HDFS文件寫入和讀取

如果是這種情況,則是不寫每個塊所花費的時間超過一個傳統的文件寫入由於 -

  1. 複製因子(默認爲3)和
  2. 的寫入過程在塊後依次發生。

如果我的理解錯了,請糾正我。此外,下面的下列問題:

  1. 我的理解是在Hadoop中該文件的讀/寫沒有任何並行性,它可以執行最好的是相同的讀取或寫入(即如果複製是一種傳統的文件設置爲1)+分佈式通信機制中涉及的一些開銷。
  2. 並行性僅在數據處理階段通過Map Reduce提供,但不在客戶端的文件讀/寫期間提供。

回答

1

雖然你上面的文件寫入說明是正確的,但是一個DataNode可以同時讀寫數據。從HDFS Architecture Guide

一個數據管理部可以與前一個在管道 ,並在同一時間將數據轉發到在管道中的下一個來接收數據

的寫操作花費的時間比更多的時間在傳統的文件系統上(由於帶寬問題和一般開銷),但不到3倍(假設複製因子爲3)。

+0

那麼有效,一與傳統的文件讀/寫相比,hadoop中的寫或讀操作性能較低。另外,集羣的大小並不重要。複製因子越多,寫入數據所需的時間就越多。我只是想知道如何將數據以PB級的順序複製到hadoop集羣,或者性能如此之慢。只是在處理過程中實現性能並不足夠,因爲我們仍將根據數據複製到/離開hadoop的速度來決定。 –

1

我認爲你的理解是正確的。

有人可能會期望一個簡單的HDFS客戶端寫入一些數據,並且至少有一個塊副本已經寫入,它將收回控制權,而異步HDFS生成其他副本。

但是在Hadoop中,HDFS是圍繞「一次寫入,多次讀取」模式設計的,因此重點不在於寫入性能。

另一方面,您可以在Hadoop MapReduce(也可以看作HDFS客戶端)中找到並行性,並設計明確性來執行此操作。

1

HDFS寫操作:

有兩個參數

dfs.replication:默認塊複製。創建文件時可以指定實際的複製次數。如果在創建時未指定複製,則使用默認值

dfs.namenode.replication.min:最小的塊複製。

即使dfs.replication設置爲3,寫操作將被視爲成功的一次dfs.namenode.replication.min(default value : 1)已被複制。

但這種複製高達dfs.replication將在連續管道發生。第一個Datanode將該塊寫入並轉發給第二個Datanode。第二個Datanode將該塊寫入並轉發給第三個Datanode。

DFSOutputStream還維護一個等待被datanodes確認的數據包的內部隊列,稱爲ack隊列。 僅當數據包已被流水線中的所有Datanode確認後,才從確認隊列中刪除數據包。

看一看相關SE問題:Hadoop 2.0 data write operation acknowledgement

HDFS讀操作:

HDFS讀取操作發生在parallel,而不是像寫操作順序