1. 程式人生 > >初識HDFS原理及框架

初識HDFS原理及框架

大量 用法 執行 nod tro lds hba 配置參數 管理數據

目錄
  1. HDFS是什麽
  2. HDFS的優缺點
  3. HDFS的框架
  4. HDFS的讀寫流程
  5. HDFS命令
  6. HDFS參數

1. HDFS是什麽


HDFS(Hadoop Distributed File System)是Hadoop項目的核心子項目,首先它是一個文件系統,用於存儲文件,通過目錄樹來定位文件位置;其次,它是分布式的,由很多服務器聯合起來實現其功能,集群中的服務器有各自的角色。

2.HDFS的優缺點


之所以選擇HDFS來存儲數據,是具有如下優勢:

No 優勢 描述
1 高容錯性
  • 數據自動保存多個副本。它通過增加副本的形式,提高容錯性。
  • 某一個副本丟失以後,它可以自動恢復,這是由 HDFS 內部機制實現的,我們不必關心。
2 適合批處理
  • 它是通過移動計算而不是移動數據。
  • 它會把數據位置暴露給計算框架。
3 適合大數據處理
  • 處理數據達到 GB、TB、甚至PB級別的數據。
  • 能夠處理百萬規模以上的文件數量,數量相當之大。
  • 能夠處理10K節點的規模。
4 流式文件訪問
  • 一次寫入,多次讀取。文件一旦寫入不能修改,只能追加。
  • 它能保證數據的一致性。
5 可構建在廉價機器上
  • 它通過多副本機制,提高可靠性。
  • 它提供了容錯和恢復機制。比如某一個副本丟失,可以通過其它副本來恢復。

HDFS也有不適合的場景:

No 缺點 描述
1 低延時數據訪問
  • 比如毫秒級的來存儲數據,這是不行的,它做不到。
  • 它適合高吞吐率的場景,就是在某一時間內寫入大量的數據。但是它在低延時的情況下是不行的,比如毫秒級以內讀取數據,這樣它是很難做到的。
2 小文件存儲
  • 存儲大量小文件(這裏的小文件是指小於HDFS系統的Block大小的文件(默認64M))的話,它會占用 NameNode大量的內存來存儲文件、目錄和塊信息。這樣是不可取的,因為NameNode的內存總是有限的。
  • 小文件存儲的尋道時間會超過讀取時間,它違反了HDFS的設計目標。
3 並發寫入、文件隨機修改
  • 一個文件只能有一個寫,不允許多個線程同時寫。
  • 僅支持數據 append(追加),不支持文件的隨機修改。

3. HDFS框架結構


技術分享圖片

HDFS 采用Master/Slave的架構來存儲數據,這種架構主要由四個部分組成,分別為HDFS Client、NameNode、DataNode和Secondary NameNode。下面我們分別介紹這四個組成部分。

No 角色 功能描述
1 Client:就是客戶端
  • 文件切分。文件上傳 HDFS 的時候,Client 將文件切分成 一個一個的Block,然後進行存儲。
  • 與 NameNode 交互,獲取文件的位置信息。
  • 與 DataNode 交互,讀取或者寫入數據。
  • Client 提供一些命令來管理 HDFS,比如啟動或者關閉HDFS。
  • Client 可以通過一些命令來訪問 HDFS。
2 NameNode:就是 master,它是一個主管、管理者
  • 管理 HDFS 的名稱空間
  • 管理數據塊(Block)映射信息
  • 配置副本策略
  • 處理客戶端讀寫請求。
3 DataNode:就是Slave。NameNode 下達命令,DataNode 執行實際的操作
  • 存儲實際的數據塊。
  • 執行數據塊的讀/寫操作。
4 Secondary NameNode:並非 NameNode 的熱備。當NameNode 掛掉的時候,它並不能馬上替換 NameNode 並提供服務
  • 輔助 NameNode,分擔其工作量。
  • 定期合並 fsimage和fsedits,並推送給NameNode。
  • 在緊急情況下,可輔助恢復 NameNode。

4. HDFS的讀寫流程


4.1. HDFS的塊大小

