初識HDFS原理及框架
目錄
-
HDFS是什麽
-
HDFS的優缺點
-
HDFS的框架
-
HDFS的讀寫流程
-
HDFS命令
-
HDFS參數
1. HDFS是什麽
HDFS(Hadoop Distributed File System)是Hadoop項目的核心子項目,首先它是一個文件系統,用於存儲文件,通過目錄樹來定位文件位置;其次,它是分布式的,由很多服務器聯合起來實現其功能,集群中的服務器有各自的角色。
2.HDFS的優缺點
之所以選擇HDFS來存儲數據,是具有如下優勢:
No | 優勢 | 描述 |
1 | 高容錯性 |
|
2 | 適合批處理 |
|
3 | 適合大數據處理 |
|
4 | 流式文件訪問 |
|
5 | 可構建在廉價機器上 |
|
HDFS也有不適合的場景:
No | 缺點 | 描述 |
1 | 低延時數據訪問 |
|
2 | 小文件存儲 |
|
3 | 並發寫入、文件隨機修改 |
|
3. HDFS框架結構
HDFS 采用Master/Slave的架構來存儲數據,這種架構主要由四個部分組成,分別為HDFS Client、NameNode、DataNode和Secondary NameNode。下面我們分別介紹這四個組成部分。
No | 角色 | 功能描述 |
1 | Client:就是客戶端 |
|
2 | NameNode:就是 master,它是一個主管、管理者 |
|
3 | DataNode:就是Slave。NameNode 下達命令,DataNode 執行實際的操作 |
|
4 | Secondary NameNode:並非 NameNode 的熱備。當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原理及框架