1. 程式人生 > >Hadoop檔案寫入(詳細剖析)

Hadoop檔案寫入(詳細剖析)


步驟詳情:


檔案是如何寫入 HDFS 的。儘管比較詳細,但對於理解資料流還是很有用的,因為它清楚地說明了 HDFS 的一致模型。要考慮的情況是如何建立一個新檔案,並把資料寫入該檔案,最後關閉該檔案。參見上圖客戶端通過對 DistributedFileSystem 物件呼叫 create()函式來建立檔案(圖步驟1)。 DistributedFileSystem 對 namenode 建立一個 RPC 呼叫,在檔案系統的名稱空間中建立一個新檔案,此時該檔案中還沒有相應的資料塊(步驟 2)。 namenode 執行各種不同的檢查以確保這個檔案不存在,並且客戶端有建立該檔案的許可權。如果這些檢查翊通過, namenode就會為建立新檔案記錄一條記錄;否則,檔案建立失敗並向客戶端丟擲一個 IOException 異常 DistributedFileSystem 想客戶端返回一個 FSDataOutputStream 物件,由此客戶端可以開始寫入資料。就像讀取事件一樣, FSDataOutputStream 封裝一個 DFSoutPutstream 物件,該物件負責處理 datanode 和 namenode 之間的通訊。在客戶端寫入資料時(步驟 3), DFSOutputStream 將它分成一個個的資料包,並寫入內部佇列,稱為“資料佇列” (data queue)。 DataStreamer 處理資料佇列,它的責任是根據datanode 列表來要求 namenode 分配適合的新塊來儲存資料備份。這一組 datanode 構成一個管線一一假設複本數為 3,所以管線中有 3 個節點。 DataStreamer 將資料包流式傳輸到管線中第 1 個datanode,該 datanode 儲存資料包並將它傳送到管線中的第 2 個 datanode。同樣地,第 2 個 datanode 儲存該資料包並且傳送給管線中的第3 DFSOutputStream 也維護著一個內部資料包佇列來等待 datanode 的收到確認回執,稱為“確認佇列” (ack queue)。當收到管道中所有 datanode 確認資訊後,該資料包才會從確認佇列刪除(步驟 5)。如果在資料寫入期間, datanode 發生故障,則執行以下操作,這對與寫入資料的客戶端是透明的。首先關閉管線,確認把佇列中的任何資料包都添加回資料佇列的最前端,以確保故障節點下游的 datanode 不會漏掉任何一個數據包。為儲存在另一正常 datanode 的當前資料塊指定一個新的標識,並將該標識傳送給 namenode,以便故障 datanode 在恢復後可以刪除儲存的部分資料塊。從管線中刪除故障資料節點並且把餘下的資料塊寫入管線中的兩個正常的的 datanode。 namenode 注意到塊複本量不足時,會在另一個節點上建立一個新的複本。後續的資料塊繼續正常接受處理。在一個塊被寫入期間可能會有多個 datanode 同時發生故障,但非常少見。只要寫入了dfs. replication. min 的複本數(預設為 1),寫操作就會成功,並且這個塊可以在叢集中非同步複製,直到達到其目標複本數( dfs. replication 的預設值為 3)。客戶端完成資料的寫入後,會對資料流呼叫 close()方法(步驟 6)。該操作將剩餘的所有資料包寫入 datanode 管線中,並在聯絡 namenode 且傳送檔案寫入完成訊號之前,等待確認(步驟 7)


步驟總結:

由上圖可知;寫入檔案分為三個角色,分別是clientnode  namenode  和datanode

cliennode本質為java虛擬機器.namenode 和datanode則是Hadoop資料叢集儲存塊

第一步:create實際是客戶端建立DistributedFileSystem例項化物件

第二步 create通過例項化物件錄取呼叫物件中create()方法,此方法訪問namenode,那麼弄得收到命令,首先判斷datanode中所寫的檔案是否有重複,然後在檢查namenode是否有可寫入空餘的空間.當二者同時滿足是,namenode寫將datanode路徑資訊,檔案數等記錄,並確認資訊返回DistributedFileSystem,否則返回異常,DistributedFileSystem收到確認資訊後向客戶端返回一個FSDataOutputStream FSDataOutputStream物件

