HDFS介紹及簡單操做

目錄html

1.HDFS是什麼?node

2.HDFS設計基礎與目標linux

3.HDFS體系結構算法

3.1 NameNode(NN)
3.2 DataNode(DN)
3.3 SecondaryNameNode(SNN)
3.4 塊(Block)的概念
3.5 文件安全shell

3.讀取數據流程數據庫

4.HDFS的可靠性express

4.1 冗餘副本策略
4.2 機架策略
4.3 心跳策略
4.4 安全模式
4.5 校驗和
4.6 回收站
4.7 元數據保護
4.8 快照機制apache

5.HDFS基礎架構以及工做原理segmentfault

6.HDFS讀操做緩存

7.HDFS寫操做

8.HDFS現實舉例

9.HDFS簡單操做

10.HDFS管理與更新

11.HDFS 優勢 VS 缺點

12.Block的副本放置策略

13.HDFS文件權限


 

Hadoop其實並非一個產品,而是一些獨立模塊的組合。主要由分佈式文件系統HDFS和大型分佈式數據處理算法MapReduce組成。那麼咱們今天就來看看HDFS到底是什麼鬼?

 

1.HDFS是什麼?

HDFS即Hadoop Distributed File System。首先它是一個開源系統,同時它是一個可以面向大規模數據使用的,可進行擴展的文件存儲與傳遞系統。是一種容許文件經過網絡在多臺主機上分享的文件系統,可以讓多機器上的多用戶分享文件和存儲空間。讓其實是經過網絡來訪問文件的動做,由程序與用戶看來,就像是訪問本地的磁盤通常。即便系統中有某些節點脫機,總體來講系統仍然能夠持續運做而不會有數據損失。
它分爲2個部分:NameNode和DataNode。NameNode至關於一個領導,它管理集羣內的DataNode,當客戶發送請求過來後,NameNode會根據狀況制定存儲到哪些DataNode上,而其自己本身並不存儲真實的數據。那NameNode怎麼知道集羣內DataNode的信息呢?DataNode發送心跳信息給NameNode(一會詳見原理圖)。
Hadoop分佈式文件系統是根據Google發表的GFS(Google File System)論文產生過來的。

 

2.HDFS設計基礎與目標

HDFS是基於流數據模式訪問和處理超大文件的需求而開發的,能夠運行於廉價的商業服務器上。

(1) 硬件錯誤是常態。所以須要冗餘。
在Google不多會使用超級計算機,也不多會使用一些廠商很昂貴的設備,他們通常會使用的就是普通的PC集羣。PC集羣即便是PC server,它的底子基本上也是家用機的模式,因此這種機器的耐用性確定沒有小型機或者專用的服務器高。若是一個集羣裏機器不少,好比幾百臺,那麼每一個星期壞幾臺是很常見的。這個「壞掉」不必定是完全壞掉,多是宕機等,好比內存不穩定或者CPU過熱,致使某些節點死掉;或者過了一段時間以後,硬盤的壽命到期,硬盤的介質發生了損壞,由於普通PC不少都是採用很便宜的SATA硬盤,它設計的也不必定就是7*24工做的,或者在7*24模式底下工做它的壽命就會大大縮短。不管什麼緣由,總之在hadoop集羣裏面,咱們面對的就是常常性地發生錯誤這種狀況。天天可能就是要面對各類各樣的錯誤,有些時候多是節點機器自己失效,好比死機、斷網等,有些時候多是硬盤介質問題,好比某個文件損壞、某個硬盤徹底壞掉等。因爲錯誤是常常性發生,因此備份都不足夠防止這種錯誤。所以須要冗餘,就是在運行的過程當中直接對數據進行備份,好比說數據原本只須要寫一份,如今可能須要一次寫好幾份,萬一某個節點失效,咱們還能夠從其餘節點把這個數據拿出來。所以冗餘是HDFS自己直接嵌入的一個功能,它並非一個額外的功能,它是在設計的時候就必須考慮的一點。冗餘思想是深刻到HDFS的骨髓裏面的。

(2) 流式數據訪問。即數據批量讀取而非隨機讀寫,hadoop擅長作的是數據分析而不是事物處理。
HDFS是爲大數據而生。通常來講不多會讓Hadoop集羣去作OLTP(聯機事務處理)。所謂OLTP就是偶爾地、隨機性地去讀寫一些數據,主要就是隨機讀,隨機寫,可能還會有一些修改的工做。Hadoop不多會處理這種事情,它處理的是大數據的流式讀寫,好比說我整堆整堆的去讀,而後去加以處理。

(3) 大規模數據集。