HDFS中的文件在物理上是分塊存儲(block),塊的大小可以通過配置參數(dfs.blocksize)來規定,默認大小在hadoop2.x版本中是128M,老版本中是64M

HDFS的塊比磁盤的塊大,其目的是為了最小化尋址開銷。如果塊設置得足夠大,從磁盤傳輸數據的時間會明顯大於定位這個塊開始位置所需的時間。因而,傳輸一個由多個塊組成的文件的時間取決於磁盤傳輸速率。

如果尋址時間約為10ms,而傳輸速率為100MB/s,為了使尋址時間僅占傳輸時間的1%,我們要將塊大小設置約為100MB。默認的塊大小128MB

塊的大小:10ms*100*100M/s = 100M

4.2. HDFS寫數據流程

技術分享圖片

1)客戶端向namenode請求上傳文件,namenode檢查目標文件是否已存在,父目錄是否存在。

2)namenode返回是否可以上傳。

3)客戶端請求第一個 block上傳到哪幾個datanode服務器上。

4)namenode返回3個datanode節點,分別為dn1、dn2、dn3。

5)客戶端請求dn1上傳數據,dn1收到請求會繼續調用dn2,然後dn2調用dn3,將這個通信管道建立完成

6)dn1、dn2、dn3逐級應答客戶端

7)客戶端開始往dn1上傳第一個block(先從磁盤讀取數據放到一個本地內存緩存),以packet為單位,dn1收到一個packet就會傳給dn2,dn2傳給dn3;dn1每傳一個packet會放入一個應答隊列等待應答

8)當一個block傳輸完成之後,客戶端再次請求namenode上傳第二個block的服務器。(重復執行3-7步)

4.3. HDFS讀數據流程

技術分享圖片

1)客戶端向namenode請求下載文件,namenode通過查詢元數據,找到文件塊所在的datanode地址。

2)挑選一臺datanode(就近原則,然後隨機)服務器,請求讀取數據。

3)datanode開始傳輸數據給客戶端(從磁盤裏面讀取數據放入流,以packet為單位來做校驗)。

4)客戶端以packet為單位接收,先在本地緩存,然後寫入目標文件。

5.HDFS命令


1)基本語法

bin/hadoop fs 具體命令

2)常用命令實操

(1)-help:輸出這個命令參數

bin/hdfs dfs -help rm

(2)-ls: 顯示目錄信息

hadoop fs -ls /

(3)-mkdir:在hdfs上創建目錄

hadoop fs -mkdir -p /aaa/bbb/cc/dd

(4)-moveFromLocal從本地剪切粘貼到hdfs

hadoop fs - moveFromLocal /home/hadoop/a.txt /aaa/bbb/cc/dd

(5)-moveToLocal:從hdfs剪切粘貼到本地(尚未實現)

hadoop fs -help moveToLocal

-moveToLocal <src> <localdst> :

Not implemented yet

(6)--appendToFile :追加一個文件到已經存在的文件末尾

hadoop fs -appendToFile ./hello.txt /hello.txt

(7)-cat :顯示文件內容

(8)-tail:顯示一個文件的末尾

hadoop fs -tail /weblog/access_log.1

(9)-chgrp 、-chmod、-chown:linux文件系統中的用法一樣,修改文件所屬權限

hadoop fs -chmod 666 /hello.txt

hadoop fs -chown someuser:somegrp /hello.txt

(10)-copyFromLocal:從本地文件系統中拷貝文件到hdfs路徑去

hadoop fs -copyFromLocal ./jdk.tar.gz /aaa/

(11)-copyToLocal:從hdfs拷貝到本地

hadoop fs -copyToLocal /user/hello.txt ./hello.txt

(12)-cp :從hdfs的一個路徑拷貝到hdfs的另一個路徑

hadoop fs -cp /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2

(13)-mv:在hdfs目錄中移動文件

hadoop fs -mv /aaa/jdk.tar.gz /

(14)-get:等同於copyToLocal,就是從hdfs下載文件到本地

hadoop fs -get /user/hello.txt ./

(15)-getmerge :合並下載多個文件,比如hdfs的目錄 /aaa/下有多個文件:log.1, log.2,log.3,...