第三步:例項化例項化FSDataOutputStreamFSDataOutputStream物件(該物件負責處理 datanode 和 namenode 之間的通訊 ),呼叫該物件的write()方法,  即是圖中write實現過程該物件負責處理 datanode 和 namenode 之間的通訊

第四步:方法將資料分成多個數據包,並寫入內部佇列. DFDataOutStream 將寫入的資料分成多個數據包,並寫入內部佇列中,同時開啟datanode中DataStreamer處理資料佇列,它負責根據datanode列來要求namenode分配合適的新塊儲存資料備份開啟管道機制依次執行步驟4,同時即是write packet完整過程

第五步:每執行一次4就有一次步驟5返回確認資訊.

4和5屬於分別在DataQueue佇列和ACKQueue佇列,當每執行一次4就將此步確認資訊放到ACKQueue佇列中

如圖:


第六步:當FSDataOutputStream收到確認資訊後,執行close()方法關閉輸出流,

第七步:DistributeFileStream 返回給namenode確認資訊.

註釋:第4-5部分實現在後臺完成步不一定在第七步之前,

當執行第四步就就收第5步確認資訊,告訴namenode 資料寫入成功,即是第七步.


如有不明之處私信與我,相互交流經驗.,懇請多多指正.謝謝!


相關推薦

Hadoop檔案寫入(詳細剖析)

步驟詳情: 檔案是如何寫入 HDFS 的。儘管比較詳細,但對於理解資料流還是很有用的,因為它清楚地說明了 HDFS 的一致模型。要考慮的情況是如何建立一個新檔案,並把資料寫入該檔案,最後關閉該檔案

Hadoop基礎-HDFS的讀取與寫入過程剖析

簡要介紹 ron data 訪問 如果 上傳數據 4.2 客戶端訪問 文件寫入                 Hadoop基礎-HDFS的讀取與寫入過程剖析                                      作者:尹正傑 版權聲明:原創作品,謝絕轉