(4) 簡單一致性模型,爲了下降系統複雜度,對文件採用一次性寫屢次讀的邏輯設計,便是文件一經寫人,關閉,就不能修改。
因爲面臨的是批量性地操做,因此hadoop在設計時就會採起一些簡單的一致性模型,針對這種大批量讀卻不多去寫的模型。爲了下降系統的複雜度,Hadoop文件一般是一次性寫進去,好比說拷貝文件一次性拷好,這個文件拷好以後通常你不會去改,除非你把它刪除掉。就是說這個文件寫進去以後你會屢次去讀它,可是不能改變它的內容。若是你必定要改變它,那就把原來的文件刪除,而後再把改後的文件從新寫進去。

(5) 程序採用「數據就近」原則分配節點執行。

HDFS在設計時也要考慮到MapReduce體系跟它的融合,就是咱們的數據到底怎麼放,才能使做業以最快的速度來運行。
在讀取數據時,爲了減小總體帶寬消耗和下降總體的帶寬延時,HDFS會盡可能讓讀取程序讀取離客戶端最近的副本。

 

3.HDFS體系結構

HDFS體系結構中主要有2類節點,一類是NameNode,一類是DataNode。這兩類節點分別承擔Master和Worker的任務。NameNode就是Master管理集羣中的執行調度,DataNode就是Worker具體任務的執行節點。NameNode管理文件系統的命名空間,維護整個文件系統的文件目錄樹以及這些文件的索引目錄。這些信息以兩種形式存儲在本地文件系統中,一種是命名空間鏡像(Namespace image),一種是編輯日誌(Edit log)。從NameNode中你能夠得到每一個文件的每一個塊所在的DataNode。須要注意的是,這些信息不是永久保存的,NameNode會在每次系統啓動時動態地重建這些信息。當運行任務時,客戶端經過NameNode獲取元數據信息,和DataNode進行交互以訪問整個文件系統。
固然,HDFS體系結構中還有一類節點,那就是Secondary NameNode。這個節點的主要做用就是週期性地合併日誌中的命名空間鏡像,以免編輯日誌過大。

HDFS採用Master/Slave架構對文件系統進行管理。一個HDFS集羣是由一個NameNode和必定數目的DataNode組成的。NameNode是一箇中心服務器,負責管理文件系統的命名空間(Namespace)以及客戶端對文件的訪問,集羣的DataNode通常是由一個節點運行一個DataNode進程,負責管理它所在節點上的存儲。
從內部看,一個文件其實被分紅了一個或多個數據塊,這些塊存儲在一組DataNode上。NameNode執行文件系統的名字空間操做,好比打開、關閉、重命名文件或目錄。它負責肯定數據塊到具體DataNode節點的映射。DataNode負責處理文件系統客戶端的讀/寫請求。在NameNode的統一調度下進行數據塊的建立、刪除和複製(注意這裏沒有修改)。

中心目錄服務器(NameNode)管理大量數據服務器(DataNode):
NameNode管理元數據(文件目錄樹,文件——>塊映射,塊——>數據服務器映射表,etc)
DataNode負責存儲數據、以及響應數據讀寫請求
客戶端與NameNode交互進行文件建立/刪除/尋址等操做,以後直接與DataNode交互進行文件I/O

下面咱們來逐一觀察一下架構裏面的一些元素。

 

3.1 NameNode(NN)

(1) 管理文件系統的命名空間。
就是說它是文件系統總控的節點。

(2) 記錄每一個文件的數據塊在各個DataNode上的位置和副本信息。
就好比說如今我有一個表格,這個表格的每個項目均記錄了一個文件的狀況,好比說文件名、權限、元數據信息(創建修改時間、長度等)。除此以外,它還記錄這些文件究竟在集羣的哪些節點上,好比說存在節點1的某個數據塊上面。

(3) 協調客戶端對文件的訪問。
當有節點須要訪問某個文件時,首先訪問NameNode來獲取文件位置信息,而後跟相應的DataNode通信,讀取數據塊。因此NameNode在這裏起到了一個相似書裏面目錄的做用。

(4) 記錄命名空間內的改動或空間自己屬性的改動。
好比說它的權限發生了一些什麼樣的變化之類的

(5) 使用事物日誌記錄HDFS元數據的變化,使用映像文件存儲文件系統的命名空間,包括文件映射,文件屬性等。
NameNode使用兩個東西來記錄元數據。分別是事物日誌和映像文件。具體來講你們能夠打開NameNode節點上面你所定義的保存元數據的目錄,在HDFS配置文件裏面有一項參數是指出元數據在什麼地方,那是一個目錄,打開目錄以後能夠看到有一些文件,其中fsimage就是映像文件。

[root@hadoop ~]# cat /usr/local/hadoop/etc/hadoop/core-site.xml 
...
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/var/hadoop/tmp</value>   
    </property>    
