1. 程式人生 > >HDFS檔案寫入與讀取

HDFS檔案寫入與讀取

HDFS檔案寫入與讀寫


副本(3個)選擇策略說明

1. 若client為DataNode節點,那儲存block時,規則為:副本1,同client的節點上;副本2,不同機架節點上;副本3,同第二個副本機架的另一個節點上;其他副本隨機挑選。

2. 若client不為DataNode節點,那儲存block時,規則為:副本1,隨機選擇一個節點上;副本2,不同副本1,機架上;副本3,同副本2相同的另一個節點上;其他副本隨機挑選。

將一個100M的檔案上傳到HDFS中,Hadoop叢集如上圖所示的三個Rack,8個DataNode節點,叢集配置採用預設配置。HDFS資料塊的預設大小為64M,則該檔案被分為兩個BLOCK進行寫入:Block1(64M)和Block2(36M)。

① HadoopClient向叢集中的NameNode請求檔案的寫入(圖中紅色實線)

② NameNode節點接收到寫入請求,記錄block資訊,並返回可用的DataNode節點。比如: Block1 : DataNode1——DataNode2——DataNode5

Block2 : DataNode4——DataNode3——DataNode6

需要說明的是:

(1) 如果上傳本機不是一個datanode,而是一個客戶端,那麼就從所有slave機器中隨機選擇一臺datanode作為第一個塊的寫入機器(datanode1)。

而此時如果上傳機器本身就是一個datanode(例如mapreduce作業中task通過DFSClient向hdfs寫入資料的時候),那麼就將該datanode本身作為第一個塊寫入機器(datanode1)。

(2) 隨後在datanode1所屬的機架以外的另外的機架上,隨機的選擇一臺,作為第二個block的寫入datanode機器(datanode2)。

 (3) 在寫第三個block前,先判斷前兩個datanode是否是在同一個機架上,如果是在同一個機架,那麼就嘗試在另外一個機架上選擇第 三個datanode作為寫入機器(datanode3)。而如果datanode1和datanode2沒有在同一個機架上,則在datanode2所 在的機架上選擇一臺datanode作為datanode3。

Client接受到NameNode傳送的可用DataNode列表(各個DataNode有排序,後面說明

)之後,開始用流式的方式傳送檔案的Block,過程如下:

1 > 將block1(64M)劃分為64k的packet;

2 > 然後Client將第一個64k的packet傳送給DataNode1;

3 > DataNode1接收完後,將第一個packet傳送給DataNode2,同時client向DataNode1傳送第二個64k的packet;

4 > DataNode2接收完第一個packet後,傳送給DataNode5,同時接收DataNode1發來的第二個packet;

5 > 以此類推,直到將block1傳送完畢;

6 > DataNode1,DataNode2,DataNode5向NameNode傳送“已完成”訊息,DataNode1同時向Client傳送完成通知;

7 > client收到DataNode1發來的訊息後,向NameNode傳送訊息,表示已完成寫入。

8 > 傳送完block1後,再向DataNode4、DataNode3、DataNode6傳送Block2,以此類推。

對③的說明

NameNode根據Client的寫入請求選取可用的DataNode節點,在NameNode返回該DataNode列表到客戶端Client之前,會在NameNode端根據該寫入客戶端跟 DataNode列表中每個DataNode之間的“距離”由近到遠進行一個排序。如果此時寫入端不是DataNode,則選擇DataNode列 表中的第一個排在第一位。客戶端根據這個順序有近到遠的進行資料塊的寫入。在此,判斷兩個DataNode之間“距離”的演算法就比較關鍵,hadoop目前距離計算如下:


每個DataNode都會對應自己在叢集中的位置和層次,如n1的位置資訊為“/r1/n1”,那麼它所處的層次就為2,其餘類推。得到兩個node的層次後,會沿著每個node所處的拓樸樹中的位置向上查詢,如“/r1/n1”的上一級就是“ /r1”,此時兩個節點之間的距離加1,兩個node分別同上向上查詢,直到找到共同的祖先節點位置,此時所得的距離數就用來代表兩個節點之間的距離。如上圖所示,n2與藍色所示DataNode(命名為node)之間的距離就為2(因為node/r1/node,而n2/r1/n2,,為了找到相同的祖先節點,二者需要各自向上級查詢1位,即找到共同祖先節點為r1,則1+1=2),而n3則為4(同理)。