hadoop fs -getmerge /aaa/log.* ./log.sum

(16)-put:等同於copyFromLocal

hadoop fs -put /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2

(17)-rm:刪除文件或文件夾

hadoop fs -rm -r /aaa/bbb/

(18)-rmdir:刪除空目錄

hadoop fs -rmdir /aaa/bbb/ccc

(19)-df :統計文件系統的可用空間信息

hadoop fs -df -h /

(20)-du統計文件夾的大小信息

hadoop fs -du -s -h /user/data/wcinput

188.5 M /user/data/wcinput

hadoop fs -du -h /user/data/wcinput

188.5 M /user/data/wcinput/hadoop-2.7.2.tar.gz

97 /user/data/wcinput/wc.input

(21)-count:統計一個指定目錄下的文件節點數量

hadoop fs -count /aaa/

hadoop fs -count /user/data/wcinput

1 2 197657784 /user/data/wcinput

嵌套文件層級; 包含文件的總數

(22)-setrep:設置hdfs中文件的副本數量

hadoop fs -setrep 3 /aaa/jdk.tar.gz

這裏設置的副本數只是記錄在namenode的元數據中,是否真的會有這麽多副本,還得看datanode的數量。如果只有3臺設備,最多也就3個副本,只有節點數的增加到10臺時,副本數才能達到10。

6.HDFS相關參數


No 參數名稱 默認值 所屬參數文件 描述
1

dfs.block.size,

dfs.blocksize

134217728 hdfs-site.xml 以字節計算的新建 HDFS 文件默認塊大小。請註意該值也用作 HBase 區域服務器 HLog 塊大小。
2 dfs.replication 3 hdfs-site.xml HDFS文件的數據塊復制份數。
3 dfs.webhdfs.enabled TRUE hdfs-site.xml 啟用 WebHDFS 界面,啟動50070端口。
4 dfs.permissions TRUE hdfs-site.xml HDFS文件權限檢查。
5 dfs.datanode.failed.volumes.tolerated 0 hdfs-site.xml 能夠導致DN掛掉的壞硬盤最大數,默認0就是只要有1個硬盤壞了,DN就會shutdown。
6

dfs.data.dir,

dfs.datanode.data.dir

xxx,xxx hdfs-site.xml DataNode數據保存路徑,可以寫多塊硬盤,逗號分隔
7

dfs.name.dir,

dfs.namenode.name.dir

xxx,xxx hdfs-site.xml NameNode本地元數據存儲目錄,可以寫多塊硬盤,逗號分隔
8 fs.trash.interval 1 core-site.xml 垃圾桶檢查頻度(分鐘)。要禁用垃圾桶功能,請輸入0。
9 dfs.safemode.min.datanodes 0 hdfs-site.xml 指定在名稱節點存在 safemode 前必須活動的 DataNodes 數量。輸入小於或等於 0 的值,以在決定啟動期間是否保留 safemode 時將活動的 DataNodes 數量考慮在內。值大於群集中 DataNodes 的數量時將永久保留 safemode。
10 dfs.client.read.shortcircuit TRUE hdfs-site.xml 啟用 HDFS short circuit read。該操作允許客戶端直接利用 DataNode 讀取 HDFS 文件塊。這樣可以提升本地化的分布式客戶端的性能
11 dfs.datanode.handler.count 3 hdfs-site.xml DataNode 服務器線程數。默認為3,較大集群,可適當調大些,比如8。
12 dfs.datanode.max.xcievers, dfs.datanode.max.transfer.threads 256 hdfs-site.xml 指定在 DataNode 內外傳輸數據使用的最大線程數,datanode在進行文件傳輸時最大線程數
13 dfs.balance.bandwidthPerSec, dfs.datanode.balance.bandwidthPerSec 1048576 hdfs-site.xml 每個 DataNode 可用於平衡的最大帶寬。單位為字節/秒

以上參數中可能有2個名稱,前面一個是老版本1.x的後面的是新版本2.x的。

以上資料都是從網絡上復制匯總過來的,如介意請告知

初識HDFS原理及框架