...
[root@hadoop ~]# cd /var/hadoop/tmp/dfs/name/current/
[root@hadoop current]# ll
total 1052
-rw-r--r-- 1 root root      42 Jul 18 04:03 edits_0000000000000000001-0000000000000000002
-rw-r--r-- 1 root root 1048576 Jul 18 04:03 edits_inprogress_0000000000000000003
-rw-r--r-- 1 root root     389 Jul 18 04:02 fsimage_0000000000000000000
-rw-r--r-- 1 root root      62 Jul 18 04:02 fsimage_0000000000000000000.md5
-rw-r--r-- 1 root root     389 Jul 18 04:03 fsimage_0000000000000000002
-rw-r--r-- 1 root root      62 Jul 18 04:03 fsimage_0000000000000000002.md5
-rw-r--r-- 1 root root       2 Jul 18 04:03 seen_txid
-rw-r--r-- 1 root root     219 Jul 18 04:02 VERSION
View Code

補充:

NameNode(NN)主要功能:接受客戶端的讀寫服務(不理解?)
NameNode保存metadata信息包括:a.文件ownership和permissions;b.文件包含哪些塊;c.Block保存在哪一個DataNode(由DataNode啓動時上報)。
NameNode的Metadata信息在啓動後都會加載到內存中,同時metadata信息(包括上述a和b)也會存儲到磁盤文件名爲「fsimage」,可是上述 c.Block的位置信息 不會保存到fsimage,只會存在於內存中;edits記錄對metadata操做日誌。

 

3.2 DataNode(DN)

(1) 負責所在物理節點的存儲管理

(2) 一次寫入,屢次讀取(不修改)
因爲這個特性,那麼咱們就不須要考慮一致性問題。所謂一致性就是說假若有不少人同時修改一個文件,那麼最終應該採納哪一個修改的版本呢?這是在數據庫環境裏常常要考慮的問題。在Oracle中採用回滾,在塊結構裏也加了一些機制來保證讀取一致性,可是Oracle裏面作的巨複雜。而在hadoop中很是簡單,由於文件一經寫入就不能改,因此根本就不可能發生不少人一塊兒修改的狀況。所以它徹底不須要考慮一致性

(3) 文件由數據塊組成,典型的塊大小是128MB(v1版本是64MB,v2版本是128MB)
hadoop中每一個數據塊是一個blk文件,通常來講缺省的數據塊能夠達到128MB,你們能夠嘗試往Hadoop裏面不斷寫文件,可觀察到數據塊在不斷增加,通常來講增加到128MB就再也不增加,而後數據塊文件就不斷增多。

(4) 數據塊儘可能散佈到各個節點
實現冗餘的效果

補充:

DataNode存儲數據(Block);
啓動DN線程的時候會向NN彙報block信息;
經過向NN發送心跳保持與其聯繫(3秒一次),若是NN 10分鐘沒有收到DN的心跳,則認爲其已經lost,並copy其上的block到其餘DN。

 

3.3 SecondaryNameNode(SNN)

1)它不是NN的備份(但能夠作備份),它的主要工做是幫助NN合併edits log,減小NN啓動時間。
2)SNN執行合併時機:
根據配置文件設置的時間間隔fs.checkpoint.period,默認3600秒。
根據配置文件設置edits log大小fs.checkpoint.size規定edits文件的最大值默認爲64MB。

SNN合併流程

 

3.4 塊(Block)的概念

操做系統中的文件塊。文件是以塊的形式存儲在磁盤中,此處塊的大小表明系統讀、寫、可操做的最小文件大小。也就是說,文件系統每次只能操做磁盤塊大小的整數倍數據。一般來講,一個文件系統塊大小爲幾千字節,而磁盤塊大小爲512字節。
HDFS中的塊是一個抽象的概念,比操做系統中的塊要大得多。在配置hadoop系統時會看到,它的默認大小是64MB(最新版本默認大小已經變成了128MB)。HDFS使用抽象的塊的好處:1)能夠存儲任意大的文件而又不會受到網絡中任一單個節點磁盤大小的限制。2)使用抽象塊做爲操做的單元能夠簡化存儲子系統。

HDFS數據存儲單元(block)

1)文件被切分紅固定大小的數據塊:默認數據塊大小爲64MB,可配置;若文件大小不到64MB,則單獨存成一個block。
2)一個文件存儲方式:按大小被切分紅若干個block,存儲到不一樣節點上,默認狀況下每一個block都有3個副本(可配置);Block大小和副本數經過client端上傳文件時設置,文件上傳成功後副本數能夠變動,Block大小不可變動。

 

3.5 文件安全