如下圖所示為從原始碼角度對HDFS檔案寫入的程式控制流程的描述:

 

(1) 客戶端通過呼叫DistributedFileSystem的create方法建立新檔案。
(2)DistributedFileSystem通過RPC呼叫namenode去建立一個沒有blocks關聯的新檔案,建立前,namenode會做各種校驗,比如檔案是否存在,客戶端有無許可權去建立等。如果校驗通過,namenode就會記錄下新檔案,否則就會丟擲IO異常。
(3)前兩步結束後會返回FSDataOutputStream的物件,和讀檔案的時候相似,FSDataOutputStream被封裝成DFSOutputStream,DFSOutputStream可以協調namenode和datanode。客戶端開始寫資料到DFSOutputStreamDFSOutputStream會把資料切成一個個小packet,然後排成佇列data quene
(4)DataStreamer會去處理接受data quene,他先問詢namenode這個新的block最適合儲存的在哪幾個datanode裡,比如重複數是3,那麼就找到3個最適合的datanode,把他們排成一個pipeline。DataStreamerpacket按佇列輸出到管道的第一個datanode中,第一個datanode又把packet輸出到第二個datanode中,以此類推。
(5)DFSOutputStream還有一個對列叫ack quene,也是有packet組成,等待datanode的收到響應,當pipeline中的所有datanode都表示已經收到的時候,這時akc quene才會把對應的packet包移除掉。
(6)客戶端完成寫資料後呼叫close方法關閉寫入流
(7)DataStreamer把剩餘得包都刷到pipeline裡然後等待ack資訊,收到最後一個ack後,通知datanode把檔案標示為已完成。

補充:讀取資料

 當對某個檔案的某個block進行讀取的時候,hadoop採取的策略也是一樣:

  1.首先得到這個block所在的datanode的列表,有幾個副本數該列表就有幾個datanode。

  2.根據列表中datanode距離讀取端的距離進行從小到大的排序:

  a)首先查詢本地是否存在該block的副本,如果存在,則將本地datanode作為第一個讀取該block的datanode

  b)然後查詢本地的同一個rack下是否有儲存了該block副本的datanode

  c)最後如果都沒有找到,或者讀取資料的node本身不是datanode節點,則返回datanode列表的一個隨機順序。

相關推薦

HDFS檔案寫入讀取

HDFS檔案寫入與讀寫 副本(3個)選擇策略說明: 1. 若client為DataNode節點,那儲存block時,規則為:副本1,同client的節點上;副本2,不同機架節點上;副本3,同第二個副本機架的另一個節點上;其他副本隨機挑選。 2. 若client

Unity 簡單的檔案寫入讀取

我們在進行檔案的寫入和讀取時必須要確定一個路徑,那我們就需要用到獲取路徑的方法 Unity中獲取路徑的方法是:Application.dataPath; 然而還有獲取一個臨時的路徑:Applicat

C# 記憶體檔案寫入讀取示例

/// <summary> /// 寫入int值到記憶體檔案 /// </summary> /// <param name="data"></param>

java Properties配置檔案寫入讀取

