大數據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 保留訪問和修改時間,所有權和權限。
更多命令可以查看官方文檔
http://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中的序列化機制嗎