hadoop採用了兩種方法來確保文件安全。
第一種方法:將NameNode中的元數據轉儲到遠程的NFS文件系統上。
第二種方法:系統中同步運行一個Secondary NameNode,這個節點的主要做用就是週期性地合併日誌中的命名空間鏡像,以免編輯日誌過大。

 

4.HDFS的可靠性

4.1 冗餘副本策略

(1) 能夠在hdfs-site.xml中設置複製因子指定副本數量。

[root@hadoop ~]# cat /usr/local/hadoop/etc/hadoop/hdfs-site.xml 
...
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
...
View Code

複製因子:好比說replication=1表明沒有冗餘,2及以上表明有冗餘。通常來講,數越大表明越安全,即數據塊重複的越多越安全。可是把數定大了也有壞處,那
就是空間利用率降低,好比說冗餘數量增大一倍,此時空間利用率就會降低50%。還有一個壞處就是影響速度,由於數據要寫入副本,確定會在性能上產生一些影響。因此說複製因子應該取什麼數值呢?說實話這個通常沒有什麼原則,你們能夠根據實際集羣的狀況、性能、空間利用率等綜合的一個平衡,來選取一個折中的數值。

(2) 全部數據塊都有副本。

(3) DataNode啓動時,遍歷本地文件系統,產生一份hdfs數據塊和本地文件的對應關係列表(blockreport)彙報給NameNode。
通常來講數據節點啓動時,都會把本地的系統文件遍歷一次,產生一個數據塊和本地文件對應的清單(叫作blockreport)彙報給NameNode,NameNode根據blockreport來和它的元數據進行對照,看一看數據節點的實際狀況跟元數據裏面所記錄的狀況是否相符,再決定是否採起某些安全上的措施。

 

4.2 機架策略

集羣通常放在不一樣機架上,機架間帶寬要比機架內寬帶要小。
集羣通常是放在若干個機櫃裏面,集羣可能利用機櫃裏面的交換機共同連到一個大的交換機裏面,通常來講有這麼一個規律,就是同一個機櫃裏面的機器因爲連的是同一個機櫃裏的交換機,一般交換數據比較快。不一樣機櫃之間的服務器因爲連到一個更加高級的一個交換機裏面,因此他們的速度通常會慢一點。並且還有一個比較特別的狀況,有時候可能會由於網線的故障或者交換機端口的故障,咱們每每會跟整個機櫃裏面的服務器失去聯繫。考慮到這種狀況。hadoop對機架要有特殊的處理策略。好比機架感知和冗餘策略。

HDFS的「機架感知」。

經過節點之間互相傳遞一個信息包來獲知節點之間的關係(到底是分佈在同一個機架仍是不一樣的機架裏面)。
副本的存放是HDFS可靠性和性能的關鍵。優化的副本存放策略也正是HDFS區分於其餘大部分分佈式文件系統的重要特徵。HDFS採用一個稱爲「機架感知(rack-aware)」的策略來改進數據的可靠性、可用性和網絡帶寬的利用率。

冗餘:通常在本機架存放一個副本,在其餘機架存放別的副本,這樣能夠防止機架失效時丟失數據,也能夠提升帶寬利用率。

 

4.3 心跳策略

Namnode週期性從DataNode接收心跳信號和快報告;
所謂快報告就是說DataNode會不斷地向NameNode發送一個blockreport,告訴他在本地的系統裏面數據塊和文件的對應關係。

NameNode會根據塊報告驗證元數據;
就是說數據節點實際狀況和元數據裏面記錄的是否一致,若是不一致,可能須要進行相應的修正以及冗餘策略等。

沒有按時發送心跳的DataNode會被標記爲宕機,不會再給它任何I/O請求;

若是DataNode失效形成副本數量降低,而且低於預先設置的閾值,NameNode會檢測出這些數據塊,並在合適的時機進行從新複製;

引起從新複製的緣由還包括數據副本自己損壞、磁盤錯誤,複製因子被增大等。

 

4.4 安全模式

NameNode啓動後會進入一個稱爲安全模式的狀態。處於安全模式的NameNode不會進行數據塊的複製,NameNode從全部的DataNode接收心跳信號和塊狀態報告。

過程:

NameNode啓動時,首先將映像文件(fsimage)載入內存,並執行編輯日誌(edits)中的各項操做。
一旦在內存中成功創建文件系統元數據的映射,則建立一個新的fsimage文件(這個操做不須要SecondaryNameNode)和一個空的編輯日誌。
此刻NameNode運行在安全模式,即NameNode的文件系統對於客戶端來講是隻讀的(顯示目錄、文件內容等。寫、刪除、重命名都會失敗)。
在此階段NameNode收集各個DataNode的報告,當數據塊達到最小副本數以上時,會被認爲是安全的;在必定比例(可設置)的數據塊被肯定爲「安全」後,再過若干時間,安全模式結束。
當檢測到副本數不足的數據塊時,該塊會被複制直到達到最小副本數,系統中數據塊的位置並非由NameNode維護的,而是以塊列表形式存儲在DataNode中。

