本小節(jié)我們來學習Hadoop的HDFS系統(tǒng),我們先來體驗一下HDFS然后再來了解他的原理搁胆。
HDFS初體驗
HDFS(分布式文件管理系統(tǒng))块促,顧名思義登澜,它就是我們用來管理海量文件的一個系統(tǒng)∷矗現(xiàn)在是一個數(shù)據(jù)量爆炸的時代牛隅,普通的操作系統(tǒng)管轄不了這么多文件,那么就需要分配到更多文件系統(tǒng)的磁盤中酌泰,但是這樣又不利于管理和維護倔叼,所以我們迫切的需要一個系統(tǒng)來管理多臺機器上的文件,分布式文件管理系統(tǒng)就應運而生宫莱。
分布式文件系統(tǒng)是一種允許文件通過網(wǎng)絡(luò)在多臺主機上分享的文件系統(tǒng),可以讓可讓多機器上的多用戶分享文件和存儲空間哩罪。
分布式文件系統(tǒng)有很多授霸,HDFS是最常見也是使用人數(shù)最多的系統(tǒng)之一,適用于一次寫入多次查詢的情況际插,不支持并發(fā)寫的情況碘耳,小文件不合適放在HDFS系統(tǒng)中。
剛開始學習框弛,你可以簡單的將HDFS理解為Windows文件系統(tǒng)辛辨。
好了,說了這么多我們開始用一用吧瑟枫。
首先我們啟動HDFS:
start-dfs.sh
接著我們來查看HDFS的根目錄:
hadoop fs -ls /
現(xiàn)在輸入該命令應該是空空如也的斗搞,因為我們HDFS系統(tǒng)中還沒有任何文件和文件夾,好既然沒有那咱們就來創(chuàng)建一個文件夾慷妙。
創(chuàng)建文件夾之后輸入之前的命令就可以看到根目錄下有一個test
文件夾僻焚。
接下來我們在本地創(chuàng)建一個文件編寫一些內(nèi)容,然后上傳到HDFS系統(tǒng)中膝擂。
將hello.txt
上傳到HDFS的 /text
文件夾中虑啤。
接下來我們來查看剛剛上傳的文件隙弛。
使用-cat
命令即可查看HDFS中的文件。
我們也可以通過Hadoop自帶的Web頁面來查看集群中的文件狞山,http://localhost:9870/ 如果要在windows系統(tǒng)中訪問該頁面全闷,localhost修改成虛擬機ip。
下面這個表格是HDFS的一些常用操作萍启,我們不用專門背下來总珠,記住幾個常用的,其他的以后用到了查一查就可以了伊约。
選項名稱 | 使用格式 | 含義 |
---|---|---|
-ls | -ls <路徑> | 查看指定路徑的當前目錄結(jié)構(gòu) |
-lsr | -lsr <路徑> | 遞歸查看指定路徑的目錄結(jié)構(gòu) |
-du | -du <路徑> | 統(tǒng)計目錄下個文件大小 |
-dus | -dus <路徑> | 匯總統(tǒng)計目錄下文件(夾)大小 |
-count | -count [-q] <路徑> | 統(tǒng)計文件(夾)數(shù)量 |
-mv | -mv <源路徑> <目的路徑> | 移動 |
-cp | -cp <源路徑> <目的路徑> | 復制 |
-rm | -rm [-skipTrash] <路徑> | 刪除文件/空白文件夾 |
-rmr | -rmr [-skipTrash] <路徑> | 遞歸刪除 |
-put | -put <多個 linux 上的文件> <hdfs 路徑> | 上傳文件 |
-copyFromLocal | -copyFromLocal <多個 linux 上的文件><hdfs 路徑> | 從本地復制 |
-moveFromLocal | -moveFromLocal <多個 linux 上的文件><hdfs 路徑> | 從本地移動 |
-getmerge | -getmerge <源路徑> <linux 路徑> | 合并到本地 |
-cat | -cat <hdfs 路徑> | 查看文件內(nèi)容 |
-text | -text <hdfs 路徑> | 查看文件內(nèi)容 |
-copyToLocal | -copyToLocal [-ignoreCrc] [-crc] [hdfs 源路徑] [linux 目的路徑] | 從本地復制 |
-moveToLocal | -moveToLocal [-crc] <hdfs 源路徑> <linux目的路徑> | 從本地移動 |
-mkdir | -mkdir <hdfs 路徑> | 創(chuàng)建空白文件夾 |
-setrep | -setrep [-R] [-w] <副本數(shù)> <路徑> | 修改副本數(shù)量 |
-touchz | -touchz <文件路徑> | 創(chuàng)建空白文件 |
HDFS體系結(jié)構(gòu)與基本概念
初步體驗了HDFS系統(tǒng)之后姚淆,接下來就要學習原理了,一般原理都是比較枯燥的屡律,但卻非常重要腌逢,是本小節(jié)的重點。
HDFS文件系統(tǒng)結(jié)構(gòu)
HDFS以流式數(shù)據(jù)訪問模式來存儲超大文件超埋,運用于商用硬件集群上搏讶。(超大文件一般指幾百G甚至幾百TB或PB級大小的文件)。
HDFS的文件系統(tǒng)是一個主從結(jié)構(gòu)霍殴,即master/slave
結(jié)構(gòu)媒惕,只有一個主節(jié)點namenode
,有多個子節(jié)點datanode
来庭,namenode
負責管理文件系統(tǒng)和命名空間妒蔚,并且負責客戶端(client)對文件系統(tǒng)的訪問,datanode
負責存儲數(shù)據(jù)月弛。
HDFS中的文件是以數(shù)據(jù)塊(blok)的形式存儲在datanode
中的肴盏。每一個數(shù)據(jù)塊是64M或者128M、256M帽衙,文件拆分成若干個block
菜皂,這些block存放在DataNode節(jié)點上。NameNode
操作名字空間比如:打開厉萝,關(guān)閉恍飘,重命名文件目錄。DataNode
負責為文件系統(tǒng)的客戶提供讀/寫操作服務谴垫。DataNode
同時還為NameNode
提供block創(chuàng)建章母,刪除,備份機制翩剪,NameNode
只負責元數(shù)據(jù)信息胳施,沒有數(shù)據(jù)流。NameNode
維護名字空間肢专,任何對文件系統(tǒng)名字空間的改動都記錄在NameNode
舞肆。系統(tǒng)的文件組織結(jié)構(gòu)和linux非常類似焦辅。你可以創(chuàng)建,刪除椿胯,移動筷登,重命名文件或者目錄。
namenode 和datanode
HDFS集群有兩類節(jié)點哩盲,并以管理者-工作者模式運行前方,即一個namenode(管理者)和多個datanode(工作者)。namenode管理文件系統(tǒng)的命名空間廉油,它維護著文件系統(tǒng)樹及整棵樹內(nèi)所有的文件和目錄惠险。這些信息以兩個文件形式永久保存在本地磁盤上:命名空間鏡像文件和編輯日志文件。namenode也記錄著每個文件中各個塊(block)所在的數(shù)據(jù)節(jié)點信息抒线,但它并不永久保存塊的位置信息班巩,因為這些信息會在系統(tǒng)啟動時有數(shù)據(jù)節(jié)點重建。
客戶端(client)代表用戶通過與namenode和datanode交互來訪問整個文件系統(tǒng)嘶炭,客戶端提供一個類似于POSIX(可移植操作系統(tǒng)界面)的文件系統(tǒng)接口抱慌,因此用戶在編程時無需知道namenode和datanode也可以實現(xiàn)功能。
datanode是文件系統(tǒng)的工作節(jié)點眨猎,他們根據(jù)需要存儲并檢索數(shù)據(jù)塊(受客戶端或namenode調(diào)度)抑进,并且定期向namenode發(fā)送他們所存儲的塊的列表。
所以沒有namenode睡陪,文件系統(tǒng)就會無法使用寺渗,如果運行namenode服務的機器毀壞,文件系統(tǒng)上所有的文件將會丟失兰迫,因為我們不知道如何根據(jù)datanode的塊來重建文件户秤,因此,對namenode實現(xiàn)容錯非常重要逮矛,Hadoop為此提供了各種機制。
第一種機制是備份那些組成文件系統(tǒng)元數(shù)據(jù)持久狀態(tài)的文件转砖。Hadoop可以通過配置使namenode在多個文件系統(tǒng)上保存元數(shù)據(jù)的持久狀態(tài)须鼎,這些寫操作是實時同步的,是原子操作府蔗,一般的配置使晋控,將持久狀態(tài)寫入本地磁盤的同時,寫入一個遠程掛在的網(wǎng)絡(luò)文件系統(tǒng)(NFS)姓赤。
另一個方法是運行一個輔助namenode赡译,但它不能被用作namenode,這個復制namenode的重要作用是定期通過編輯日志合并命名空間鏡像不铆,以防止編輯日志過大蝌焚,這個輔助namenode一般在另一臺單獨的物理計算機上運行裹唆,因為他需要占用大量CPU時間與namenode相同容量的內(nèi)存來執(zhí)行合并操作,他會保存合并后的命名空間鏡像的副本只洒,并在namenode發(fā)生故障時啟用许帐,但是,輔助namenode保存的狀態(tài)總是滯后于主節(jié)點毕谴,所以在主節(jié)點全部失效時成畦,難免會丟失部分數(shù)據(jù)。在這種情況下涝开,一般把存儲在NFS上的namenode元數(shù)據(jù)復制到輔助namenode并作為新的主namenode運行循帐。