大資料HDFS憑啥能存下百億資料?
theme: cyanosis
歡迎關注大資料系列課程
前言
大家平時經常用的百度網盤存放電影、照片、文件等,那有想過百度網盤是如何存下那麼多檔案的呢?難到是用一臺計算機器存的嗎?那得多大磁碟啊?顯然不是的,那本文就帶大家揭祕。
分散式儲存思想
既然一臺機器的儲存所需的磁碟有上限瓶頸,那麼我們能否利用多臺機器形成一個整體用來儲存呢?這就是我們所說的分散式儲存。
- 單機縱向擴充套件:磁碟不夠加磁碟,有上限瓶頸限制
- 多機橫向擴充套件:機器不夠加機器,理論上無限擴充套件
Hadoop就是採用了這樣的一個思想,設計出了分散式儲存系統HDFS。
HDFS介紹和使用
HDFS(Hadoop Distributed File System
),意為:Hadoop
分散式檔案系統。它是Apache Hadoop
核心元件之一,作為大資料生態圈最底層的分散式儲存服務而存在。也可以說大資料首先要解決的問題就是海量資料的儲存問題。
- HDFS主要是解決大資料如何儲存問題的。分散式意味著是HDFS是橫跨在多臺計算機上的儲存系統。
- HDFS是一種能夠在普通硬體上執行的分散式檔案系統,它是高度容錯的,適應於具有大資料集的應用程式,它非常適於儲存大型資料 (比如 TB 和 PB)。
- HDFS使用多臺計算機儲存檔案, 並且提供統一的訪問介面, 像是訪問一個普通檔案系統一樣使用分散式檔案系統。
HDFS使用
HDFS安裝好了,具體是如何使用呢,如何上傳和下載檔案呢?一共有兩種方式,通過shell命令和web頁面。
- shell命令操作HDFS
類似linux命令,可以直接通過在命令列介面操作。Hadoop提供了檔案系統的shell命令列客戶端: hadoop fs [generic options]
- 建立資料夾
hadoop fs -mkdir [-p] <path> ...
path
為待建立的目錄
-p
選項的行為與Unix mkdir -p
非常相似,它會沿著路徑建立父目錄。
- 檢視指定目錄下內容
hadoop fs -ls [-h] [-R] [<path> ...]
path 指定目錄路徑
-h 人性化顯示檔案size
-R 遞迴檢視指定目錄及其子目錄
- 上傳檔案到HDFS指定目錄下
hadoop fs -put [-f] [-p] <localsrc> ... <dst>
-f 覆蓋目標檔案(已存在下)
-p 保留訪問和修改時間,所有權和許可權。
localsrc 本地檔案系統(客戶端所在機器)
dst 目標檔案系統(HDFS)
hadoop fs -put zookeeper.out /alvin
hadoop fs -put file:///etc/profile hdfs://node1:8020/alvin
- 檢視HDFS檔案內容
hadoop fs -cat <src> ...
讀取指定檔案全部內容,顯示在標準輸出控制檯。
注意:對於大檔案內容讀取,慎重。
- 下載HDFS檔案
hadoop fs -get [-f] [-p] <src> ... <localdst>
下載檔案到本地檔案系統指定目錄,localdst必須是目錄
-f 覆蓋目標檔案(已存在下)
-p 保留訪問和修改時間,所有權和許可權。
更多命令可以檢視官方文件
https://hadoop.apache.org/docs/r3.3.0/hadoop-project-dist/hadoop-common/FileSystemShell.html
2.web介面操作HDFS
另外一種更簡單直觀的方式是通過web介面操作HDFS,預設是50070埠,如下圖所示:
HDFS的架構
HFDS採用分散式的架構,可能有成百上千的伺服器組成,每一個元件都有可能出現故障。因此故障檢測和自動快速恢復是HDFS的核心架構目標,下面是HDFS的官方架構圖:
主從架構
HDFS叢集是標準的master/slave
主從架構叢集,一般一個HDFS叢集是有一個Namenode
和一定數目的DataNode
組成。
主角色:NameNode
- NameNode是Hadoop分散式檔案系統的核心,架構中的主角色。
- NameNode維護和管理檔案系統元資料,包括名稱空間目錄樹結構、檔案和塊的位置資訊、訪問許可權等資訊。
- 基於此,NameNode成為了訪問HDFS的唯一入口。
從角色:DataNode
- DataNode是Hadoop HDFS中的從角色,負責具體的資料塊儲存。
- DataNode的數量決定了HDFS叢集的整體資料儲存能力,通過和NameNode配合維護著資料塊。
主角色輔助角色: SecondaryNameNode
此外,HDFS中還有一個SecondaryNameNode,雖然途中沒有畫出,那它有什麼用呢?
- Secondary NameNode充當NameNode的輔助節點,但不能替代NameNode。
- 主要是幫助主角色進行元資料檔案的合併動作。可以通俗的理解為主角色的“祕書”。
分塊儲存
由於有的檔案很大,一臺機器也存不下,於是HDFS會對我們的檔案做一個物理上的切割,也就是分塊儲存。
HDFS中的檔案在物理上是分塊儲存(block
)的,預設大小是128M(134217728)
,不足128M
則本身就是一塊。
副本機制
既然分散式儲存海量資料,那麼肯定需要成千上百的機器,這樣很有可能其中一臺機器宕機,出故障了怎麼辦呢?
當然HDFS也想到了解決方案,檔案的所有block都會有副本。副本系數可以在檔案建立的時候指定,也可以在之後通過命令改變。副本數由引數dfs.replication
控制,預設值是3,也就是會額外再複製2份,連同本身總共3份副本,而且這個副本儘量會分散在不同的機架上,規避風險。
NameNode高可用
既然DataNode有副本,出現數據丟失可能性很小,那NameNode掛了不是照樣涼涼?
不用擔心,那我在啟動一個NameNode備在那裡不就行了嗎。
存在兩個 NameNode,一個是活動的 NameNode,稱為 Active,另外一個是備用的 NameNode,稱為 Standby。Active節點的資料通過JournalNode節點同步給Standby節點。 當 Active 節點出現問題時,需要將 Standby 節點切換為 Active 節點來為客戶端提供服務,這樣就保證了高可用。
元資料管理
前面提到NameNode中包含元資料,那麼究竟具體是哪些內容呢?
在HDFS中,Namenode管理的元資料具有兩種型別:
- 檔案自身屬性資訊
檔名稱、許可權,修改時間,檔案大小,複製因子,資料塊大小。
- 檔案塊位置對映資訊
記錄檔案塊和DataNode之間的對映資訊,即哪個塊位於哪個節點上。
總結
現在你終於知道為什麼百度網盤可以存下海量的資料了吧,主要採用的是分散式的儲存,將資料分塊多副本的方式儲存到多個數據節點DataNode, 然後由唯一的NameNode
節點去管理這個檔案的資訊,比如說它是在那些DataNode
節點上,大小是多少等等,注意這裡是DataNode
主動告訴NameNode
它這裡有哪些檔案塊。
如果本文對你有幫助的話,請留下一個贊吧
歡迎關注個人公眾號——JAVA旭陽
本文正在參加「金石計劃 . 瓜分6萬現金大獎」
- Java7到Java17, Switch語句進化史
- 樂觀鎖思想在JAVA中的實現——CAS
- 一步步帶你設計MySQL索引資料結構
- 我總結了寫出高質量程式碼的12條建議
- 工作這麼多年,我總結的資料傳輸物件 (DTO) 的最佳實踐
- Spring專案中用了這種解耦模式,經理對我刮目相看
- 大資料HDFS憑啥能存下百億資料?
- 5個介面效能提升的通用技巧
- 你的哪些SQL慢?看看MySQL慢查詢日誌吧
- 90%的Java開發人員都會犯的5個錯誤
- 喪心病狂,竟有Thread.sleep(0)這種寫法?
- 為什麼更推薦使用組合而非繼承關係?
- 一個30歲程式設計師的覺醒和進擊
- 推薦8個提高工作效率的IntelliJ外掛
- 公司的這種打包啟動方式,我簡直驚呆了
- 告別醜陋判空,一個Optional類搞定
- 你不知道的Map家族中的那些冷門容器
- SpringBoot 2.x整合Log4j2日誌
- SpringBoot應用自定義logback日誌
- 你確定懂了Java中的序列化機制嗎