報錯:

在運行hadoop程序時,有時候會報如下錯誤:
org.apache.hadoop.dfs.SafeModeException: Cannot delete /user/hadoop/input. Name node is in safe mode

在分佈式文件系統啓動時,開始的時候會進入安全模式,當分佈式文件系統處於安全模式的狀況下,文件系統中的內容不容許修改也不容許刪除,直到安全模式結束。
安全模式主要是爲了系統啓動的時候檢查各個DataNode上數據塊的有效性,同時根據策略必要的複製或者刪除部分數據塊。運行期經過命令也能夠進入安全模式。
在經過命令行啓動hadoop的守護進程時,有時會由於操做不當,例如「Ctrl+z」或者命令行的切換關閉等會使得NameNode進入安全模式,解決此問題只要在hadoop的根目錄下輸入:
hdfs dfsadmin -safemode enter 即進入安全模式
hdfs dfsadmin -safemode leave 即離開安全模式
start-balancer.sh 負載均衡模式、

 

4.5 校驗和

在文件創立時,每一個數據塊都產生校驗和;
校驗和會做爲單獨一個隱藏文件保存在命名空間下;
客戶端獲取數據時能夠檢查校驗和是否相同,從而發現數據塊是否損壞;
若是正在讀取的數據塊損壞,則能夠繼續讀取其它副本。


4.6 回收站

刪除文件時,實際上是放入回收站/trash;
回收站裏的文件能夠快速恢復;
能夠設置一個時間閾值,當回收站裏文件的存放時間超過這個閾值,就會被完全刪除,而且釋放佔用的數據塊。


4.7 元數據保護

映像文件和事物日誌是NameNode的核心數據,能夠配置爲擁有多個副本;
副本會下降NameNode的處理速度,但增長安全性;
NameNode依然是單點,若是發生故障要手工切換。

元數據在NameNode上,保存了整個文件系統的關鍵信息,若是元數據被破壞掉,那麼毫無疑問文件系統就崩潰了,無可挽回的崩潰,爲了防止這種狀況的發生,咱們須要對元數據進行保護。

 

4.8 快照機制

支持存儲某個時間點的映像,須要時可使數據重返這個時間點的狀態;
Hadoop目前(2012年)還不支持快照,已經列入開發計劃。

 

5.HDFS基礎架構以及工做原理

HDFS基礎架構

下圖是hdfs寫操做圖,具體過程描述詳見這裏

 

6.HDFS讀操做

客戶端(client)用FileSystem的open()函數打開文件。
DistributedFileSystem用RPC(Remote Procedure Call—遠程過程調用)調用元數據節點,獲得文件的數據塊信息。
對於每個數據塊,元數據節點返回保存數據塊的數據節點的地址。
DistributedFileSystem返回FSDataInputStream給客戶端,用來讀取數據。
客戶端調用stream的read()函數開始讀取數據。
DFSInputStream鏈接保存此文件第一個數據塊的最近的數據節點。
Data從數據節點讀到客戶端(client)。
當此數據塊讀取完畢時,DFSInputStream關閉和此數據節點的鏈接,而後鏈接此文件下一個數據塊的最近的數據節點。
當客戶端讀取完畢數據的時候,調用FSDataInputStream的close()函數。
在讀取數據的過程當中,若是客戶端在與數據節點通訊出現錯誤,則嘗試鏈接包含此數據塊的下一個數據節點。失敗的數據節點將被記錄,之後再也不鏈接。

 

7.HDFS寫操做

客戶端調用create()來建立文件。
DistributedFileSystem用RPC調用元數據節點,在文件系統的命名空間中建立一個新的文件。
元數據節點首先肯定文件原來不存在,而且客戶端有建立文件的權限,而後建立新文件。
DistributedFileSystem返回DFSOutputStream,客戶端用於寫數據。
客戶端開始寫入數據,DFSOUTputStream將數據分紅塊,寫入data queue。
DataQuery由DataStreamer讀取,並通知元數據節點分配數據節點,用來存儲數據塊(每塊默認複製3塊)分配的數據節點放在一個pipeline裏。
DataStreamer將數據塊寫入pipeline中的第一個數據節點。
第一個數據節點將數據塊發送給第二個數據節點,第二個數據節點將數據發送給第三個數據節點。
DFSOutputStream爲發出去的數據塊保存了ack queue,等待pipeline中的數據節點告知數據已經寫入成功。

 

8.HDFS現實舉例

 

