hadoop存儲結構
① hbase的核心數據結構
hbase的核心數據結構如下:
Hadoop是大數據開發的重要框架,其核心是HDFS和MapRece,HDFS為海量的數據提供了存陪備段儲,MapRece為海量的數據提供了計算,因此,需要重點掌握,除此之外,還需要掌握Hadoop集群、Hadoop集群管理、YARN以及Hadoop高級管理等相關技術與操作!
其他數據結構:
1、Java編程技術
Java編程技術是大數據學習的基礎,Java是一種強類型語言,擁有極高的跨平台滾租能力,可以編寫桌面應用程序、Web應用程序、分布式系統和嵌入式系統應用程序等,是大數據工程師最喜歡的編程工具,因此,想學好大數據,掌握Java基礎是必不可少的!
2、Linux命令
對於大數據開發通常是在Linux環境下進行的,相比Linux操作系統,Windows操作系統是封閉的操作系統,開源的大數據軟體很受限制,因此,想從事大數據開發相關工作,還需掌握Linux基礎操作命令蘆譽。
② Hadoop生態系統-新手快速入門(含HDFS、HBase系統架構)
Hadoop是一個由Apache基金會所開發的分布式系統基礎架構。
用戶可以在不了解分布式底層細節的情況下,開發分布式程序。充分利用集群的威力進行高速運算和存儲。
Hadoop實現了一個分布式文件系統(Hadoop Distributed File System),簡稱HDFS。HDFS有高容錯性的特點,並且設計用來部署在低廉的(low-cost)硬體上;而且它提供高吞吐量(high throughput)來訪問應用程序的數據,適合那些有著超大數據集(large data set)的應用程序。
Hadoop的框架最核心的設計就是:HDFS和MapRece。HDFS為海量的數據提供了存儲,而MapRece則為海量的數據提供了計算。
廣義的Hadoop,一般稱為Hadoop生態系統,如下所示。
Hadoop生態系統中這些軟體的作用:
HDFS 採用了主從(Master/Slave)結構模型,一個HDFS集群包括一個名稱節點(NameNode)和若干個數據節點(DataNode)。
HDFS採用Java語言開發,因此任何支持JVM的機器都可以部署名稱節點和數據節點。
在配置好Hadoop 集群之後,可以通過瀏覽器訪問 http://[NameNodeIP]:9870,查詢HDFS文件系統。通過該Web界面,可以查看當前文件系統中各個節點的分布信息。
HBase系統架構如下所示,包括客戶端、Zookeeper伺服器、Master主伺服器、Region伺服器。一般而言,HBase會採用HDFS作為底層數據存儲。
在HBase伺服器集群中,包含了一個Master和多個Region伺服器,Master是HBase集群的「總管」,它必須知道Region伺服器的狀態。
HBase中可以啟動多個Master,但是Zookeeper 可以幫助選舉出一個Master 作為集群的總管,並保證在任何時刻總有唯一一個Master在運行,這樣可以避免Master單點失效的問題。
Region伺服器是HBase中最核心的模塊,負責維護分配給自己的Region,並響應用戶的讀寫請求。
Store是Region伺服器的核心。每個Store對應了表中的一個列族的存儲。每一個Store包含了一個MemStore緩存和若干個StoreFile文件。
HBase採用HLog來保證系統發生故障時,能夠恢復到正確的狀態。HLog是磁碟上面的記錄文件,它記錄著所有的更新操作。
HBase系統為每個Region伺服器配置了一個HLog文件,它是一種預寫式日誌(Write Ahead Log),也就是說,用戶更新數據必須首先被記入日誌後,才能寫入MemStore緩存。
此外,Pig和Hive還為HBase提供了高層語言支持,使得在HBase上進行數據統計處理變的非常簡單。 Sqoop則為HBase提供了方便的RDBMS數據導入功能,使得傳統資料庫數據向HBase中遷移變的非常方便。
注意:Hadoop 安裝完成之後,只包含HDFS和MapRece,並不含HBase,因此需要在Hadoop 之上繼續安裝HBase。
③ 基於hadoop的雲存儲實例
基於Hadoop平台的雲存儲應用實踐
http://cio.itxinwen.com/case_studies/2012/0327/402100.html
雲計算(CloudComputing)是一種基於網際網路的超級計算模式,在遠程的數據中心裡,成千上萬台電腦和伺服器連接成一片電腦雲。用戶通過電腦、筆記本、手機等方式接人數據中心,按自己的需求進行運算。目前,對於雲計算仍沒有普遍一致的定義。結合上述定義,可以總結出雲計算的一些本質特徵,即分布式計算和存儲特性、高擴展性、用戶友好性、良好的管理性。
1雲存儲架構圖
橘色的作為存儲節點(StorageNode)負責存放文件,藍色作為控制節點((ControlNode)則是負責文件索引,並負責監控存儲節點間容量及負載的均衡,這兩個部分合起來便組成一個雲存儲。存儲節點與控制節點都是單純的伺服器,只是存儲節點的硬碟多一些,存儲節點伺服器不需要具備RAID的功能,只要能安裝Linux即可,控制節點為了保護數據,需要有簡單的RAIDlevelO1的功能。
雲存儲不是要取代現有的盤陣,而是為了應付高速成長的數據量與帶寬而產生的新形態存儲系統,因此雲存儲在設計時通常會考慮以下三點:
(1)容量、帶寬的擴容是否簡便
擴容是不能停機,會自動將新的存儲節點容量納入原來的存儲池。不需要做繁復的設定。
圖1雲存儲架構圖
(2)帶寬是否線形增長
使用雲存儲的客戶,很多是考慮未來帶寬的增長,因此雲存儲產品設計的好壞會產生很大的差異,有些十幾個節點便達到飽和,這樣對未來帶寬的擴容就有不利的影響,這一點要事先弄清楚,否則等到發現不符合需求時,已經買了幾百TB,後悔就來不及了。
(3)管理是否容易。
2雲存儲關鍵技術
雲存儲必須具備九大要素:①性能;②安全性;③自動ILM存儲;④存儲訪問模式;⑤可用性;⑥主數據保護;⑦次級數據保護;⑧存儲的靈活;⑨存儲報表。
雲計算的發展離不開虛擬化、並行計算、分布式計算等核心技術的發展成熟。下面對其介紹如下:
(1)集群技術、網格技術和分布式文件系統
雲存儲系統是一個多存儲設備、多應用、多服務協同工作的集合體,任何一個單點的存儲系統都不是雲存儲。
既然是由多個存儲設備構成的,不同存儲設備之間就需要通過集群技術、分布式文件系統和網格計算等技術,實現多個存儲設備之間的協同工作,使多個的存儲設備可以對外提供同一種服務,並提供更大更強更好的數據訪問性能。如果沒有這些技術的存在,雲存儲就不可能真正實現,所謂的雲存儲只能是一個一個的獨立系統,不能形成雲狀結構。
(2)CDN內容分發、P2P技術、數據壓縮技術、重復數據刪除技術、數據加密技術
CDN內容分發系統、數據加密技術保證雲存儲中的數據不會被未授權的用戶所訪問,同時,通過各種數據備份和容災技術保證雲存儲中的數據不會丟失,保證雲存儲自身的安全和穩定。如果雲存儲中的數據安全得不到保證,也沒有人敢用雲存儲了。
(3)存儲虛擬化技術、存儲網路化管理技術
雲存儲中的存儲設備數量龐大且分布多在不同地域,如何實現不同廠商、不同型號甚至於不同類型(例如FC存儲和IP存儲)的多台設備之間的邏輯卷管理、存儲虛擬化管理和多鏈路冗餘管理將會是一個巨大的難題,這個問題得不到解決,存儲設備就會是整個雲存儲系統的性能瓶頸,結構上也無法形成一個整體,而且還會帶來後期容量和性能擴展難等問題。
④ Hadoop系列之HDFS架構
本篇文章翻譯了Hadoop系列下的 HDFS Architecture ,原文最初經過筆者翻譯後大概有6000字,之後筆者對內容進行了精簡化壓縮,從而使筆者自己和其他讀者們閱讀本文時能夠更加高效快速的完成對Hadoop的學習或復習。本文主要介紹了Hadoop的整體架構,包括但不限於節點概念、命名空間、數據容錯機制、數據管理方式、簡單的腳本命令和垃圾回收概念。
PS:筆者新手一枚,如果看出哪裡存在問題,歡迎下方留言!
Hadoop Distributed File System(HDFS)是高容錯、高吞吐量、用於處理海量數據的分布式文件系統。
HDFS一般由成百上千的機器組成,每個機器存儲整個數據集的一部分數據,機器故障的快速發現與恢復是HDFS的核心目標。
HDFS對介面的核心目標是高吞吐量而非低延遲。
HDFS支持海量數據集合,一個集群一般能夠支持千萬以上數量級的文件。
HDFS應用需要對文件寫一次讀多次的介面模型,文件變更只支持尾部添加和截斷。
HDFS的海量數據與一致性介面特點,使得遷移計算以適應文件內容要比遷移數據從而支持計算更加高效。
HDFS支持跨平台使用。
HDFS使用主從架構。一個HDFS集群由一個NameNode、一個主伺服器(用於管理系統命名空間和控制客戶端文件介面)、大量的DataNode(一般一個節點一個,用於管理該節點數據存儲)。HDFS對外暴露了文件系統命名空間並允許在文件中存儲用戶數據。一個文件被分成一個或多個塊,這些塊存儲在一組DataNode中。NameNode執行文件系統命名空間的打開關閉重命名等命令並記錄著塊和DataNode之間的映射。DataNode用於處理客戶端的讀寫請求和塊的相關操作。NameNode和DataNode一般運行在GNU/Linux操作系統上,HDFS使用Java語言開發的,因此NameNode和DataNode可以運行在任何支持Java的機器上,再加上Java語言的高度可移植性,使得HDFS可以發布在各種各樣的機器上。一個HDFS集群中運行一個NameNode,其他機器每個運行一個(也可以多個,非常少見)DataNode。NameNode簡化了系統的架構,只用於存儲所有HDFS元數據,用戶數據不會進入該節點。下圖為HDFS架構圖:
HDFS支持傳統的分層文件管理,用戶或者應用能夠在目錄下創建目錄或者文件。文件系統命名空間和其他文件系統是相似的,支持創建、刪除、移動和重命名文件。HDFS支持用戶數量限制和訪問許可權控制,不支持軟硬鏈接,用戶可以自己實現軟硬鏈接。NameNode控制該命名空間,命名空間任何變動幾乎都要記錄到NameNode中。應用可以在HDFS中對文件聲明復制次數,這個次數叫做復制系數,會被記錄到NameNode中。
HDFS將每個文件存儲為一個或多個塊,並為文件設置了塊的大小和復制系數從而支持文件容錯。一個文件所有的塊(除了最後一個塊)大小相同,後來支持了可變長度的塊。復制系數在創建文件時賦值,後續可以更改。文件在任何時候只能有一個writer。NameNode負責塊復制,它周期性收到每個數據節點的心跳和塊報告,心跳錶示數據節點的正常運作,塊報告包含了這個DataNode的所有塊。
副本存儲方案對於HDFS的穩定性和性能至關重要。為了提升數據可靠性、靈活性和充分利用網路帶寬,HDFS引入了機架感知的副本存儲策略,該策略只是副本存儲策略的第一步,為後續優化打下基礎。大型HDFS集群一般運行於橫跨許多支架的計算機集群中,一般情況下同一支架中兩個節點數據傳輸快於不同支架。一種簡單的方法是將副本存放在單獨的機架上,從而防止丟失數據並提高帶寬,但是增加了數據寫入的負擔。一般情況下,復制系數是3,HDFS存儲策略是將第一份副本存儲到本地機器或者同一機架下一個隨機DataNode,另外兩份副本存儲到同一個遠程機架的不同DataNode。NameNode不允許同一DataNode存儲相同副本多次。在機架感知的策略基礎上,後續支持了 存儲類型和機架感知相結合的策略 ,簡單來說就是在機架感知基礎上判斷DataNode是否支持該類型的文件,不支持則尋找下一個。
HDFS讀取數據使用就近原則,首先尋找相同機架上是否存在副本,其次本地數據中心,最後遠程數據中心。
啟動時,NameNode進入安全模式,該模式下不會發生數據塊復制,NameNode接收來自DataNode的心跳和塊報告,每個塊都有一個最小副本數量n,數據塊在NameNode接受到該塊n次後,認為這個數據塊完成安全復制。當完成安全復制的數據塊比例達到一個可配的百分比值並再過30s後,NameNode退出安全模式,最後判斷是否仍然存在未達到最小復制次數的數據塊,並對這些塊進行復制操作。
NameNode使用名為EditLog的事務日誌持續記錄文件系統元數據的每一次改動(如創建文件、改變復制系數),使用名為FsImage的文件存儲全部的文件系統命名空間(包括塊到文件的映射關系和文件系統的相關屬性),EditLog和FsImage都存儲在NameNode本地文件系統中。NameNode在內存中保存著元數據和塊映射的快照,當NameNode啟動後或者某個配置項達到閾值時,會從磁碟中讀取EditLog和FsImage,通過EditLog新的記錄更新內存中的FsImage,再講新版本的FsImage刷新到磁碟中,然後截斷EditLog中已經處理的記錄,這個過程就是一個檢查點。檢查點的目的是確保文件系統通過在內存中使用元數據的快照從而持續的觀察元數據的變更並將快照信息存儲到磁碟FsImage中。檢查點通過下面兩個配置參數出發,時間周期(dfs.namenode.checkpoint.period)和文件系統事務數量(dfs.namenode.checkpoint.txns),二者同時配置時,滿足任意一個條件就會觸發檢查點。
所有的HDFS網路協議都是基於TCP/IP的,客戶端建立一個到NameNode機器的可配置的TCP埠,用於二者之間的交互。DataNode使用DataNode協議和NameNode交互,RPC包裝了客戶端協議和DataNode協議,通過設計,NameNode不會發起RPC,只負責響應來自客戶端或者DataNode的RPC請求。
HDFS的核心目標是即使在失敗或者錯誤情況下依然能夠保證數據可靠性,三種常見失敗情況包括NameNode故障、DataNode故障和network partitions。
網路分區可能會導致部分DataNode市區和NameNode的連接,NameNode通過心跳包判斷並將失去連接的DataNode標記為掛掉狀態,於是所有注冊到掛掉DataNode的數據都不可用了,可能會導致部分數據塊的復制數量低於了原本配置的復制系數。NameNode不斷地追蹤哪些需要復制的塊並在必要時候進行復制,觸發條件包含多種情況:DataNode不可用、復制亂碼、硬體磁碟故障或者認為增大負值系數。為了避免DataNode的狀態不穩定導致的復制風暴,標記DataNode掛掉的超時時間設置比較長(默認10min),用戶可以設置更短的時間間隔來標記DataNode為陳舊狀態從而避免在對讀寫性能要求高的請求上使用這些陳舊節點。
HDFS架構兼容數據各種重新平衡方案,一種方案可以在某個DataNode的空閑空間小於某個閾值時將數據移動到另一個DataNode上;在某個特殊文件突然有高的讀取需求時,一種方式是積極創建額外副本並且平衡集群中的其他數據。這些類型的平衡方案暫時還未實現(不太清楚現有方案是什麼...)。
存儲設備、網路或者軟體的問題都可能導致從DataNode獲取的數據發生亂碼,HDFS客戶端實現了對文件內容的校驗,客戶端在創建文件時,會計算文件中每個塊的校驗值並存儲到命名空間,當客戶端取回數據後會使用校驗值對每個塊進行校驗,如果存在問題,客戶端就會去另一個DataNode獲取這個塊的副本。
FsImage和EditLog是HDFS的核心數據結構,他們的錯誤會導致整個HDFS掛掉,因此,NameNode應該支持時刻維持FsImage和EditLog的多分復制文件,它們的任何改變所有文件應該同步更新。另一個選擇是使用 shared storage on NFS 或者 distributed edit log 支持多個NameNode,官方推薦 distributed edit log 。
快照能夠存儲某一特殊時刻的數據副本,從而支持HDFS在發生錯誤時會滾到上一個穩定版本。
HDFS的應用場景是大的數據集下,且數據只需要寫一次但是要讀取一到多次並且支持流速讀取數據。一般情況下一個塊大小為128MB,因此一個文件被切割成128MB的大塊,且每個快可能分布在不同的DataNode。
當客戶端在復制系數是3的條件下寫數據時,NameNode通過目標選擇演算法收到副本要寫入的DataNode的集合,第1個DataNode開始一部分一部分的獲取數據,把每個部分存儲到本地並轉發給第2個DataNode,第2個DataNode同樣的把每個部分存儲到本地並轉發給第3個DataNode,第3個DataNode將數據存儲到本地,這就是管道復制。
HDFS提供了多種訪問方式,比如 FileSystem Java API 、 C language wrapper for this Java API 和 REST API ,而且還支持瀏覽器直接瀏覽。通過使用 NFS gateway ,客戶端可以在本地文件系統上安裝HDFS。
HDFS使用目錄和文件的方式管理數據,並提供了叫做 FS shell 的命令行介面,下面有一些簡單的命令:
DFSAdmin命令集合用於管理HDFS集群,這些命令只有集群管理員可以使用,下面有一些簡單的命令:
正常的HDFS安裝都會配置一個web服務,通過可配的TCP埠對外暴露命名空間,從而使得用戶可以通過web瀏覽器查看文件內容。
如果垃圾回收配置打開,通過FS shell移除的文件不會立刻刪除,而是會移動到一個垃圾文件專用的目錄(/user/<username>/.Trash),類似回收站,只要文件還存在於那個目錄下,則隨時可以被回復。絕大多數最近刪除的文件都被移動到了垃圾目錄(/user/<username>/.Trash/Current),並且HDFS每個一段時間在這個目錄下創建一個檢查點用於刪除已經過期的舊的檢查點,詳情見 expunge command of FS shell 。在垃圾目錄中的文件過期後,NameNode會刪除這個文件,文件刪除會引起這個文件的所有塊的空間空閑,需要注意的是在文件被刪除之後和HDFS的可用空間變多之間會有一些時間延遲(個人認為是垃圾回收機制佔用的時間)。下面是一些簡單的理解刪除文件的例子:
當文件復制系數減小時,NameNode會選擇多餘的需要刪除的副本,在收到心跳包時將刪除信息發送給DataNode。和上面一樣,這個刪除操作也是需要一些時間後,才能在集群上展現空閑空間的增加。
HDFS Architecture
⑤ HDFS架構
HDFS中的文件是以數據塊(Block)的形式存儲的,默認最基本的存儲單位是128 MB(Hadoop 1.x為64 MB)的數據塊。也就是說,存儲在HDFS中的文件都會被分割成128 MB一塊的數據塊進行存儲,如果文件本身小於一個數據塊的大小,則按實際大豎歲答小存儲,並不佔用整個數據塊空間。HDFS的數據塊之所以會設置這么大,其目的是減少定址開銷。數據塊數量越多,定址數據塊所耗的時間就越多。當然也不會設置過大,MapRece中的Map任務通常一次只處理一個塊中的數據,如果任務數太少,作業的運行速度就會比較慢。HDFS的每一個數據塊默認都有三個副本,分別存儲在不同的DataNode上,以實現容錯功能。因此,若數據塊的某個副本丟失並不會影響對數據塊的訪問。數據塊大小和副本數量可在配置文件中更改
NameNode是HDFS中存儲元數據(文件名稱、大小和位置等信息)的地方,它將所有文件和文件夾的元數據保存在一個文件系統目錄樹中,任何元數據信息的改變,NameNode都會記錄。HDFS中的每個文件都被拆分為多個數據塊存放,這種文件與數據塊的對應關系也存儲在文件系統目錄樹中,由NameNode維護。NameNode還存儲數據塊到DataNode的映射信息,這種映射信息包括:數據塊存放在哪些DataNode上、每個DataNode上保存了哪些數據塊。NameNode也會周期性地接收來自集群中DataNode的「心跳」和「塊報告」。通過「心跳」與DataNode保持通信,監控DataNode的狀態(活著還是宕機),若長時間接收不到「心跳」信息,NameNode會認為DataNode已經宕機,從而做出相應的調整策略。「塊報告」包含了DataNode上所有數據塊的列表信息。
DataNode是HDFS中真正存儲數據的地方。客戶端可以向DataNode請求寫入或讀取數據塊,DataNode還在來自NameNode的指令下執行塊的創建、刪除和復制,並且周期性地向NameNode匯報數據塊信息。
NodeSecondaryNameNode用於幫助NameNode管理元數據,從而使NameNode能夠快速、高效地工作。它並不是第二個NameNode,僅是NameNode的一個輔助工具。HDFS的元數據信息主要存儲於兩個文件中:fsimage和edits。fsimage是文件系統映射文件,主余慧要存儲文件元數據信息,其中包含文件系統所有目錄、文件信息以及數據塊的索引;edits是HDFS操作日誌文件,HDFS對文件系統的修改日誌會存儲到該文件中。當NameNode啟動時,會從文件fsimage中讀取HDFS的狀態,雀辯也會對文件fsimage和edits進行合並,得到完整的元數據信息,隨後會將新HDFS狀態寫入fsimage。但是在繁忙的集群中,edits文件會隨著時間的推移變得非常大,這就導致NameNode下一次啟動的時間會非常長。為了解決這個問題,則產生了SecondaryNameNode,SecondaryNameNode會定期協助NameNode合並fsimage和edits文件,並使edits文件的大小保持在一定的限制內。SecondaryNameNode通常與NameNode在不同的計算機上運行,因為它的內存需求與NameNode相同,這樣可以減輕NameNode所在計算機的壓力。
⑥ hbase採用了什麼樣的數據結構
HBase採用了類似Google Bigtable的數據模型,即一個稀疏的、分布式的、持久化的多維映射表,每個表都由行鍵、列族、列限定符和時間戳組成。
在底層實現上,HBase使用了基於Hadoop的分布式文件系統HDFS來存儲數據,並且使用了一搏皮搜種稱為LSM-Tree(Log-Structured Merge-Tree)的數據結構來管理數據。LSM-Tree是一種支持高寫入吞吐量的數據結構,它把數據分成多個層,每層採用不同的策略來管理數據,包括內存中的緩存、寫入磁碟的SSTable、和合並SSTable的操作。通過這種方式,HBase能夠支持高並發、高吞吐量的數據寫入,同時保證數據的一致性和可靠性。
另外,HBase還採用了Bloom Filter、MemStore和Compaction等技術來提高數據查詢效率和存儲效率。Bloom Filter是一種快速的數據過濾技術,可以幫助HBase快速地過濾掉無效的查詢請求,提高查詢效率。MemStore是一種緩存機制,可以幫助基歷HBase加速數據寫入,提高數據握中寫入效率。Compaction則是一種數據壓縮和合並技術,可以幫助HBase節省存儲空間,提高存儲效率。
綜上所述,HBase採用了LSM-Tree、Bloom Filter、MemStore和Compaction等多種數據結構和技術,以實現高並發、高吞吐量的分布式存儲和查詢功能。