剖析HDFS的檔案寫入

  客戶端通過對DistributedFileSystem 物件呼叫create()來新建檔案(步驟1)。DistributedFileSystem對namenode 建立一個RPC呼叫,在檔案系統的名稱空間中新建一個檔案,此時該檔案中還沒有相應的資料塊(步

hadoop namenode啟動過程詳細剖析及瓶頸分析

NameNode中幾個關鍵的資料結構FSImageNamenode會將HDFS的檔案和目錄元資料儲存在一個叫fsimage的二進位制檔案中,每次儲存fsimage之後到下次儲存之間的所有hdfs操作,將會記錄在editlog檔案中,當editlog達到一定的大小(bytes,由fs.checkpoint.si

詳細剖析二進位制檔案的讀寫

一).一般問題  二進位制檔案與我們通常使用的文字檔案儲存方式有根本的不同。這樣的不同很難用言語表達,自己親自看一看,理解起來會容易得多。因此,我推薦學習二進位制檔案讀寫的朋友安裝一款十六進位制編輯器。這樣的編輯器有很多,在我們的 CVF 附帶的整合開發環境下就可以(將二進位制檔案拖動到 IDE 視窗後鬆

mysql5.7:mysql安裝和基於SSL加密的主從復制(詳細剖析

mysql ssl db 數據 加密傳輸 小生博客:http://xsboke.blog.51cto.com 小生 Q Q:1770058260 -------謝謝您的參考,如有疑問,歡迎交流目錄:--------my

Hadoop-HA配置詳細步驟

eno col ice nbsp 版本 files tab des frame 1. HA服務器配置 對hdfs做高可用 1.1服務器詳情 服務器:centos7 Hadoop:2.6.5 Jdk:1.8 共四臺服務器 192.168.1.111 node1 192

新手入門篇:虛擬機搭建hadoop環境的詳細步驟

文檔 優勢 indent gic 地址 完成 align 頁面 一段 前兩天看到有人留言問在什麽情況下需要部署hadoop,我給的回答也很簡單,就是在需要處理海量數據的時候才需要考慮部署hadoop。關於這個問題在很早之前的一篇分享文檔也有說到這個問題,數據量少的完全發揮不

Kylin官方案例詳細剖析及剪枝優化-OLAP商業環境實戰

版權宣告:本套技術專欄是作者(秦凱新)平時工作的總結和昇華,通過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和叢集環境容量規劃等內容,請持續關注本套部落格。版權宣告:禁止轉載,歡迎學習。 Kylin官方案例是一個非常經典的案例,包含的技術細節通過深挖能呈現出更具價值的資訊,如:資料倉庫理論

phpmyadmin利用日誌檔案寫入一句話

前提: root許可權,已經進入了phpmyadmin後臺 1、首先進入phpmyadmin後臺,檢視genelog變數,更改general log和general log file引數,初始設定general log是OFF,我們將其改成ON;general log file我們將其改

003-nodejs檔案寫入系統

  我們來試試nodejs的檔案寫入系統   ---實現檔案寫入操作--- //1.載入檔案作業系統,fs模組 var fs = require('fs'); //2.實現檔案寫入操作 var msg = 'Hello World'; //3.呼叫f

Gh0st原始碼詳細剖析

宣告: 首先宣告,這篇文章完全是根據自己對gh0st原始碼的理解寫出來的,如果有理解上的偏差或者表述上的錯誤本人不負責,僅供參考! 前言: 在我剛學習gh0st原始碼的時候,覺得這東西好難,三個工程放在一起不說,還有那麼多檔案,當時就懵了。這怎麼看呢?從何下手呢?我想大

詳細剖析I2C和SPI通訊協議的區別

原文連結:http://m.elecfans.com/article/610220.html 1. 概述I2C與SPI協議 IIC vs SPI現今,在低端數字通訊應用領域,我們隨處可見IIC (Inter-Integrated Circuit) 和 SPI (Serial

centos6 httpd2.2詳細剖析

以centos6.5為例 配置檔案: /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf 服務指令碼: /etc/rc.d/init.d/httpd 指令碼配置檔案:

Linux高階程式設計基礎——檔案系統程式設計之檔案寫入操作

檔案系統程式設計之檔案寫入操作——實驗題 //編寫程式碼,完成以下功能: //1.建立檔案file1,寫入字串“abcdefghijklmn”; //2.建立檔案file2,寫入字串“ABCDEFGHIJKLMN”; //3.讀取file1中的內容,寫入file2,使file2中的字串內容為“a

[Visual Studio C++][MFC] fstream函式的使用方法:C++檔案寫入、讀出函式。

文章轉自:https://www.cnblogs.com/zhoug2020/p/8427277.html [導讀]      ofstream是從記憶體到硬碟,ifstream是從硬碟到記憶體,其實所謂的流緩衝就是記憶體空間     &

將任意檔案寫入以太坊區塊的方法

      以太坊除數字貨幣方面的應用外,還可以儲存無法被篡改/刪除的資料(51%雙花攻擊或者區塊回滾除外)。      一段文字,一張照片,或者一首歌曲,只需寫入以太坊區塊中,即可真正做到 “恆久遠 永流傳” ,不會出現網盤、郵箱、網

python中 .write 無法向檔案寫入內容

問題程式碼如下 links = open("new") out = open("out.txt","w+") for link in links: out.write(link+"\n") 問題原因: 當沒有使用flush()或close()時,要寫入的內容依然在緩衝區中,沒有寫入檔案,如果中途

檔案路徑不存在則建立路徑,檔案存在則重新命名原檔案再建立新檔案寫入資料

String exportPath = "D:"+ File.separatorChar+new SimpleDateFormat("yyyy").format(date)+File.separatorChar +new SimpleDateFormat("MM").format(date);

SVM SMO演算法程式碼詳細剖析

演算法實現 一:本文要結合SVM理論部分來看即筆者另一篇https://blog.csdn.net/weixin_42001089/article/details/83276714 二:有了理論部分下面就是直接程式碼啦,本文用四部分進行介紹:最簡版的SMO,改進版platt SMO,核函式,