第1章 HDFS概述
1.1 HDFS定義
HDFS(Hadoop distributed System),它是一個文件系統(tǒng),用于存文件枣接,通過目錄樹定義文件;其次他是分布式的缺谴,有很多服務(wù)器聯(lián)合起來實現(xiàn)功能但惶,集群中的服務(wù)器有各自的目的。
HDFS的使用場景:適合一次寫入湿蛔,多次讀出的場景膀曾,且不支持文件的修改。適合做數(shù)據(jù)分析
- 1.2 HDFS優(yōu)缺點
- 1.2.1 優(yōu)點:
- 1)高容錯
- 2)適合處理大數(shù)據(jù)
- 3)可構(gòu)建在廉價機器上
- 1.2.2 缺點:
- 1)不合適低延時數(shù)據(jù)訪問
- 2)無法高效的對大量小文件進行存儲
- 3)僅支持?jǐn)?shù)據(jù)append 阳啥,不支持文件隨機修改
- 1.2.1 優(yōu)點:
-
1.3 HDFS組成架構(gòu)
- 1)NameNode:就是Master
- 2)DateNode:就是Slave
- 3)Client:客戶端
- 4)Secondary NameNode:協(xié)助NameNode,定期合Fsimage和Edits
-
1.4 HDFS文件塊大小
- 塊存儲老版本68M新版128M
- 思考 :不能存太大也不能存太小
- 太小:會增加添谊,尋址時間
- 太大:會增加處理數(shù)據(jù)時間
- 總結(jié):HDFS塊的大小設(shè)置取決于磁盤傳輸速率
第2章 HDFS的Shell操作
1.基本語法
bin/hadoop fs 具體命令 OR bin/hdfs dfs 具體命令
dfs是fs的實現(xiàn)類。
2.常用命令實操
(0)啟動Hadoop集群(方便后續(xù)的測試)
[atguigu@hadoop102 hadoop-2.7.2]\$ sbin/start-dfs.sh
[atguigu@hadoop103 hadoop-2.7.2]\$ sbin/start-yarn.sh
(1)-help:輸出這個命令參數(shù)
[atguigu@hadoop102 hadoop-2.7.2]\$ hadoop fs -help rm
(2)-ls: 顯示目錄信息
[atguigu@hadoop102 hadoop-2.7.2]\$ hadoop fs -ls /
(3)-mkdir:在HDFS上創(chuàng)建目錄
[atguigu@hadoop102 hadoop-2.7.2]\$ hadoop fs -mkdir -p /sanguo/shuguo
(4)-moveFromLocal:從本地剪切粘貼到HDFS
[atguigu@hadoop102 hadoop-2.7.2]\$ touch kongming.txt
[atguigu@hadoop102 hadoop-2.7.2]\$ hadoop fs -moveFromLocal ./kongming.txt /sanguo/shuguo
(5)-appendToFile:追加一個文件到已經(jīng)存在的文件末尾
[atguigu@hadoop102 hadoop-2.7.2]\$ touch liubei.txt
[atguigu@hadoop102 hadoop-2.7.2]\$ vi liubei.txt
輸入
san gu mao lu
[atguigu@hadoop102 hadoop-2.7.2]\$ hadoop fs -appendToFile liubei.txt /sanguo/shuguo/kongming.txt
(6)-cat:顯示文件內(nèi)容
[atguigu@hadoop102 hadoop-2.7.2]\$ hadoop fs -cat /sanguo/shuguo/kongming.txt
(7)-chgrp 察迟、-chmod斩狱、-chown:Linux文件系統(tǒng)中的用法一樣耳高,修改文件所屬權(quán)限
[atguigu@hadoop102 hadoop-2.7.2]\$ hadoop fs -chmod 666 /sanguo/shuguo/kongming.txt
[atguigu@hadoop102 hadoop-2.7.2]\$ hadoop fs -chown atguigu:atguigu /sanguo/shuguo/kongming.txt
(8)-copyFromLocal:從本地文件系統(tǒng)中拷貝文件到HDFS路徑去
[atguigu@hadoop102 hadoop-2.7.2]\$ hadoop fs -copyFromLocal README.txt /
(9)-copyToLocal:從HDFS拷貝到本地
[atguigu@hadoop102 hadoop-2.7.2]\$ hadoop fs -copyToLocal /sanguo/shuguo/kongming.txt ./
(10)-cp :從HDFS的一個路徑拷貝到HDFS的另一個路徑
[atguigu@hadoop102 hadoop-2.7.2]\$ hadoop fs -cp /sanguo/shuguo/kongming.txt /zhuge.txt
(11)-mv:在HDFS目錄中移動文件
[atguigu@hadoop102 hadoop-2.7.2]\$ hadoop fs -mv /zhuge.txt /sanguo/shuguo/
(12)-get:等同于copyToLocal,就是從HDFS下載文件到本地
[atguigu@hadoop102 hadoop-2.7.2]\$ hadoop fs -get /sanguo/shuguo/kongming.txt ./
(13)-getmerge:合并下載多個文件所踊,比如HDFS的目錄 /user/atguigu/test下有多個文件:log.1, log.2,log.3,...
[atguigu@hadoop102 hadoop-2.7.2]\$ hadoop fs -getmerge /user/atguigu/test/* ./zaiyiqi.txt
(14)-put:等同于copyFromLocal
[atguigu@hadoop102 hadoop-2.7.2]\$ hadoop fs -put ./zaiyiqi.txt /user/atguigu/test/
(15)-tail:顯示一個文件的末尾
[atguigu@hadoop102 hadoop-2.7.2]\$ hadoop fs -tail /sanguo/shuguo/kongming.txt
(16)-rm:刪除文件或文件夾
[atguigu@hadoop102 hadoop-2.7.2]\$ hadoop fs -rm /user/atguigu/test/jinlian2.txt
(17)-rmdir:刪除空目錄
[atguigu@hadoop102 hadoop-2.7.2]\$ hadoop fs -mkdir /test
[atguigu@hadoop102 hadoop-2.7.2]\$ hadoop fs -rmdir /test
(18)-du統(tǒng)計文件夾的大小信息
[atguigu@hadoop102 hadoop-2.7.2]\$ hadoop fs -du -s -h /user/atguigu/test
2.7 K /user/atguigu/test
[atguigu@hadoop102 hadoop-2.7.2]\$ hadoop fs -du -h /user/atguigu/test
1.3 K /user/atguigu/test/README.txt
15 /user/atguigu/test/jinlian.txt
1.4 K /user/atguigu/test/zaiyiqi.txt
(19)-setrep:設(shè)置HDFS中文件的副本數(shù)量
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -setrep 10 /sanguo/shuguo/kongming.txt
面試重點
HDFS讀寫流程
HDFS文件塊大小
image.png
Client 切分
QQ圖片20181228173418.png
1)客戶端通過Distributed FileSystem模塊向NameNode請求上傳文件泌枪,NameNode檢查目標(biāo)文件是否已存在,父目錄是否存在秕岛。
2)NameNode返回是否可以上傳碌燕。
3)客戶端請求第一個 Block上傳到哪幾個DataNode服務(wù)器上。
4)NameNode返回3個DataNode節(jié)點瓣蛀,分別為dn1、dn2雷厂、dn3惋增。
5)客戶端通過FSDataOutputStream模塊請求dn1上傳數(shù)據(jù),dn1收到請求會繼續(xù)調(diào)用dn2改鲫,然后dn2調(diào)用dn3诈皿,將這個通信管道建立完成。
6)dn1像棘、dn2稽亏、dn3逐級應(yīng)答客戶端。
7)客戶端開始往dn1上傳第一個Block(先從磁盤讀取數(shù)據(jù)放到一個本地內(nèi)存緩存)缕题,以Packet為單位截歉,dn1收到一個Packet就會傳給dn2,dn2傳給dn3烟零;dn1每傳一個packet會放入一個應(yīng)答隊列等待應(yīng)答瘪松。
8)當(dāng)一個Block傳輸完成之后,客戶端再次請求NameNode上傳第二個Block的服務(wù)器锨阿。(重復(fù)執(zhí)行3-7步)宵睦。
NN和2NN工作機制
image.png
- 第一階段:NameNode啟動
(1)第一次啟動NameNode格式化后,創(chuàng)建Fsimage和Edits文件墅诡。如果不是第一次啟動壳嚎,直接加載編輯日志和鏡像文件到內(nèi)存。
(2)客戶端對元數(shù)據(jù)進行增刪改的請求末早。
(3)NameNode記錄操作日志烟馅,更新滾動日志。
(4)NameNode在內(nèi)存中對元數(shù)據(jù)進行增刪改然磷。 - 第二階段:Secondary NameNode工作
(1)Secondary NameNode詢問NameNode是否需要CheckPoint焙糟。直接帶回NameNode是否檢查結(jié)果。
(2)Secondary NameNode請求執(zhí)行CheckPoint样屠。
(3)NameNode滾動正在寫的Edits日志穿撮。
(4)將滾動前的編輯日志和鏡像文件拷貝到Secondary NameNode缺脉。
(5)Secondary NameNode加載編輯日志和鏡像文件到內(nèi)存,并合并悦穿。
(6)生成新的鏡像文件fsimage.chkpoint攻礼。
(7)拷貝fsimage.chkpoint到NameNode。
(8)NameNode將fsimage.chkpoint重新命名成fsimage栗柒。
(1)通常情況下礁扮,SecondaryNameNode每隔一小時執(zhí)行一次。
[hdfs-default.xml]
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
</property>
(2)一分鐘檢查一次操作次數(shù)瞬沦,
(3)當(dāng)操作次數(shù)達到1百萬時太伊,SecondaryNameNode執(zhí)行一次。
<property>
<name>dfs.namenode.checkpoint.txns</name>
<value>1000000</value>
<description>操作動作次數(shù)</description>
</property>
<property>
<name>dfs.namenode.checkpoint.check.period</name>
<value>60</value>
<description> 1分鐘檢查一次操作次數(shù)</description>
</property >
集群安全模式
image.png
DataNode工作機制
1)一個數(shù)據(jù)塊在DataNode上以文件形式存儲在磁盤上逛钻,包括兩個文件僚焦,一個是數(shù)據(jù)本身,一個是元數(shù)據(jù)包括數(shù)據(jù)塊的長度曙痘,塊數(shù)據(jù)的校驗和芳悲,以及時間戳。
2)DataNode啟動后向NameNode注冊边坤,通過后名扛,周期性(1小時)的向NameNode上報所有的塊信息。
3)心跳是每3秒一次茧痒,心跳返回結(jié)果帶有NameNode給該DataNode的命令如復(fù)制塊數(shù)據(jù)到另一臺機器肮韧,或刪除某個數(shù)據(jù)塊。如果超過10分鐘沒有收到某個DataNode的心跳旺订,則認(rèn)為該節(jié)點不可用惹苗。
4)集群運行中可以安全加入和退出一些機器。
服役新數(shù)據(jù)節(jié)點
- 環(huán)境準(zhǔn)備
(1)在hadoop104主機上再克隆一臺hadoop105主機
(2)修改IP地址和主機名稱
(3)刪除原來HDFS文件系統(tǒng)留存的文件(/opt/module/hadoop-2.7.2/data和log)
(4)source一下配置文件
[atguigu@hadoop105 hadoop-2.7.2]$ source /etc/profile - 服役新節(jié)點具體步驟
(1)直接啟動DataNode耸峭,即可關(guān)聯(lián)到集群
[atguigu@hadoop105 hadoop-2.7.2]sbin/yarn-daemon.sh start nodemanager
- 如果數(shù)據(jù)不均衡桩蓉,可以用命令實現(xiàn)集群的再平衡
[atguigu@hadoop102 sbin]$ ./start-balancer.sh
starting balancer, logging to /opt/module/hadoop-2.7.2/logs/hadoop-atguigu-balancer-hadoop102.out
Time Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved
退役舊數(shù)據(jù)節(jié)點
添加到白名單的主機節(jié)點,都允許訪問NameNode劳闹,不在白名單的主機節(jié)點院究,都會被退出。
配置白名單的具體步驟如下:
(1)在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目錄下創(chuàng)建dfs.hosts文件
[atguigu@hadoop102 hadoop]$ pwd
/opt/module/hadoop-2.7.2/etc/hadoop
[atguigu@hadoop102 hadoop]$ touch dfs.hosts
[atguigu@hadoop102 hadoop]$ vi dfs.hosts
添加如下主機名稱(不添加hadoop105)
hadoop102
hadoop103
hadoop104
(2)在NameNode的hdfs-site.xml配置文件中增加dfs.hosts屬性
<property>
<name>dfs.hosts</name>
<value>/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts</value>
</property>
(3)配置文件分發(fā)
[atguigu@hadoop102 hadoop]$ xsync hdfs-site.xml
(4)刷新NameNode
[atguigu@hadoop102 hadoop-2.7.2]$ hdfs dfsadmin -refreshNodes
Refresh nodes successful
(5)更新ResourceManager節(jié)點
[atguigu@hadoop102 hadoop-2.7.2]$ yarn rmadmin -refreshNodes
17/06/24 14:17:11 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.1.103:8033
黑名單退役
1.在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目錄下創(chuàng)建dfs.hosts.exclude文件
[atguigu@hadoop102 hadoop]$ pwd
/opt/module/hadoop-2.7.2/etc/hadoop
[atguigu@hadoop102 hadoop]$ touch dfs.hosts.exclude
[atguigu@hadoop102 hadoop]$ vi dfs.hosts.exclude
添加如下主機名稱(要退役的節(jié)點)
hadoop105
2.在NameNode的hdfs-site.xml配置文件中增加dfs.hosts.exclude屬性
<property>
<name>dfs.hosts.exclude</name>
<value>/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts.exclude</value>
</property>
3.刷新NameNode本涕、刷新ResourceManager
[atguigu@hadoop102 hadoop-2.7.2]$ hdfs dfsadmin -refreshNodes
Refresh nodes successful
[atguigu@hadoop102 hadoop-2.7.2]$ yarn rmadmin -refreshNodes
17/06/24 14:55:56 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.1.103:8033
4.檢查Web瀏覽器业汰,退役節(jié)點的狀態(tài)為decommission in progress(退役中),說明數(shù)據(jù)節(jié)點正在復(fù)制塊到其他節(jié)點菩颖,如圖所示
[atguigu@hadoop105 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode
stopping datanode
[atguigu@hadoop105 hadoop-2.7.2]$ sbin/yarn-daemon.sh stop nodemanager
stopping nodemanager
- 如果數(shù)據(jù)不均衡样漆,可以用命令實現(xiàn)集群的再平衡
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/start-balancer.sh
starting balancer, logging to /opt/module/hadoop-2.7.2/logs/hadoop-atguigu-balancer-hadoop102.out
Time Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved
注意:不允許白名單和黑名單中同時出現(xiàn)同一個主機名稱。
Datanode多目錄配置
- DataNode也可以配置成多個目錄晦闰,每個目錄存儲的數(shù)據(jù)不一樣放祟。即:數(shù)據(jù)不是副本
2.具體配置如下
hdfs-site.xml
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///${hadoop.tmp.dir}/dfs/data1,file:///${hadoop.tmp.dir}/dfs/data2</value>
</property>
小文件存檔
3.案例實操
(1)需要啟動YARN進程
[atguigu@hadoop102 hadoop-2.7.2]$ start-yarn.sh
(2)歸檔文件
把/user/atguigu/input目錄里面的所有文件歸檔成一個叫input.har的歸檔文件鳍怨,并把歸檔后文件存儲到/user/atguigu/output路徑下。
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hadoop archive -archiveName input.har –p /user/atguigu/input /user/atguigu/output
(3)查看歸檔
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -lsr /user/atguigu/output/input.har
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -lsr har:///user/atguigu/output/input.har
(4)解歸檔文件
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -cp har:/// user/atguigu/output/input.har/* /user/atguigu