網(wǎng)站開發(fā)和app的區(qū)別優(yōu)化大師使用方法
第 1 章:HDFS-故障排除
注意:采用三臺服務(wù)器即可,恢復(fù)到Y(jié)arn開始的服務(wù)器快照。
1.1 集群安全模塊
1、安全模式:文件系統(tǒng)只接收讀數(shù)據(jù)請求,而不接收刪除、修改等變更請求
2、進(jìn)入安全模式場景
1)NameNode在加載鏡像文件和編輯日志期間處于安全模式
2)NameNode再接收DataNode注冊時,處于安全模式
3)退出安全模式條件
dfs.namenode.safemode.min.datanodes:最小可用datanode數(shù)量,默認(rèn)0
dfs.namenode.safemode.threshold-pct:副本數(shù)達(dá)到最小要求的block占系統(tǒng)總block數(shù)的百分比,默認(rèn)0.999f
dfs.namenode.safemode.extension:穩(wěn)定時間,默認(rèn)30000毫秒,即30秒
4)基本語法
集群處于安全模式,不能執(zhí)行重要操作(寫操作)。集群啟動完成后,自動退出安全模式。
(1)bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式狀態(tài))
(2)bin/hdfs dfsadmin -safemode enter (功能描述:進(jìn)入安全模式狀態(tài))
(3)bin/hdfs dfsadmin -safemode leave (功能描述:離開安全模式狀態(tài))
(4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式狀態(tài))
1.2 NameNode故障處理
1、需求:
NameNode進(jìn)程掛了并且存儲的數(shù)據(jù)也丟失了,如何恢復(fù)NameNode
2、故障模擬
1)kill -9 NameNode進(jìn)程
[atguigu@hadoop102 current]$ kill -9 NameNode的進(jìn)程號
2)刪除NameNode存儲的數(shù)據(jù)
[atguigu@hadoop102 hadoop-3.1.3]$ rm -rf /opt/module/hadoop-3.1.3/data/dfs/name/*
3、問題解決
1)拷貝SecondaryNameNode中數(shù)據(jù)到原NameNode存儲數(shù)據(jù)據(jù)目錄
[atguigu@hadoop102 dfs]$ scp -r atguigu@hadoop104:/opt/module/hadoop-3.1.3/data/dfs/namesecondary/* ./name/
2)重新啟動NameNode
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs --daemon start namenode
3)向集群上傳一個文件
1.3 磁盤修復(fù)
案例1:啟動集群進(jìn)入安全模式
1、重新啟動集群
[atguigu@hadoop102 subdir0]$ myhadoop.sh stop
[atguigu@hadoop102 subdir0]$ myhadoop.sh start
2、集群啟動后,立即來到集群上刪除數(shù)據(jù),提示集群處理安全模式
案例2:磁盤修復(fù)
需求:數(shù)據(jù)庫損失,進(jìn)入安全模式,如何處理
1、分別進(jìn)入hadoop102、103、104的/opt/module/hadoop-3.1.3/data/dfs/data/current/BP~/subdir0目錄,統(tǒng)一刪除某2個塊信息
[atguigu@hadoop102 subdir0]$ pwd
/opt/module/hadoop-3.1.3/data/dfs/data/current/BP-1015489500-192.168.10.102-1611909480872/current/finalized/subdir0/subdir0[atguigu@hadoop102 subdir0]$ rm -rf blk_1073741847 blk_1073741847_1023.meta
[atguigu@hadoop102 subdir0]$ rm -rf blk_1073741865 blk_1073741865_1042.meta
說明:hadoop103/hadoop104重復(fù)執(zhí)行以上命令
2、重新啟動集群
[atguigu@hadoop102 subdir0]$ myhadoop.sh stop
[atguigu@hadoop102 subdir0]$ myhadoop.sh start
3、觀察http://hadoop102:9870/dfshealth.html#tab-overview
說明:安全模式已經(jīng)打開,塊的數(shù)量沒有達(dá)到要求
4、離開安全模式
[atguigu@hadoop102 subdir0]$ hdfs dfsadmin -safemode get
Safe mode is ON
[atguigu@hadoop102 subdir0]$ hdfs dfsadmin -safemode leave
Safe mode is OFF
5、觀察http://hadoop102:9870/dfshealth.html#tab-overview
6、將元數(shù)據(jù)刪除
7、觀察http://hadoop102:9870/dfshealth.html#tab-overview,集群已經(jīng)正常
案例3:
需求:模擬等待安全模式
1、查看當(dāng)前模式
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs dfsadmin -safemode get
Safe mode is OFF
2、先進(jìn)入安全模式
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs dfsadmin -safemode enter
3、創(chuàng)建并執(zhí)行下面的腳本
在opt/module/hadoop-3.1.3路徑上,編輯一個腳本safemode.sh
[atguigu@hadoop102 hadoop-3.1.3]$ vim safemode.sh#!/bin/bash
hdfs dfsadmin -safemode wait
hdfs dfs -put /opt/module/hadoop-3.1.3/README.txt /[atguigu@hadoop102 hadoop-3.1.3]$ chmod 777 safemode.sh[atguigu@hadoop102 hadoop-3.1.3]$ ./safemode.sh
4、再打開一個窗口,執(zhí)行
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs dfsadmin -safemode leave
5、再觀察上一個窗口
Safe mode is OFF
6、HDFS集群上已經(jīng)有上傳的數(shù)據(jù)了
第 2 章:HDFS-多目錄
2.1 DataNode多目錄配置
1、DataNode可用配置成多個目錄,每個目錄存儲的數(shù)據(jù)不一樣(數(shù)據(jù)不是副本)
2、具體配置如下:
在hdfs-site.xml文件中添加如下內(nèi)容:
<property><name>dfs.datanode.data.dir</name><value>file://${hadoop.tmp.dir}/dfs/data1,file://${hadoop.tmp.dir}/dfs/data2</value>
</property>
3、查看結(jié)果
[atguigu@hadoop102 dfs]$ ll
總用量 12
drwx------. 3 atguigu atguigu 4096 4月 4 14:22 data1
drwx------. 3 atguigu atguigu 4096 4月 4 14:22 data2
drwxrwxr-x. 3 atguigu atguigu 4096 12月 11 08:03 name1
drwxrwxr-x. 3 atguigu atguigu 4096 12月 11 08:03 name2
4、向集群上傳一個文件,再次觀察兩個文件夾里面的內(nèi)容發(fā)現(xiàn)不一致(一個有數(shù)一個沒數(shù))
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -put wcinput/word.txt /
2.2 集群數(shù)據(jù)均衡之磁盤間數(shù)據(jù)均衡
生產(chǎn)環(huán)境,由于硬盤空間不足,往往需要增加一塊硬盤。剛加載的硬盤沒有數(shù)據(jù)時,可用執(zhí)行磁盤均衡命令。
1、生產(chǎn)均衡計劃(只有一塊磁盤,不會生成計劃)
2、執(zhí)行均衡計劃
hdfs diskbalancer -execute hadoop102.plan.json
3、查看當(dāng)前均衡任務(wù)的執(zhí)行情況
hdfs diskbalancer -query hadoop102
4、取消均衡任務(wù)
hdfs diskbalancer -cancel hadoop102.plan.json
第 3 章:HDFS-集群擴(kuò)容及縮容
3.1 服役新服務(wù)器
1、需求
隨著公司業(yè)務(wù)的增長,數(shù)據(jù)量越來越大,原有的數(shù)據(jù)節(jié)點的容量已經(jīng)不能滿足存儲數(shù)據(jù)的需求,需要在原有集群基礎(chǔ)上動態(tài)添加新的數(shù)據(jù)節(jié)點
2、環(huán)境準(zhǔn)備
1)在hadoop100主機(jī)上再克隆一臺hadoop105主機(jī)
2)修改IP地址和主機(jī)名稱
[root@hadoop105 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@hadoop105 ~]# vim /etc/hostname
3)拷貝hadoop102的/opt/module目錄和/etc/profile.d/my_env.sh到hadoop105
[atguigu@hadoop102 opt]$ scp -r module/* atguigu@hadoop105:/opt/module/[atguigu@hadoop102 opt]$ sudo scp /etc/profile.d/my_env.sh root@hadoop105:/etc/profile.d/my_env.sh[atguigu@hadoop105 hadoop-3.1.3]$ source /etc/profile
4)刪除hadoop105上Hadoop的歷史數(shù)據(jù),data和log數(shù)據(jù)
[atguigu@hadoop105 hadoop-3.1.3]$ rm -rf data/ logs/
5)配置hadoop102和hadoop103到hadoop105的ssh無密登錄
[atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop105
[atguigu@hadoop103 .ssh]$ ssh-copy-id hadoop105
3、服役新節(jié)點具體步驟
1)直接啟動DataNode,即可關(guān)聯(lián)到集群
[atguigu@hadoop105 hadoop-3.1.3]$ hdfs --daemon start datanode
[atguigu@hadoop105 hadoop-3.1.3]$ yarn --daemon start nodemanager
4、在白名單中增加新服役的服務(wù)器
1)在白名單whitelist中增加hadoop104、105,并重啟集群
[atguigu@hadoop102 hadoop]$ vim whitelist
修改如下內(nèi)容:
hadoop102
hadoop103
hadoop104
hadoop105
2)分發(fā)
[atguigu@hadoop102 hadoop]$ xsync whitelist
3)刷新NameNode
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs dfsadmin -refreshNodes
Refresh nodes successful
5、在hadoop105上上傳文件
[atguigu@hadoop105 hadoop-3.1.3]$ hadoop fs -put /opt/module/hadoop-3.1.3/LICENSE.txt /
思考:如果數(shù)據(jù)不均衡(hadoop105數(shù)據(jù)少,其它節(jié)點數(shù)據(jù)多),怎么處理?
3.2 服務(wù)器間數(shù)據(jù)均衡
1、企業(yè)經(jīng)驗:
在企業(yè)開發(fā)中,如果經(jīng)常在hadoop102和hadoop104上提交任務(wù),且副本數(shù)為2,由于數(shù)據(jù)本地性原則,就會導(dǎo)致102和104數(shù)據(jù)過多,103存儲的數(shù)據(jù)量小。
另一種情況,就是新服役的服務(wù)器數(shù)據(jù)量比較少,需要執(zhí)行集群均衡命令。
2、開啟數(shù)據(jù)均衡命令:
[atguigu@hadoop105 hadoop-3.1.3]$ sbin/start-balancer.sh -threshold 10
對于參數(shù)10,代表的是集群中各個節(jié)點的磁盤空間利用率相差不超過10%,可根據(jù)實際情況進(jìn)行調(diào)整。
3、停止數(shù)據(jù)均衡命令
[atguigu@hadoop105 hadoop-3.1.3]$ sbin/stop-balancer.sh
注意:由于HDFS需要啟動單獨的Rebalance Server來執(zhí)行Rebalance操作,所以經(jīng)量不要在NameNode上執(zhí)行start-balancer.sh,而是找一臺比較空閑的機(jī)器。
3.3 添加白名單
白名單:表示在白名單的主機(jī)IP地址可用,用來存儲數(shù)據(jù)。
企業(yè)中:配置白名單,可用盡量防止黑客惡意訪問攻擊。
配置白名單步驟如下:
1、在NameNode節(jié)點的/opt/~/hadoop目錄下創(chuàng)建whitelist和blacklist文件
1)創(chuàng)建白名單
[atguigu@hadoop102 hadoop]$ vim whitelist
在whitelist中添加如下主機(jī)名稱,加入集群正常工作的節(jié)點為102 103
hadoop102
hadoop103
2)創(chuàng)建黑名單
[atguigu@hadoop102 hadoop]$ touch blacklist
保持空的就可用
2、在hdfs-site.xml配置文件中增加dfs.hosts配置參數(shù)
<!-- 白名單 -->
<property><name>dfs.hosts</name><value>/opt/module/hadoop-3.1.3/etc/hadoop/whitelist</value>
</property><!-- 黑名單 -->
<property><name>dfs.hosts.exclude</name><value>/opt/module/hadoop-3.1.3/etc/hadoop/blacklist</value>
</property>
3、分發(fā)配置文件whitelist、hdfs-site.xml
[atguigu@hadoop104 hadoop]$ xsync hdfs-site.xml whitelist
4、第一次添加白名單必須重啟集群,不是第一次,只需要刷新NameNode節(jié)點即可
[atguigu@hadoop102 hadoop-3.1.3]$ myhadoop.sh stop
[atguigu@hadoop102 hadoop-3.1.3]$ myhadoop.sh start
5、在web瀏覽器上查看DN,http://hadoop102:9870/dfshealth.html#tab-datanode
6、二次修改白名單,增加hadoop104
[atguigu@hadoop102 hadoop]$ vim whitelist
修改為如下內(nèi)容
hadoop102
hadoop103
hadoop104
hadoop105
7、刷新NameNode
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs dfsadmin -refreshNodes
Refresh nodes successful
8、在web瀏覽器上查看DN,http://hadoop102:9870/dfshealth.html#tab-datanode
3.4 黑名單退役服務(wù)器
黑名單:表示在黑名單的主機(jī)IP地址不可以,用來存儲數(shù)據(jù)
企業(yè)中:配置黑名單,用來退役服務(wù)器
黑名單配置步驟如下:
1、編輯/opt/module/had~/hadoop目錄下的blacklist文件
[atguigu@hadoop102 hadoop] vim blacklist
添加如下主機(jī)名稱(要退役的節(jié)點)
hadoop105
注意:如果白名單中沒有配置,需要在hdfs-site.xml配置文件中增加dfs.hosts配置參數(shù)
<!-- 黑名單 -->
<property><name>dfs.hosts.exclude</name><value>/opt/module/hadoop-3.1.3/etc/hadoop/blacklist</value>
</property>
2、分發(fā)配置文件blacklist,hdfs-site.xml
[atguigu@hadoop104 hadoop]$ xsync hdfs-site.xml blacklist
3、第一次添加黑名單必須重啟集群,不是第一次,只需要刷新NameNode節(jié)點即可
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs dfsadmin -refreshNodes
Refresh nodes successful
4、檢查Web瀏覽器,退役節(jié)點的狀態(tài)為decommission in progress(退役中),說明數(shù)據(jù)節(jié)點正在復(fù)制塊到其它節(jié)點
5、等待退役節(jié)點狀態(tài)為decommissioned(所有塊已經(jīng)復(fù)制完成),停止該節(jié)點及節(jié)點資源管理器。注意:如果副本數(shù)是3,服役的節(jié)點小于等于3,是不能退役成功的,需要修改副本數(shù)后才能退役
[atguigu@hadoop105 hadoop-3.1.3]$ hdfs --daemon stop datanode
stopping datanode
[atguigu@hadoop105 hadoop-3.1.3]$ yarn --daemon stop nodemanager
stopping nodemanager
6、如果數(shù)據(jù)不均衡,可以用命令實現(xiàn)集群的再平衡
[atguigu@hadoop102 hadoop-3.1.3]$ sbin/start-balancer.sh -threshold 10
第 4 章:Hadoop企業(yè)優(yōu)化
4.1 MapReduce優(yōu)化方法
MapReduce優(yōu)化方法主要從六個方面考慮:數(shù)據(jù)輸入、Map階段、Reduce階段、IO傳輸、數(shù)據(jù)傾斜問題和常用的調(diào)優(yōu)參數(shù)。
4.1.1 數(shù)據(jù)輸入
1、合并小文件:在執(zhí)行MR任務(wù)前將小文件進(jìn)行合并,大量的小文件會產(chǎn)生大量的Map任務(wù),增大Map任務(wù)裝載次數(shù),而任務(wù)的裝載比較耗時,從而導(dǎo)致MR運行較慢。
2、采用CombineTextInputFormat來作為輸入,解決輸入端大量小文件場景。
4.1.2 Map階段
1、減少溢出(Spill)次數(shù):通過調(diào)整mapreduce.task.io.sort.mb及mapreduce.map.sort.spill.percent參數(shù)值,增大觸發(fā)Spill的內(nèi)存上限,減少Spill次數(shù),從而減少IO。
2、減少合并(Merge)次數(shù):通過調(diào)整mapreduce.task.io.sort.factor參數(shù),增大Merge的文件數(shù)目,減少Merge的次數(shù),從而縮短MR處理時間。
3、在Map之后,不影響業(yè)務(wù)邏輯前提下,先進(jìn)行Combine處理,減少I/O。
4.1.3 Reduce階段
1、合理設(shè)置Map和Reduce數(shù):兩個都不能設(shè)置太少,也不能設(shè)置太多。太少,會導(dǎo)致Task等待,延長處理時間;太多,會導(dǎo)致Map、Reduce任務(wù)間競爭資源,造成處理超時等錯誤。
2、設(shè)置Map、Reduce共存:
調(diào)整mapreduce.job.reduce.slowstart.completedmaps參數(shù),使Map運行到一定程度后,Reduce也開始運行,減少Reduce的等待時間。
3、規(guī)避使用Reduce:因為Reduce在用于連接數(shù)據(jù)集的時候?qū)a(chǎn)生大量的網(wǎng)絡(luò)消耗。
4、合理設(shè)置Reduce端的Buffer:默認(rèn)情況下,數(shù)據(jù)達(dá)到一個閾值的時候,Buffer中的數(shù)據(jù)就會寫入磁盤,然后Reduce會從磁盤中獲得所有的數(shù)據(jù)。也就是說,Buffer和Reduce是沒有直接關(guān)聯(lián)的,中間多次寫磁盤-》讀磁盤的過程,既然有這個弊端,那么就可以通過參數(shù)來配置,使得Buffer中的一部分?jǐn)?shù)據(jù)直接輸送到Reducec,從而減少IO開銷:mapreduce.reduce.input.buffer.percent,默認(rèn)為0.0。當(dāng)值大于0的時候,會保留指定比例的內(nèi)存讀Buffer中的數(shù)據(jù)直接拿給Reduce使用。這樣一來,設(shè)置Buffer需要內(nèi)存,讀取數(shù)據(jù)需要內(nèi)存,Reduce計算也要內(nèi)存,所以要根據(jù)作業(yè)的運行情況進(jìn)行調(diào)整。
4.1.4 I/O傳輸
1、采用數(shù)據(jù)壓縮的方式,減少網(wǎng)絡(luò)IO的時間。安裝Snappy和LZO壓縮編碼器。
2、使用SequenceFile二進(jìn)制文件。
4.1.5 數(shù)據(jù)傾斜問題
1、數(shù)據(jù)傾斜現(xiàn)象
數(shù)據(jù)頻率傾斜-某一個區(qū)域的數(shù)據(jù)量要遠(yuǎn)遠(yuǎn)大于其它區(qū)域
數(shù)據(jù)大小傾斜-部分記錄的大小遠(yuǎn)遠(yuǎn)大于平均值
2、減少數(shù)據(jù)傾斜的方法
方法1:抽樣和范圍分區(qū)
可以通過對原始數(shù)據(jù)進(jìn)行抽樣得到的結(jié)果集來預(yù)設(shè)分區(qū)邊界值。
方法2:自定義分區(qū)
基于輸出鍵的背景知識進(jìn)行自定義分區(qū)。例如,如果Map輸出鍵的單詞來源于一本書。且其中某幾個專業(yè)詞匯較多。那么就可以自定義分區(qū)將這些專業(yè)詞匯發(fā)送給固定的一部分Reduce實例。而將其它的都發(fā)送給剩余的Reduce實例。
方法3:Combiner
使用Combiner可以大量地減少數(shù)據(jù)傾斜。在可能地情況下,Combine的目的就是聚合并精簡數(shù)據(jù)。
方法4:采用Map Join,盡量避免Reduce Join。
4.2 常用的調(diào)優(yōu)參數(shù)
1、資源相關(guān)參數(shù)
1)以下參數(shù)是在用戶自己的MR應(yīng)用程序徐中配置就可以生效(mapred-default.xml)
2)應(yīng)該在YARN啟動之前就配置在服務(wù)器的配置文件中才能生效(yarn-default.xml)
3)Shuffle性能優(yōu)化的關(guān)鍵參數(shù),應(yīng)在YARN啟動之前就配置好(mapred-default.xml)
2、容錯相關(guān)參數(shù)(MapReduce性能優(yōu)化)
4.4 Hadoop小文件優(yōu)化方法
4.4.1 Hadoop小文件弊端
HDFS上每個文件都要在NameNode上創(chuàng)建對應(yīng)的元數(shù)據(jù),這個元數(shù)據(jù)的大小約為150byte,這樣當(dāng)小文件比較多的時候,就會產(chǎn)生很多的元數(shù)據(jù)文件,一方面會大量占用NameNode的內(nèi)存空間,另一方面就是元數(shù)據(jù)文件過多,使得尋址索引速度變慢。
小文件過多,在進(jìn)行MR計算時,會生成過多切片,需要啟動過多的MapTask。每個MapTask處理的數(shù)據(jù)量小,導(dǎo)致MapTask的處理時間比啟動時間還小,白白浪費資源。
4.4.2 Hadoop小文件解決方案
1、小文件優(yōu)化的方向:
1)在數(shù)據(jù)采集的時候,就將小文件或小批數(shù)據(jù)合成大文件再上傳HDFS。
2)在業(yè)務(wù)處理之前,在HDFS上使用MapReduce程序?qū)π∥募M(jìn)行合并。
3)在MapReduce處理時,可采用CombineTextInputFormat提高效率。
4)開啟uber模式,實現(xiàn)jvm重用。
2、Hadoop Archive
是一個高效的將小文件放入HDFS塊中的文件存檔工具,能夠?qū)⑿∥募虬梢粋€HAR文件,從而達(dá)到減少NameNode的內(nèi)存使用。
3、CombineTextInputFormat
CombineTextInputFormat用于將多個小文件在切片過程中生成一個單獨的切片或者少量的切片。
4、開啟uber模式,實現(xiàn)JVM重用。
默認(rèn)情況下,每個Task任務(wù)都需要啟動一個JVM來運行,如果Task任務(wù)計算的數(shù)據(jù)量很小,我們可以讓同一個Job的多個Task運行在一個JVM中,不必為每個Task都開啟一個JVM。
開啟uber模式,在mapred-site.xml中添加如下配置:
<!-- 開啟uber模式 -->
<property><name>mapreduce.job.ubertask.enable</name><value>true</value>
</property><!-- uber模式中最大的mapTask數(shù)量,可向下修改 -->
<property><name>mapreduce.job.ubertask.maxmaps</name><value>9</value>
</property>
<!-- uber模式中最大的reduce數(shù)量,可向下修改 -->
<property><name>mapreduce.job.ubertask.maxreduces</name><value>1</value>
</property>
<!-- uber模式中最大的輸入數(shù)據(jù)量,默認(rèn)使用dfs.blocksize 的值,可向下修改 -->
<property><name>mapreduce.job.ubertask.maxbytes</name><value></value>
</property>
第 5 章:Hadoop擴(kuò)展
5.1 集群間數(shù)據(jù)拷貝
1、scp實現(xiàn)兩個遠(yuǎn)程主機(jī)之間的文件復(fù)制
scp -r hello.txt root@hadoop103:/user/atguigu/hello.txt // 推 pushscp -r root@hadoop103:/user/atguigu/hello.txt hello.txt // 拉 pullscp -r root@hadoop103:/user/atguigu/hello.txt root@hadoop104:/user/atguigu //是通過本地主機(jī)中轉(zhuǎn)實現(xiàn)兩個遠(yuǎn)程主機(jī)的文件復(fù)制;如果在兩個遠(yuǎn)程主機(jī)之間ssh沒有配置的情況下可以使用該方式。
2、采用distcp命令實現(xiàn)兩個Hadoop集群之間的遞歸數(shù)據(jù)復(fù)制
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hadoop distcp hdfs://hadoop102:8020/user/atguigu/hello.txt hdfs://hadoop105:8020/user/atguigu/hello.txt
5.2 小文件存檔
1、HDFS存儲小文件弊端
每個文件均按塊存儲,每個塊的元數(shù)據(jù)存儲在NameNode的內(nèi)存中,因此HDFS存儲小文件會非常低效。因為大量的小文件會消耗NameNode中的大部分內(nèi)存。但注意,存儲小文件所需要的磁盤容量和數(shù)據(jù)庫的大小無關(guān)。例如,一個1MB的文件設(shè)置為128MB的塊存儲,實際使用的是1MB的磁盤空間,而不是128MB。
2、解決存儲小文件辦法之一
HDFS存檔文件或HAR文件,是一個更高效的文件存檔工具,它將文件存入HDFS塊,在減少NameNode內(nèi)存使用的同時,允許對文件進(jìn)行透明的訪問。具體來說,HDFS存檔文件對內(nèi)還是一個一個獨立文件,對NameNode而言卻是一個整體,減少了NameNode的內(nèi)存。
1、實例
1)需要啟動YARN進(jìn)程
[atguigu@hadoop102 hadoop-3.1.3]$ start-yarn.sh
2)歸檔文件
把/user/atguigu/input目錄里面的所有文件歸檔成一個交input.har的歸檔文件,并把歸檔后文件存儲到/user/atguigu/output路徑下
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop archive -archiveName input.har -p /user/atguigu/input /user/atguigu/output
3)查看歸檔
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -ls har:///user/atguigu/output/input.har
4)解歸檔文件
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -cp har:/// user/atguigu/output/input.har/* /user/atguigu
5.3 回收站
開啟回收站功能,可以將刪除的文件在不超時的情況下,恢復(fù)原數(shù)據(jù),起到防止誤刪除、備份等作用。
1、回收站參數(shù)設(shè)置及工作機(jī)制
1)開啟回收站功能參數(shù)說明
(1)默認(rèn)值fs.trash.interval=0,0表示禁用回收站;其他值表示設(shè)置文件的存活時間
(2)默認(rèn)值fs.trash.checkpoint.interval=0,檢查回收站的間隔時間。如果該值為0,則該值設(shè)置和fs.trash.interval的參數(shù)值相同。
(3)要求fs.trash.checkpoint.interval<=fs.trash.interval。
2、啟用回收站
修改core-site.xml,配置垃圾回收時間為1分鐘
<property><name>fs.trash.interval</name><value>1</value>
</property>
3、查看回收站
回收站目錄在hdfs集群的路徑:/user/atguigu/.Trash/…
4、通過程序刪除的文件不會經(jīng)過回收站,需要調(diào)用moveToTrash()才進(jìn)入回收站
Configuration conf = new Configuration();
//設(shè)置HDFS的地址
conf.set("fs.defaultFS","hdfs://hadoop102:8020");
//因為本地的客戶端拿不到集群的配置信息 所以需要自己手動設(shè)置一下回收站
conf.set("fs.trash.interval","1");
conf.set("fs.trash.checkpoint.interval","1");
//創(chuàng)建一個回收站對象
Trash trash = new Trash(conf);
//將HDFS上的/input/wc.txt移動到回收站
trash.moveToTrash(new Path("/input/wc.txt"));
5、同故宮網(wǎng)頁上直接刪除的文件也不會走回收站。
6、只有在命令行利用hadoop fs -rm命令刪除的文件才會走回收站
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -rm -r /user/atguigu/input
7、恢復(fù)回收站數(shù)據(jù)
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -mv
/user/atguigu/.Trash/Current/user/atguigu/input /user/atguigu/input