hdfs塊存儲
① 關於hdfs的物理存儲路徑問題
我沒用過Hive,但HDFS的存儲機制都是一樣的。
你所謂的物理位置指的是在操作系統中的磁碟路徑?
這個路徑是在Hadoop配置的時候寫在hdfs-site.xml文件的dfs.datanode.data.dir欄位里的,在每個datanode的這個文件夾里存著該節點上存儲的所有數據塊block,以blk_打頭。
dfs.namenode.data.dir指定的文件夾在namenode中則存在元數據。
所以即便你知道這個所謂的物理路徑也沒什麼用,數據都是以block形式存在的,大的數據還由好多個block組成,而且每個block還有副本。
② HDFS的文件存儲過程
在正式介紹HDFS小文件存儲方案之前,我們先介紹一下當前HDFS上文件存取的基本流程。
(1) 讀文件流程
1)client端發送讀文件請求給namenode,如果文件不存在,返回錯誤信息,否則,將該文件對應的block及其所在datanode位置發送給client
2) client收到文件位置信息後,與不同datanode建立socket連接並行獲取數據。
(2) 寫文件流程
1) client端發送寫文件請求,namenode檢查文件是否存在,如果已存在,直接返回錯誤信息,否則,發送給client一些可用namenode節點
2) client將文件分塊,並行存儲到不同節點上datanode上,發送完成後,client同時發送信息給namenode和datanode
3) namenode收到的client信息後,發送確信信息給datanode
4) datanode同時收到namenode和datanode的確認信息後,提交寫操作。
③ 對象存儲、文件存儲和塊存儲的區別是什麼
對象存儲、文件存儲和塊存儲的區別如下:
1、速度不同
塊存儲:低延遲(10ms),熱點突出;
文件存儲:不同技術各有不同;
對象存儲:100ms-1s,冷數據;
2、可分步性不同
塊存儲:異地不現實;
文件存儲:可分布式,但有瓶頸;
對象存儲:分步並發能力高;
3、文件大小不同
塊存儲:大小都可以,熱點突出;
文件存儲:適合大文件;
對象存儲:適合各種大小;
4、介面不同
塊存儲:Driver,kernel mole ;
文件存儲:POSIX;
對象存儲:Restful API ;
5、典型技術不同
塊存儲:SAN;
文件存儲: HDFS,GFS;
對象存儲:Swift,Amazon S3;
6、適合場景不同
塊存儲:銀行;
文件存儲:數據中心;
對象存儲:網路媒體文件存儲。
(3)hdfs塊存儲擴展閱讀:
對象存儲、文件存儲和塊存儲的聯系:
通常來講,磁碟陣列都是基於Block塊的存儲,而所有的NAS產品都是文件級存儲。
1. 塊存儲:DAS SAN
a) DAS(Direct Attach Storage): 是直接連接於主機伺服器的一種存儲方式,每台伺服器有獨立的存儲設備,每台主機伺服器的存儲設備無法互通,需要跨主機存取資料室,必須經過相對復雜的設定,若主機分屬不同的操作系統,則更復雜。
應用:單一網路環境下且數據交換量不大,性能要求不高的環境,技術實現較早。
b) SAN(Storage Area Network): 是一種高速(光纖)網路聯接專業主機伺服器的一種存儲方式,此系統會位於主機群的後端,它使用高速I/O聯接方式,如:SCSI,ESCON及Fibre-Channels.特點是,代價高、性能好。但是由於SAN系統的價格較高,且可擴展性較差,已不能滿足成千上萬個CPU規模的系統。
應用:對網速要求高、對數據可靠性和安全性要求高、對數據共享的性能要求高的應用環境中。
2. 文件存儲
通常NAS產品都是文件級存儲。
NAS(Network Attached Storage):是一套網路存儲設備,通常直接連在網路上並提供資料存取服務,一套NAS儲存設備就如同一個提供數據文件服務的系統,特點是性價比高。
它採用NFS或CIFS命令集訪問數據,以文件為傳輸協議,可擴展性好、價格便宜、用戶易管理。目前在集群計算中應用較多的NFS文件系統,但由於NAS的協議開銷高、帶寬低、延遲大,不利於在高性能集群中應用。
3. 對象存儲:
總體上講,對象存儲同時兼具SAN高級直接訪問磁碟特點及NAS的分布式共享特點。
核心是將數據通路(數據讀或寫)和控制通路(元數據)分離,並且基於對象存儲設備(OSD),構建存儲系統,每個對象存儲設備具備一定的職能,能夠自動管理其上的數據分布。
對象儲存結構組成部分(對象、對象存儲設備、元數據伺服器、對象存儲系統的客戶端)
④ HDFS中的塊與普通文件系統的塊有什麼區別
分布式文件系統很多,包括GFS,HDFS,HDFS基本可以認為是GFS的一個簡化版實現,二者因此有很多相似之處。首先,GFS和HDFS都採用單一主控機+多台工作機的模式,由一台主控機(Master)存儲系統全部元數據,並實現數據的分布、復制、備份決策,主控機還實現了元數據的checkpoint和操作日誌記錄及回放功能。工作機存儲數據,並根據主控機的指令進行數據存儲、數據遷移和數據計算等。其次,GFS和HDFS都通過數據分塊和復制(多副本,一般是3)來提供更高的可靠性和更高的性能。當其中一個副本不可用時,系統都提供副本自動復制功能。同時,針對數據讀多於寫的特點,讀服務被分配到多個副本所在機器,提供了系統的整體性能。最後,GFS和HDFS都提供了一個樹結構的文件系統,實現了類似與Linux下的文件復制、改名、移動、創建、刪除操作以及簡單的許可權管理等。然而,GFS和HDFS在關鍵點的設計上差異很大,HDFS為了規避GFS的復雜度進行了很多簡化。首先,GFS最為復雜的部分是對多客戶端並發追加同一個文件,即多客戶端並發Append模型 。GFS允許文件被多次或者多個客戶端同時打開以追加數據,以記錄為單位。假設GFS追加記錄的大小為16KB ~ 16MB之間,平均大小為1MB,如果每次追加都訪問GFS Master顯然很低效,因此,GFS通過Lease機制將每個Chunk的寫許可權授權給Chunk Server。寫Lease的含義是Chunk Server對某個Chunk在Lease有效期內(假設為12s)有寫許可權,擁有Lease的Chunk Server稱為Primary Chunk Server,如果Primary Chunk Server宕機,Lease有效期過後Chunk的寫Lease可以分配給其它Chunk Server。多客戶端並發追加同一個文件導致Chunk Server需要對記錄進行定序,客戶端的寫操作失敗後可能重試,從而產生重復記錄,再加上客戶端API為非同步模型,又產生了記錄亂序問題。Append模型下重復記錄、亂序等問題加上Lease機制,尤其是同一個Chunk的Lease可能在Chunk Server之間遷移,極大地提高了系統設計和一致性模型的復雜度。而在HDFS中,HDFS文件只允許一次打開並追加數據,客戶端先把所有數據寫入本地的臨時文件中,等到數據量達到一個Chunk的大小(通常為64MB),請求HDFS Master分配工作機及Chunk編號,將一個Chunk的數據一次性寫入HDFS文件。由於累積64MB數據才進行實際寫HDFS系統,對HDFS Master造成的壓力不大,不需要類似GFS中的將寫Lease授權給工作機的機制,且沒有了重復記錄和亂序的問題,大大地簡化了系統的設計。然而,我們必須知道,HDFS由於不支持Append模型帶來的很多問題,構建於HDFS之上的Hypertable和HBase需要使用HDFS存放表格系統的操作日誌,由於HDFS的客戶端需要攢到64MB數據才一次性寫入到HDFS中,Hypertable和HBase中的表格服務節點(對應於Bigtable中的Tablet Server)如果宕機,部分操作日誌沒有寫入到HDFS,可能會丟數據。其次是Master單點失效的處理 。GFS中採用主從模式備份Master的系統元數據,當主Master失效時,可以通過分布式選舉備機接替主Master繼續對外提供服務,而由於Replication及主備切換本身有一定的復雜性,HDFS Master的持久化數據只寫入到本機(可能寫入多份存放到Master機器的多個磁碟中防止某個磁碟損害),出現故障時需要人工介入。另外一點是對快照的支持 。GFS通過內部採用-on-write的數據結構實現集群快照功能,而HDFS不提供快照功能。在大規模分布式系統中,程序有bug是很正常的情況,雖然大多數情況下可以修復bug,不過很難通過補償操作將系統數據恢復到一致的狀態,往往需要底層系統提供快照功能,將系統恢復到最近的某個一致狀態。總之,HDFS基本可以認為是GFS的簡化版,由於時間及應用場景等各方面的原因對GFS的功能做了一定的簡化,大大降低了復雜度。
⑤ hadoop 中一個大文件 在hdfs中是如何存儲的
文件是按照塊來存儲的,比如配置的每塊大小為64M,那麼5G的文件,會分成5*1024/64=80塊,每個塊會在不同節點上存多份。你上面說的依次寫入datanode,是指將每個塊依次寫入。
讀取的時候,也是一塊一塊來讀的,當然,這些都已經被HDFS的客戶端封裝好了,你看到就是在讀一個文件。
⑥ hdfs 在存儲大文件是分塊存儲的,默認塊大小是128M ,那麼map 在讀取的時候為什麼還切片
小於128m為1個split,大於128m小於256m就是2個split,分成128m一個split和剩下的一個split
⑦ Linux裡面hdfs作用是什麼
Hadoop分布式文件系統(HDFS)是指被設計成適合運行在通用硬體(commodity hardware)上的分布式文件系統(Distributed File System)。它和現有的分布式文件系統有很多共同點。但同時,它和其他的分布式文件系統的區別也是很明顯的。HDFS是一個高度容錯性的系統,適合部署在廉價的機器上。HDFS能提供高吞吐量的數據訪問,非常適合大規模數據集上的應用。HDFS放寬了一部分POSIX約束,來實現流式讀取文件系統數據的目的。HDFS在最開始是作為Apache Nutch搜索引擎項目的基礎架構而開發的。HDFS是Apache Hadoop Core項目的一部分。
HDFS有著高容錯性(fault-tolerant)的特點,並且設計用來部署在低廉的(low-cost)硬體上。而且它提供高吞吐量(high throughput)來訪問應用程序的數據,適合那些有著超大數據集(large data set)的應用程序。HDFS放寬了(relax)POSIX的要求(requirements)這樣可以實現流的形式訪問(streaming access)文件系統中的數據。
⑧ HDFS 存儲 980MB 的文件需要多少存儲空間
摘要 首先hdfs是建立在多個機器文件系統上的一個邏輯上的文件系統。它的底層數據以數據塊方式存儲,塊大小可進行調整。
⑨ 什麼是HDFS硬碟分布式存儲
Namenode 是一個中心伺服器,單一節點(簡化系統的設計和實現),負責管理文件系統的名字空間(namespace)以及客戶端對文件的訪問。
文件操作,NameNode 負責文件元數據的操作,DataNode負責處理文件內容的讀寫請求,跟文件內容相關的數據流不經過NameNode,只會詢問它跟哪個DataNode聯系,否則NameNode會成為系統的瓶頸。
副本存放在哪些DataNode上由 NameNode來控制,根據全局情況做出塊放置決定,讀取文件時NameNode盡量讓用戶先讀取最近的副本,降低帶塊消耗和讀取時延
Namenode 全權管理數據塊的復制,它周期性地從集群中的每個Datanode接收心跳信號和塊狀態報告(Blockreport)。接收到心跳信號意味著該Datanode節點工作正常。塊狀態報告包含了一個該Datanode上所有數據塊的列表。
NameNode支持對HDFS中的目錄、文件和塊做類似文件系統的創建、修改、刪除、列表文件和目錄等基本操作。 塊存儲管理,在整個HDFS集群中有且只有唯一一個處於active狀態NameNode節點,該節點負責對這個命名空間(HDFS)進行管理。
1、Name啟動的時候首先將fsimage(鏡像)載入內存,並執行(replay)編輯日誌editlog的的各項操作;
2、一旦在內存中建立文件系統元數據映射,則創建一個新的fsimage文件(這個過程不需SecondaryNameNode) 和一個空的editlog;
3、在安全模式下,各個datanode會向namenode發送塊列表的最新情況;
4、此刻namenode運行在安全模式。即NameNode的文件系統對於客服端來說是只讀的。(顯示目錄,顯示文件內容等。寫、刪除、重命名都會失敗);
5、NameNode開始監聽RPC和HTTP請求
解釋RPC:RPC(Remote Procere Call Protocol)——遠程過程通過協議,它是一種通過網路從遠程計算機程序上請求服務,而不需要了解底層網路技術的協議;
6、系統中數據塊的位置並不是由namenode維護的,而是以塊列表形式存儲在datanode中;
7、在系統的正常操作期間,namenode會在內存中保留所有塊信息的映射信息。
存儲文件,文件被分成block存儲在磁碟上,為保證數據安全,文件會有多個副本 namenode和client的指令進行存儲或者檢索block,並且周期性的向namenode節點報告它存了哪些文件的blo
文件切分成塊(默認大小128M),以塊為單位,每個塊有多個副本存儲在不同的機器上,副本數可在文件生成時指定(默認3)
NameNode 是主節點,存儲文件的元數據如文件名,文件目錄結構,文件屬性(生成時間,副本數,文件許可權),以及每個文件的塊列表以及塊所在的DataNode等等
DataNode 在本地文件系統存儲文件塊數據,以及塊數據的校驗和。
可以創建、刪除、移動或重命名文件,當文件創建、寫入和關閉之後不能修改文件內容。
NameNode啟動流程
1、Name啟動的時候首先將fsimage(鏡像)載入內存,並執行(replay)編輯日誌editlog的的各項操作;
2、一旦在內存中建立文件系統元數據映射,則創建一個新的fsimage文件(這個過程不需SecondaryNameNode) 和一個空的editlog;
3、在安全模式下,各個datanode會向namenode發送塊列表的最新情況;
4、此刻namenode運行在安全模式。即NameNode的文件系統對於客服端來說是只讀的。(顯示目錄,顯示文件內容等。寫、刪除、重命名都會失敗);
5、NameNode開始監聽RPC和HTTP請求
解釋RPC:RPC(Remote Procere Call Protocol)——遠程過程通過協議,它是一種通過網路從遠程計算機程序上請求服務,而不需要了解底層網路技術的協議;
6、系統中數據塊的位置並不是由namenode維護的,而是以塊列表形式存儲在datanode中;
7、在系統的正常操作期間,namenode會在內存中保留所有塊信息的映射信息。
HDFS的特點
優點:
1)處理超大文件
這里的超大文件通常是指百MB、數百TB大小的文件。目前在實際應用中,HDFS已經能用來存儲管理PB級的數據了。
2)流式的訪問數據
HDFS的設計建立在更多地響應"一次寫入、多次讀取"任務的基礎上。這意味著一個數據集一旦由數據源生成,就會被復制分發到不同的存儲節點中,然後響應各種各樣的數據分析任務請求。在多數情況下,分析任務都會涉及數據集中的大部分數據,也就是說,對HDFS來說,請求讀取整個數據集要比讀取一條記錄更加高效。
3)運行於廉價的商用機器集群上
Hadoop設計對硬體需求比較低,只須運行在低廉的商用硬體集群上,而無需昂貴的高可用性機器上。廉價的商用機也就意味著大型集群中出現節點故障情況的概率非常高。這就要求設計HDFS時要充分考慮數據的可靠性,安全性及高可用性。
缺點:
1)不適合低延遲數據訪問
如果要處理一些用戶要求時間比較短的低延遲應用請求,則HDFS不適合。HDFS是為了處理大型數據集分析任務的,主要是為達到高的數據吞吐量而設計的,這就可能要求以高延遲作為代價。
2)無法高效存儲大量小文件
因為Namenode把文件系統的元數據放置在內存中,所以文件系統所能容納的文件數目是由Namenode的內存大小來決定。一般來說,每一個文件、文件夾和Block需要佔據150位元組左右的空間,所以,如果你有100萬個文件,每一個占據一個Block,你就至少需要300MB內存。當前來說,數百萬的文件還是可行的,當擴展到數十億時,對於當前的硬體水平來說就沒法實現了。還有一個問題就是,因為Map task的數量是由splits來決定的,所以用MR處理大量的小文件時,就會產生過多的Maptask,線程管理開銷將會增加作業時間。舉個例子,處理10000M的文件,若每個split為1M,那就會有10000個Maptasks,會有很大的線程開銷;若每個split為100M,則只有100個Maptasks,每個Maptask將會有更多的事情做,而線程的管理開銷也將減小很多。
1280M 1個文件 10block*150位元組 = 1500 位元組 =1.5KB
1280M 12.8M 100個 100個block*150位元組 = 15000位元組 = 15KB
3)不支持多用戶寫入及任意修改文件
在HDFS的一個文件中只有一個寫入者,而且寫操作只能在文件末尾完成,即只能執行追加操作。目前HDFS還不支持多個用戶對同一文件的寫操作,以及在文件任意位置進行修改。
四、HDFS文件 讀寫流程
4.1 讀文件流程
(1) 打開分布式文件
調用 分布式文件 DistributedFileSystem.open()方法。
(2) 從 NameNode 獲得 DataNode 地址
DistributedFileSystem 使用 RPC 調用 NameNode, NameNode返回存有該副本的 DataNode 地址, DistributedFileSystem 返回一個輸入流 FSDataInputStream對象, 該對象封存了輸入流DFSInputStream。
(3) 連接到DataNode
調用 輸入流 FSDataInputStream 的 read() 方法, 從而輸入流DFSInputStream 連接 DataNodes。
(4) 讀取DataNode
反復調用 read()方法, 從而將數據從 DataNode 傳輸到客戶端。
(5) 讀取另外的DataNode直到完成
到達塊的末端時候, 輸入流 DFSInputStream 關閉與DataNode 連接,尋找下一個 DataNode。
(6) 完成讀取, 關閉連接
即調用輸入流 FSDataInputStream.close() 。
4.2 寫文件流程
(1) 發送創建文件請求: 調用分布式文件系統DistributedFileSystem.create()方法;
(2) NameNode中創建文件記錄: 分布式文件系統DistributedFileSystem 發送 RPC 請求給namenode, namenode 檢查許可權後創建一條記錄, 返回輸出流 FSDataOutputStream, 封裝了輸出流 DFSOutputDtream;
(3) 客戶端寫入數據: 輸出流 DFSOutputDtream 將數據分成一個個的數據包, 並寫入內部隊列。 DataStreamer 根據 DataNode 列表來要求 namenode 分配適合的新塊來存儲數據備份。一組DataNode 構成管線(管線的 DataNode 之間使用 Socket 流式通信)
(4) 使用管線傳輸數據: DataStreamer 將數據包流式傳輸到管線第一個DataNode, 第一個DataNode 再傳到第二個DataNode ,直到完成。
(5) 確認隊列: DataNode 收到數據後發送確認, 管線的DataNode所有的確認組成一個確認隊列。 所有DataNode 都確認, 管線數據包刪除。
(6) 關閉: 客戶端對數據量調用close() 方法。 將剩餘所有數據寫入DataNode管線, 並聯系NameNode且發送文件寫入完成信息之前等待確認。
(7) NameNode確認
(8) 故障處理: 若過程中發生故障, 則先關閉管線, 把隊列中所有數據包添加回去隊列, 確保數據包不漏。 為另一個正常DataNode的當前數據塊指定一個新的標識, 並將該標識傳送給NameNode, 一遍故障DataNode在恢復後刪除上面的不完整數據塊. 從管線中刪除故障DataNode 並把餘下的數據塊寫入餘下正常的DataNode。 NameNode發現復本兩不足時, 會在另一個節點創建一個新的復本
⑩ hdfs適合存儲多大的單個文件
首先hdfs是建立在多個機器文件系統上的一個邏輯上的文件系統。它的底層數據以數據塊方式存儲,塊大小可進行調整。
假如你設置一個數據塊大小為256M,上傳一個1G的文件,它底層會將這個文件分成4塊存儲,每個塊256M。你在hdfs上看到的是一個完整的文件,隨時可對這個文件進行操作,無需關注它的存儲。就像你在操作系統上操作文件一樣,無需關注它存在那個磁碟哪個扇區