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