9.HDFS簡單操做

linux操做系統中的不少命令在HDFS系統中也可使用,只不過須要在前面添加一個前綴hdfs dfs -。具體操做舉例以下:

[root@hadoop ~]# start-all.sh #啓動hadoop
...
[root@hadoop ~]# vi 123.txt #新建一個測試文件
I love hadoop

[root@hadoop ~]# hdfs dfs -put 123.txt / #將測試文件放到hdfs根目錄下

[root@hadoop ~]# hdfs dfs -ls / #查看hdfs根目錄
Found 1 items
-rw-r--r--   1 root supergroup         14 2018-07-18 21:47 /123.txt

[root@hadoop ~]# hdfs dfs -cat /123.txt  #查看hdfs中的測試文件內容
I love hadoop

[root@hadoop ~]# hdfs dfs -mkdir /test #建立目錄
[root@hadoop ~]# hdfs dfs -ls / #查看,建立目錄成功
Found 2 items
drwxr-xr-x   - root supergroup          0 2018-07-18 21:51 /test
-rw-r--r--   1 root supergroup         14 2018-07-18 21:47 /123.txt

[root@hadoop ~]# hdfs dfs -cp /123.txt /test/ #複製文件
[root@hadoop ~]# hdfs dfs -ls /test/ #查看,複製文件成功
Found 1 items
-rw-r--r--   1 root supergroup         14 2018-07-18 21:54 /test/123.txt

[root@hadoop ~]# hdfs dfs -cd /test/ #注意:沒有cd命令
-cd: Unknown command

[root@hadoop ~]# hdfs dfs -rm -r /test #刪除目錄
Deleted /test
[root@hadoop ~]# hdfs dfs -ls / #查看,刪除目錄成功
Found 1 items
-rw-r--r--   1 root supergroup         14 2018-07-18 21:47 /123.txt

[root@hadoop ~]# hdfs dfs -get /123.txt /var/hdfs_123.txt #將測試文件取出來放到本地
[root@hadoop ~]# cd /var/ #查看
[root@hadoop var]# ls
adm    crash  empty  gopher  hdfs_123.txt  lib    lock  mail  opt       run    tmp
cache  db     games  hadoop  kerberos      local  log   nis   preserve  spool  yp
[root@hadoop var]# cat hdfs_123.txt 
I love hadoop

[root@hadoop var]# hdfs dfs -df -h #查看hdfs使用狀況
Filesystem            Size    Used  Available  Use%
hdfs://hadoop:9000  18.0 G  24.0 K     11.0 G    0%