一、Properties 1.作用:讀寫資源配置檔案; 2.鍵與值只能為字串; 3.方法: setProperty(String key,String value) getProperty(String key) getProperty(String key,default

node 操作檔案流 fs 同步非同步 流式檔案寫入讀取

fs fs ( File System ) 檔案系統 在node中通過fs模組來和系統中的檔案進行互動 通過fs模組可以對磁碟中的檔案做各種增刪改查的操作 寫入檔案 1.同

文件 日誌 寫入 讀取

post 入口 頁面 ces close footer list() tostring 內容 private static string logPath = @"D:\LogS\Logs\"; public static string FloderPath

自動化測試-17.selenium數據的分離之txt文本的寫入讀取

try 什麽 ioe 9.png spl 自動 except AI int 前言   數據量偏小時,用txt文本保存數據比較合適,以-進行區分,為什麽不用:呢?原因是,我們在使用數據時,會存在url地址的情況,裏面寶行:所以用-進行替代 此處附上代碼 1 #encodi

簡單的檔案寫入儲存 python小效果

import tkinter # 建立一個主視窗 win = tkinter.Tk() # 設定標題 win.title("python-1805") # 設定視窗大小和位置 win.geometry("400x400+400+40") # 設定一個變數來接收輸入控制元件的內容 e = t

C#對文字的寫入讀取操作

C#對文字的寫入與讀取操作。 示例:使用txt文字模仿日誌功能的寫入與讀取操作。 1、寫入操作 /// <summary> /// 寫入日誌 /// </summary> public static void WriteLog(string message)

java對excel寫入讀取

maven: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.16</ve

HDFS檔案寫入

上一篇 部落格中介紹了 HDFS 讀取檔案的流程,這篇文章趁熱打鐵,介紹一下 HDFS 檔案寫入的流程,整個流程如下: 通過 FileSystem.get 方法獲取檔案系統 FileSystem,HDFS 檔案系統例項為 DistributedFileSystem。 通過 DistributedFileSy

簡單的檔案寫入儲存 python小效果

import tkinter # 建立一個主視窗 win = tkinter.Tk() # 設定標題 win.title("python-1805") # 設定視窗大小和位置 win.geometry

java無格式int檔案寫入讀取

今天寫一個小程式,需要將int陣列寫入檔案,然後再讀出來。為了節省空間,打算採用直接把每個int的位元組碼寫入檔案,讀的時候也是按照int的位元組碼直接進行讀取,省略了逗號、換行符等格式編碼。 第一次嘗試: FileOutputStream fOut = new File

android檔案寫入讀取

//讀寫檔案函式呼叫writeFileData(filename,datas); String result=readFileData(filename); Toast.makeText(Main2Activity.this,result.getClass().toString(),Toast.LENG

PHP 檔案寫入讀取(必看篇)

文章提綱: 一.實現檔案讀取和寫入的基本思路 二.使用fopen方法開啟檔案 三.檔案讀取和檔案寫入操作 四.使用fclose方法關閉檔案 五.檔案指標的移動 六.Windows和UNIX下的回車和換行 一.實現檔案讀取和寫入的基本思路: 1.通過fopen方法開啟檔案:$fp =fopen(

Unity C# TXT檔案寫入讀取以及Split()的用法

寫於2017-3-14以下程式碼應該是從某些部落格摘的,當時沒標記,現在找不著了。這裡做一下整理,方便自己用。一、Unity C# TXT檔案寫入和讀取void WriteTXT(){StreamWriter sw;FileInfo fi= new FileInfo(Appl

NSIS 檢測程式版本號、登錄檔的寫入讀取例項 (學習二)

 !define PRODUCT_NAME "pkpm" !define PRODUCT_VERSION "1.0" !define PRODUCT_PUBLISHER "My company, Inc." !define PRODUCT_UNINST_KEY "Sof

hdfs 檔案提交mr作業提交流程分析

看了不少東西,想把他們總結出來,若有錯誤還望不吝賜教 在hdfs架構中可以吧Client認為是送貨人,nn是倉庫管理員,dn是一個個倉庫。當客戶端要送貨(檔案)的時候,進行如下步驟 1.送貨員通過rpc通訊告知倉庫管理員(nn)說我這裡有貨物,請告訴我放在哪裡啊 2.倉

iOS plist檔案寫入讀取

有小夥伴問了一個問題,plist寫入失敗的問題。下面我說下相關的程式碼: 1.寫入plist(程式碼建立的plist檔案)此方法是不斷寫入,不會替換之前資料 - (void)insertToPlist:(NSDictionary *)dictionary nickNa

TensorFlow的檔案儲存讀取——variables_to_restore函式

轉,原創詳見: http://blog.csdn.net/sinat_29957455/article/details/78508793variables_to_restore函式,是TensorFlow為滑動平均值提供。之前,也介紹過通過使用滑動平均值可以讓神經網路模型更加的健壯。我們也知道,其實在Tens