技術分享丨HDFS 入門
在介紹HDFS之前要說的
相關背景資料
Hadoop:一個分散式系統基礎架構,由Apache基金會開發。用戶可以在不了解分散式底層細節的情況下,開發分散式程序。充分利用集群的威力高速運算和存儲。
Distributed:分散式計算是利用互聯網上的計算機的 CPU 的共同處理能力來解決大型計算問題的一種計算科學。
File system:文件系統是操作系統用於明確磁碟或分區上的文件的方法和數據結構;即在磁碟上組織文件的方法。也指用於存儲文件的磁碟或分區,或文件系統種類。
Hadoop 和 HDFS 的關係
Hadoop實現了一個分散式文件系統(Hadoop Distributed File System),簡稱HDFS。
對外部客戶機而言,HDFS 就像一個傳統的分級文件系統。可以創建、刪除、移動或重命名文件,等等。很多時候,我們就叫它DFS(DistributedFile System)。
Hadoop 是一個以一種可靠、高效、可伸縮的方式進行處理的,能夠對大量數據進行分散式處理的系統框架。
HDFS是Hadoop兼容最好的標準級文件系統,因為Hadoop是一個綜合性的文件系統抽象,所以HDFS不是Hadoop必需的。所以可以理解為Hadoop是一個框架,HDFS是Hadoop中的一個部件。
我們為什麼需要HDFS
要說明需要HDFS,首先得說明一下,為什麼在計算機系統中需要文件系統。操作系統中負責管理和存儲文件信息的軟體機構稱為文件管理系統,簡稱文件系統。簡單的理解為,只要有文件管理,就得有文件系統。
文件系統由三部分組成:與文件管理有關軟體、被管理文件以及實施文件管理所需數據結構。
從系統角度來看,文件系統是對文件存儲器空間進行組織和分配,負責文件存儲並對存入的文件進行保護和檢索的系統。
文件系統是用於存儲文件的,但是我們發現現有的文件系統忙於處理什麼文件呢?
當數據集的大小超過一台獨立物理計算機的存儲能力時,就有必要對它進行分區並存儲到若干台單獨的計算機上。
從概念圖上看,分布化的文件系統會因為分布後的結構不完整,導致系統複雜度加大,並且引入的網路編程,同樣導致分散式文件系統更加複雜。對於以上的問題我們來HDFS是如何迎刃而解的:
HDFS以流處理訪問模式來存儲文件的。
一次寫入,多次讀取。數據源通常由源生成或從數據源直接複製而來,接著長時間在此數據集上進行各類分析,大數據不需要搬來搬去。
DFS是用流處理方式處理文件,每個文件在系統里都能找到它的本地化映像,所以對於用戶來說,別管文件是什麼格式的,也不用在意被分到哪裡,只管從DFS里取出就可以了。一般來說,文件處理過程中無法保證文件安全順利到達,傳統文件系統是使用本地校驗方式保證數據完整,文件被散後,難道需要特意安排每個分片文件的校驗碼?
HDFS的回答是:NO!
分片數量和大小是不確定的,海量的數據本來就需要海量的校驗過程,分片後加入每個分片的跟蹤校驗完全是在數滿天恆星的同時數了他們的行星。
HDFS的解決方案是分片冗餘,本地校驗。
直觀上看,我們是給文件系統添堵,文件越來越多,實際上,DFS更加喜歡這樣的架構。數據冗餘式存儲,直接將多份的分片文件交給分片後的存儲伺服器去校驗。冗餘後的分片文件還有個額外功能,只要冗餘的分片文件中有一份是完整的,經過多次協同調整後,其他分片文件也將完整。經過協調校驗,無論是傳輸錯誤,I/O錯誤,還是個別伺服器宕機,整個系統里的文件是完整的。
分布後的文件系統有個無法迴避的問題,因為文件不在一個磁碟導致讀取訪問操作的延時,這個是HDFS現在遇到的主要問題。
現階段,HDFS的配置是按照高數據吞吐量優化的,可能會以高時間延時為代價。但萬幸的是,HDFS是具有很高彈性,可以針對具體應用再優化。
HDFS 的概念
通過上一節的得到的信息,我們了解了HDFS就是下面這個抽象圖的具體實現:
解釋一下,何為元數據:
元數據是用於描述要素、數據集或數據集系列的內容、覆蓋範圍、質量、管理方式、數據的所有者、數據的提供方式等有關的信息。更簡單的說,是關於數據的數據。
HDFS就是將巨大的數據變成大量數據的數據。
磁碟存儲文件時,是按照數據塊來存儲的,也就是說,數據塊是磁碟的讀/寫最小單位。數據塊也稱磁碟塊。
構建於單個磁碟上的文件系統是通過磁碟塊來管理文件系統,一般來說,文件系統塊的大小是磁碟塊的整數倍。特別的,單個磁碟文件系統,小於磁碟塊的文件會佔用整個磁碟塊。磁碟塊的大小一般是512位元組。
在HDFS中,也有塊(block)這個概念,默認為64MB,每個塊作為獨立的存儲單元。
與其他文件系統不一樣,HDFS中每個小於塊大小的文件不會佔據整個塊的空間。具體原因在後面的介紹。下面介紹為什麼是64MB一個文件塊:
為什麼HDFS中的小文件不會佔用整個塊,而且需要64MB或者更大的一個塊?
在文件系統中,系統存儲文件時,需要定位該數據在磁碟中的位置,再進行傳輸處理。
定位在磁碟的位置是需要時間的,同樣文件傳輸也是需要時間。
T(存儲時間)=T(定位時間)+T(傳輸時間)
如果每個要傳輸的塊設置得足夠大,那麼從磁碟傳輸數據的時間可以明顯大於定位這個塊開始位置的時間。
當然不是設置每個塊越大越好。
HDFS提供給MapReduce數據服務,而一般來說MapReduce的Map任務通常一次處理一個塊中的數據,如果任務數太少(少於集群中節點的數量),就沒有發揮多節點的優勢,甚至作業的運行速度就會和單節點一樣。
分散式的文件抽象能夠帶來的優勢是:
1、一個文件可以大於每個磁碟
2、文件不用全在一個磁碟上。
3、簡化了存儲子系統的設計。
其實,HDFS對與用戶來說,可以直接看成是一個巨大的硬碟
所以,HDFS和文件系統相似,用fsck指令可以顯示塊信息:% hadoop fsck / -files -blocks
HDFS 的關鍵運行機制
HDFS是基於主從結構(master/slaver)構件:
在HDFS的主從結構中,有兩類節點 namenode和datanode。他們以管理者-工作者模式工作。子節點才是HDFS真正的存儲和檢索地點,如果想在主節點做整個集群數據的索引並檢索的話,請考慮可行性,畢竟HDFS不擅長做巨型索引。
客戶端(client)代表用戶通過與namenode和datanode交互訪問整個文件系統。可以是具體程序,也可以是應用。
所以,用戶在編程時,無需知道namenode和datanode也可以實現功能。
沒有datanode,文件系統不會崩潰,文件系統只是無法存儲文件,也不會丟失數據。沒有namenode,文件系統會崩潰,文件系統上的所有文件將丟失(無法讀出,因為無法定位元數據塊的位置,也就無法根據datanode的塊來重構文件)。
如何使用HDFS
HDFS是在安裝並成功配置後即可使用。具體安裝過程不再贅述。
無論是使用shell腳本,或者使用WEB UI進行操作,使用前必須得明白HDFS的配置。便於存儲操作或者操作優化。
例如我們使用偽分散式配置(也就是1個namenode和1個datanode配置方式)。說明hdfs的URI是localhost,hdfs的守護進程將通過該屬性確定namenode的主機和埠。分散式文件系統將文件存儲為1份備份。
常用HDFS命令
分享和交流
想要參加「技術沙龍-周五課堂」的小夥伴請加群:
Reboot 周五分享群 368573673
周五分享預告:
05月27日 晚上21:00
主題:淺析ceph
主講人:前360分散式攻城獅
內容:
解開Ceph神秘的面紗
Ceph工作原理及流程Ceph 日常維護及常用操作
運維開發交流QQ群: 238757010
歡迎大家關注公共號,高品質運維開發
關於Reboot:
專註於互聯網運維開發分享、交流,讓更多的運維工程師更加專註於自動化,為國內公有雲開發、監控、運維貢獻自己的力量。這裡聚集著國內一線互聯網工程師,樂於分享與交流 。發現文章不錯的話請關注我們。
推薦閱讀:
※大數據那些事(12):Michael,Daniel和輪子
※Spark 2017 歐洲技術峰會摘要(人工智慧)
※穩定和性能如何兼顧?58大數據平台的技術演進與實踐
※大數據那些事(26):你還愛我嗎之Stinger的努力