#其實,上面的命令基本上均可以用hadoop fs -前綴命令代替,好比
[root@hadoop ~]# hadoop fs -ls / #查看hdfs根目錄
Found 1 items
-rw-r--r--   1 root supergroup         14 2018-07-18 21:47 /123.txt
hdfs簡單操做舉例
[root@hadoop ~]# hdfs dfs #顯示全部的命令
Usage: hadoop fs [generic options]
    [-appendToFile <localsrc> ... <dst>]
    [-cat [-ignoreCrc] <src> ...]
    [-checksum <src> ...]
    [-chgrp [-R] GROUP PATH...]
    [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
    [-chown [-R] [OWNER][:[GROUP]] PATH...]
    [-copyFromLocal [-f] [-p] [-l] [-d] [-t <thread count>] <localsrc> ... <dst>]
    [-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
    [-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] [-e] <path> ...]
    [-cp [-f] [-p | -p[topax]] [-d] <src> ... <dst>]
    [-createSnapshot <snapshotDir> [<snapshotName>]]
    [-deleteSnapshot <snapshotDir> <snapshotName>]
    [-df [-h] [<path> ...]]
    [-du [-s] [-h] [-v] [-x] <path> ...]
    [-expunge]
    [-find <path> ... <expression> ...]
    [-get [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
    [-getfacl [-R] <path>]
    [-getfattr [-R] {-n name | -d} [-e en] <path>]
    [-getmerge [-nl] [-skip-empty-file] <src> <localdst>]
    [-head <file>]
    [-help [cmd ...]]
    [-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] [<path> ...]]
    [-mkdir [-p] <path> ...]
    [-moveFromLocal <localsrc> ... <dst>]
    [-moveToLocal <src> <localdst>]
    [-mv <src> ... <dst>]
    [-put [-f] [-p] [-l] [-d] <localsrc> ... <dst>]
    [-renameSnapshot <snapshotDir> <oldName> <newName>]
    [-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...]
    [-rmdir [--ignore-fail-on-non-empty] <dir> ...]
    [-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
    [-setfattr {-n name [-v value] | -x name} <path>]
    [-setrep [-R] [-w] <rep> <path> ...]
    [-stat [format] <path> ...]
    [-tail [-f] <file>]
    [-test -[defsz] <path>]
    [-text [-ignoreCrc] <src> ...]
    [-touchz <path> ...]
    [-truncate [-w] <length> <path> ...]
    [-usage [cmd ...]]

Generic options supported are:
-conf <configuration file>        specify an application configuration file
-D <property=value>               define a value for a given property
-fs <file:///|hdfs://namenode:port> specify default filesystem URL to use, overrides 'fs.defaultFS' property from configurations.
-jt <local|resourcemanager:port>  specify a ResourceManager
-files <file1,...>                specify a comma-separated list of files to be copied to the map reduce cluster
-libjars <jar1,...>               specify a comma-separated list of jar files to be included in the classpath
-archives <archive1,...>          specify a comma-separated list of archives to be unarchived on the compute machines

The general command line syntax is:
command [genericOptions] [commandOptions]
hdfs dfs -前綴命令
[root@hadoop var]# hadoop fs
Usage: hadoop fs [generic options]
    [-appendToFile <localsrc> ... <dst>]
    [-cat [-ignoreCrc] <src> ...]
    [-checksum <src> ...]
    [-chgrp [-R] GROUP PATH...]
    [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
    [-chown [-R] [OWNER][:[GROUP]] PATH...]
    [-copyFromLocal [-f] [-p] [-l] [-d] [-t <thread count>] <localsrc> ... <dst>]
    [-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
    [-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] [-e] <path> ...]
    [-cp [-f] [-p | -p[topax]] [-d] <src> ... <dst>]
    [-createSnapshot <snapshotDir> [<snapshotName>]]
    [-deleteSnapshot <snapshotDir> <snapshotName>]
    [-df [-h] [<path> ...]]
    [-du [-s] [-h] [-v] [-x] <path> ...]
    [-expunge]
    [-find <path> ... <expression> ...]
    [-get [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
    [-getfacl [-R] <path>]
    [-getfattr [-R] {-n name | -d} [-e en] <path>]
    [-getmerge [-nl] [-skip-empty-file] <src> <localdst>]
    [-head <file>]
    [-help [cmd ...]]
    [-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] [<path> ...]]
    [-mkdir [-p] <path> ...]
    [-moveFromLocal <localsrc> ... <dst>]
    [-moveToLocal <src> <localdst>]
    [-mv <src> ... <dst>]
    [-put [-f] [-p] [-l] [-d] <localsrc> ... <dst>]
    [-renameSnapshot <snapshotDir> <oldName> <newName>]
    [-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...]
    [-rmdir [--ignore-fail-on-non-empty] <dir> ...]
    [-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
    [-setfattr {-n name [-v value] | -x name} <path>]
    [-setrep [-R] [-w] <rep> <path> ...]
    [-stat [format] <path> ...]
    [-tail [-f] <file>]
    [-test -[defsz] <path>]
    [-text [-ignoreCrc] <src> ...]
    [-touchz <path> ...]
    [-truncate [-w] <length> <path> ...]
    [-usage [cmd ...]]

Generic options supported are:
-conf <configuration file>        specify an application configuration file
-D <property=value>               define a value for a given property
-fs <file:///|hdfs://namenode:port> specify default filesystem URL to use, overrides 'fs.defaultFS' property from configurations.
-jt <local|resourcemanager:port>  specify a ResourceManager
-files <file1,...>                specify a comma-separated list of files to be copied to the map reduce cluster
-libjars <jar1,...>               specify a comma-separated list of jar files to be included in the classpath
-archives <archive1,...>          specify a comma-separated list of archives to be unarchived on the compute machines

The general command line syntax is:
command [genericOptions] [commandOptions]
hadoop fs -前綴命令

附兩個查看hdfs shell命令的網址:

http://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/FileSystemShell.html

http://hadoop.apache.org/docs/r2.6.2/hadoop-project-dist/hadoop-common/FileSystemShell.html

 

10.HDFS管理與更新

(1) 查看HDFS基本統計信息 hdfs dfsadmin -report

[root@hadoop ~]# hdfs dfsadmin -report               #如下是我本身翻譯的,若有問題歡迎指正。
Configured Capacity: 19315818496 (17.99 GB)          #配置容量:1931581849617.99 GB)
Present Capacity: 11839451136 (11.03 GB)             #現有容量:1183945113611.03 GB)
DFS Remaining: 11838365696 (11.03 GB)                #分佈式文件系統剩餘:1183836569611.03 GB)
DFS Used: 1085440 (1.04 MB)                          #分佈式文件系統已使用:10854401.04 MB)
DFS Used%: 0.01%                                     #分佈式文件系統已使用百分比:0.01%
Replicated Blocks:                                   #複製塊:
    Under replicated blocks: 4                       #    已複製塊數:4
    Blocks with corrupt replicas: 0                  #    具備損壞副本的塊數:0
    Missing blocks: 0                                #    丟失塊數:0
    Missing blocks (with replication factor 1): 0    #    丟失塊數(複製因子爲1):0
    Pending deletion blocks: 0                       #    待刪除塊:0
Erasure Coded Block Groups:                          #擦除編碼塊組:
    Low redundancy block groups: 0                   #    低冗餘塊組:0
    Block groups with corrupt internal blocks: 0     #    內部塊損壞的塊組:
    Missing block groups: 0                          #    丟失塊組:0
    Pending deletion blocks: 0                       #    待刪除塊:0
                                                     #
-------------------------------------------------    #
Live datanodes (1):                                  #實時數據節點(1)
                                                     #
Name: 192.168.42.134:9866 (hadoop)                   #名稱:192.168.42.1349866(hadoop)
Hostname: hadoop                                     #主機名:hadoop
Decommission Status : Normal                         #退役狀態:正常(未被移除)
Configured Capacity: 19315818496 (17.99 GB)          #配置容量:1931581849617.99 GB)
DFS Used: 1085440 (1.04 MB)                          #DFS已使用:10854401.04 MB)
Non DFS Used: 7476367360 (6.96 GB)                   #非DFS使用:74763673606.96 GB)
DFS Remaining: 11838365696 (11.03 GB)                #DFS剩餘:1183836569611.03 GB)
DFS Used%: 0.01%                                     #DFS使用%:0.01%
DFS Remaining%: 61.29%                               #DFS剩餘%:61.29%
Configured Cache Capacity: 0 (0 B)                   #配置的緩存容量:00 B)
Cache Used: 0 (0 B)                                  #緩存已使用:00 B)
Cache Remaining: 0 (0 B)                             #緩存剩餘:00 B)
Cache Used%: 100.00%                                 #緩存已使用%:100.00%  
Cache Remaining%: 0.00%                              #緩存剩餘%:0.00% 
Xceivers: 1                                          #Xceivers: 1  
Last contact: Fri Jul 20 04:58:17 EDT 2018           #上次鏈接時間:
Last Block Report: Fri Jul 20 03:04:12 EDT 2018      #上次發送塊報告時間:
Num of Blocks: 10                                    #塊數:10
View Code

(2) 進入安全模式

[root@hadoop mapreduce]# hdfs dfsadmin -safemode enter
Safe mode is ON

(3) 退出安全模式

[root@hadoop mapreduce]# hdfs dfsadmin -safemode leave
Safe mode is OFF

(4) 負載均衡
HDFS的數據在各個DataNode中的分佈可能很不均勻,尤爲是在DataNode節點出現故障或新增DataNode節點時。新增數據塊時NameNode對DataNode節點的選擇策略也有可能致使數據塊分佈的不均勻。用戶可使用命令從新平衡DataNode上的數據塊的分佈。

[root@hadoop mapreduce]# start-balancer.sh

 

11.HDFS 優勢 VS 缺點

HDFS優勢:

高容錯性:數據自動保存多個副本;副本丟失後,自動恢復。
適合批處理:移動計算而非數據;數據位置暴露給計算框架。
適合大數據處理:GB、TB、甚至PB級數據;百萬規模以上的文件數量;10K+節點。
可構建在廉價機器上:經過多副本提升可靠性;提供了容錯和恢復機制。

HDFS缺點:

不適合低延遲數據訪問:好比毫秒級;低延遲與高吞吐率。
不適合小文件存取:佔用NameNode大量內存;尋道時間超過讀取時間。
不適合併發寫入、文件隨機修改:一個文件只能有一個寫者;僅支持append。

 

12.Block的副本放置策略

第一個副本:放置在上傳文件的DN;若是是集羣外提交,則隨機挑選一臺磁盤不太滿,CPU不太忙的節點。
第二個副本:放置在與第一個副本不一樣的機架的節點上。
第三個副本:與第二個副本相同機架的節點上。
更多副本:隨機節點。

 

13.HDFS文件權限

與linux文件權限相似:r:read;w:write;x:execte,權限x對於文件忽略,對於文件夾表示是否容許訪問其內容。若是Linux系統用戶zhangsan使用Hadoop命令建立一個文件,那麼這個文件在HDFS中owner就是zhangsan。HDFS的權限目的:阻止好人作錯事,而不是阻止壞人作錯事。HDFS詳細,你告訴我你是誰,我就認爲你是誰。說白了,就是HDFS不作密碼認證(不知道新版本有沒有作這個功能?)。

相關文章
相關標籤/搜索