柚子快報(bào)激活碼778899分享:大數(shù)據(jù) Hadoop-HDFS
柚子快報(bào)激活碼778899分享:大數(shù)據(jù) Hadoop-HDFS
資料來源:尚硅谷-Hadoop
一、HDFS 概述
1.1 HDFS 產(chǎn)出背景及定義
1.1.1 HDFS 產(chǎn)生背景
隨著數(shù)據(jù)量越來越大,在一個(gè)服務(wù)器上存不下所有的數(shù)據(jù),那么就分配到更多的服務(wù)器管理的磁盤中,但是不方便管理和維護(hù),迫切需要一種系統(tǒng)來管理多臺(tái)機(jī)器上的文件,這就是分布式文件管理系統(tǒng)。
HDFS 只是分布式文件管理系統(tǒng)中的一種。
1.1.2 HDFS 定義
HDFS(Hadoop Distributed File System),它是一個(gè)文件系統(tǒng),用于存儲(chǔ)文件,通過目錄樹來定位文件;
其次,它是分布式的,由很多服務(wù)器聯(lián)合起來實(shí)現(xiàn)其功能,集群中的服務(wù)器有各自的角色。
HDFS 的使用場景:適合一次寫入,多次讀出的場景。一個(gè)文件經(jīng)過創(chuàng)建、寫入和關(guān)閉之后就不需要改變。
1.2 HDFS 優(yōu)缺點(diǎn)
1.2.1 HDFS優(yōu)點(diǎn)
1)高容錯(cuò)性
數(shù)據(jù)自動(dòng)保存多個(gè)副本。它通過增加副本的形式,提高容錯(cuò)性、可靠性。
某一個(gè)副本丟失以后,它可以自動(dòng)恢復(fù)。
2)適合處理大數(shù)據(jù)
數(shù)據(jù)規(guī)模:能夠處理數(shù)據(jù)規(guī)模達(dá)到GB、TB、甚至PB級別的數(shù)據(jù);文件規(guī)模:能夠處理百萬規(guī)模以上的文件數(shù)量,數(shù)量相當(dāng)之大。
1.2.2 HDFS缺點(diǎn)
1)不適合低延時(shí)數(shù)據(jù)訪問
比如毫秒級的存儲(chǔ)數(shù)據(jù),是做不到的。
2)無法高效的對大量小文件進(jìn)行存儲(chǔ)。
存儲(chǔ)大量小文件的話,它會(huì)占用NameNode大量的內(nèi)存來存儲(chǔ)文件目錄和塊信息。這樣是不可取的,因?yàn)镹ameNode的內(nèi)存總是有限的;小文件存儲(chǔ)的尋址時(shí)間會(huì)超過讀取時(shí)間,它違反了HDFS的設(shè)計(jì)目標(biāo)。
3)不支持并發(fā)寫入、文件隨機(jī)修改
一個(gè)文件只能有一個(gè)寫,不允許多個(gè)線程同時(shí)寫;僅支持?jǐn)?shù)據(jù)append(追加),不支持文件的隨機(jī)修改。
1.3 HDFS 組成架構(gòu)
1)NameNode(nn):就是Master,它是一個(gè)主管、管理者
(1)管理HDFS的名稱空間;
(2)配置副本策略;
(3)管理數(shù)據(jù)塊(Block)映射信息;
(4)處理客戶端讀寫請求。
2)DataNode:就是Slave。NameNode下達(dá)命令,DataNode執(zhí)行實(shí)際的操作
(1)存儲(chǔ)實(shí)際的數(shù)據(jù)塊;
(2)執(zhí)行數(shù)據(jù)塊的讀/寫操作
3)Client:就是客戶端
(1)文件切分。文件上傳HDFS的時(shí)候,Client將文件切分成一個(gè)一個(gè)的Block,然后進(jìn)行上傳;
(2)與NameNode交互,獲取文件的位置信息;
(3)與DataNode交互,讀取或者寫入數(shù)據(jù);
(4)Client提供一些命令來管理HDFS,比如NameNode格式化;
(5)Client可以通過一些命令來訪問HDFS,比如對HDFS增刪查改操作;
4)Secondary NameNode:并非NameNode的熱備。當(dāng)NameNode掛掉的時(shí)候,它并不能馬上替換NameNode并提供服務(wù)。
(1)輔助NameNode,分擔(dān)其工作量,比如定期合并Fsimage和Edits,并推送給NameNode ;
(2)在緊急情況下,可輔助恢復(fù)NameNode。
1.4 HDFS 文件塊大小
HDFS中的文件在物理上是分塊存儲(chǔ)(Block),塊的大小可以通過配置參數(shù)( dfs.blocksize)來規(guī)定。
默認(rèn)大小在Hadoop1.x版本中是64M,2.x/3.x版本中是128M。
dfs.blocksize推薦設(shè)置邏輯:磁盤傳輸速度
如果尋址時(shí)間約為10ms,即查找到目標(biāo)block的時(shí)間為10ms。尋址時(shí)間為傳輸時(shí)間的1%時(shí),則為最佳狀態(tài)。因此,傳輸時(shí)間=10ms/0.01=1000ms=1s目前磁盤的傳輸速率普遍為100MB/sblock大小=1s*100MB/s=100MB
思考:為什么塊的大小不能設(shè)置太小,也不能設(shè)置太大?
(1)HDFS的塊設(shè)置太小,會(huì)增加尋址時(shí)間,程序一直在找塊的開始位置;
(2)如果塊設(shè)置的太大,從磁盤傳輸數(shù)據(jù)的時(shí)間會(huì)明顯大于定位這個(gè)塊開始位置所需的時(shí)間。導(dǎo)致程序在處理這塊數(shù)據(jù)時(shí),會(huì)非常慢。
總結(jié):HDFS塊的大小設(shè)置主要取決于磁盤傳輸速率。
二、HDFS 的 Shell 操作
2.1 基本語法
hadoop fs 具體命令hdfs dfs 具體命令
兩個(gè)是完全相同的。
2.2 命令大全
[xiang@hadoop102 hadoop-3.3.6]$ hadoop fs
Usage: hadoop fs [generic options]
[-appendToFile [-n]
[-cat [-ignoreCrc]
[-checksum [-v]
[-chgrp [-R] GROUP PATH...]
[-chmod [-R]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-concat
[-copyFromLocal [-f] [-p] [-l] [-d] [-t
[-copyToLocal [-f] [-p] [-crc] [-ignoreCrc] [-t
[-count [-q] [-h] [-v] [-t [
[-cp [-f] [-p | -p[topax]] [-d] [-t
[-createSnapshot
[-deleteSnapshot
[-df [-h] [
[-du [-s] [-h] [-v] [-x]
[-expunge [-immediate] [-fs
[-find
[-get [-f] [-p] [-crc] [-ignoreCrc] [-t
[-getfacl [-R]
[-getfattr [-R] {-n name | -d} [-e en]
[-getmerge [-nl] [-skip-empty-file]
[-head
[-help [cmd ...]]
[-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] [
[-mkdir [-p]
[-moveFromLocal [-f] [-p] [-l] [-d]
[-moveToLocal
[-mv
[-put [-f] [-p] [-l] [-d] [-t
[-renameSnapshot
[-rm [-f] [-r|-R] [-skipTrash] [-safely]
[-rmdir [--ignore-fail-on-non-empty]
[-setfacl [-R] [{-b|-k} {-m|-x
[-setfattr {-n name [-v value] | -x name}
[-setrep [-R] [-w]
[-stat [format]
[-tail [-f] [-s
[-test -[defswrz]
[-text [-ignoreCrc]
[-touch [-a] [-m] [-t TIMESTAMP (yyyyMMdd:HHmmss) ] [-c]
[-touchz
[-truncate [-w]
[-usage [cmd ...]]
Generic options supported are:
-conf
-D
-fs
-jt
-files
-libjars
-archives
The general command line syntax is:
command [genericOptions] [commandOptions]
2.3 常用命令實(shí)操
2.3.1 準(zhǔn)備工作
1)啟動(dòng) Hadoop 集群
sbin/start-dfs.sh
sbin/start-yarn.sh
2)-help:查看命令幫助
hadoop fs -help rm
3)創(chuàng)建/sanguo 文件夾
hadoop fs -mkdir /sanguo
2.3.2 上傳
1)-moveFromLocal:從本地剪切粘貼到 HDFS
vi shuguo.txt
shuguo
hadoop fs -moveFromLocal ./shuguo.txt /sanguo
2)-copyFromLocal:從本地文件系統(tǒng)中拷貝文件到 HDFS 路徑去
vi weiguo.txt
weiguo
hadoop fs -copyFromLocal weiguo.txt/sanguo\
3)-put:等同于 copyFromLocal,生產(chǎn)環(huán)境更習(xí)慣用 put
vi wuguo.tx
wuguo
hadoop fs -put wuguo.txt /sanguo
4)-appendToFile:追加一個(gè)文件到已經(jīng)存在的文件末尾
vi liubei.txt
liubei
hadoop fs -appendToFile liubei.txt /sanguo/shuguo.txt
2.3.3 下載
1)-copyToLocal:從 HDFS 拷貝到本地
hadoop fs -copyToLocal /sanguo/shuguo.txt ./
2)-get:等同于 copyToLocal,生產(chǎn)環(huán)境更習(xí)慣用 get
hadoop fs -get /sanguo/shuguo.txt ./
2.3.4 HDFS 直接操作
1)-ls: 顯示目錄信息
hadoop fs -ls /sanguo
2)-cat:顯示文件內(nèi)容
hadoop fs -cat /sanguo/shuguo.txt
3)-chgrp、-chmod、-chown:Linux 文件系統(tǒng)中的用法一樣,修改文件所屬權(quán)限
hadoop fs -chmod 666 /sanguo/shuguo.tx
hadoop fs -chown xiang:xiang /sanguo/shuguo.txt
4)-mkdir:創(chuàng)建路徑
hadoop fs -mkdir /jinguo
5)-cp:從 HDFS 的一個(gè)路徑拷貝到 HDFS 的另一個(gè)路徑
hadoop fs -cp /sanguo/shuguo.txt /jinguo
6)-mv:在 HDFS 目錄中移動(dòng)文件
hadoop fs -mv /sanguo/wuguo.txt /jinguo
hadoop fs -mv /sanguo/weiguo.txt /jinguo
7)-tail:顯示一個(gè)文件的末尾 1kb 的數(shù)據(jù)
hadoop fs -tail /jinguo/shuguo.txt
8)-rm:刪除文件或文件夾
hadoop fs -rm /sanguo/shuguo.txt
9)-rm -r:遞歸刪除目錄及目錄里面內(nèi)容
hadoop fs -rm -r /sanguo
10)-du 統(tǒng)計(jì)文件夾的大小信息
hadoop fs -du -s -h /jinguo
27 表示文件大?。?1 表示 27*3 個(gè)副本/jinguo 表示查看的目錄
11)-setrep:設(shè)置 HDFS 中文件的副本數(shù)量
hadoop fs -setrep 10 /jinguo/shuguo.txt
這里設(shè)置的副本數(shù)只是記錄在NameNode的元數(shù)據(jù)中,是否真的會(huì)有這么多副本,還得看DataNode的數(shù)量。
因?yàn)槟壳爸挥?臺(tái)設(shè)備,最多也就3個(gè)副本,只有節(jié)點(diǎn)數(shù)的增加到10臺(tái)時(shí),副本數(shù)才能達(dá)到10。
三、HDFS 的 API 操作
3.1 客戶端環(huán)境準(zhǔn)備
1)下載winutils工具包:GitCode - 開發(fā)者的代碼家園
2)配置 HADOOP_HOME 環(huán)境變量
3)配置 Path 環(huán)境變量。
注意:如果環(huán)境變量不起作用,可以重啟電腦試試。驗(yàn)證 Hadoop 環(huán)境變量是否正常。
雙擊 winutils.exe,加載windows所需工具。
4)在 IDEA 中創(chuàng)建一個(gè) Maven 工程 HdfsClientDemo,并導(dǎo)入相應(yīng)的依賴坐標(biāo)+日志添加
在項(xiàng)目的 src/main/resources 目錄下,新建一個(gè)文件,命名為“l(fā)og4j.properties”,在文件中填入
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
5)創(chuàng)建包名:com.xiang.hdfs
6)創(chuàng)建 HdfsClient 類
public class HdfsClient {
@Test
public void testMkdirs() throws IOException, URISyntaxException, InterruptedException {
// 1 獲取文件系統(tǒng)
Configuration configuration = new Configuration();
// FileSystem fs = FileSystem.get(new
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration, "xiang");
// 2 創(chuàng)建目錄
fs.mkdirs(new Path("/xiyou/huaguoshan/"));
// 3 關(guān)閉資源
fs.close();
}
}
7)執(zhí)行程序
客戶端去操作 HDFS 時(shí),是有一個(gè)用戶身份的。默認(rèn)情況下,HDFS 客戶端 API 會(huì)從采用 Windows 默認(rèn)用戶訪問 HDFS,會(huì)報(bào)權(quán)限異常錯(cuò)誤。所以在訪問 HDFS 時(shí),一定要配置用戶。
3.2 HDFS 的 API 案例實(shí)操
3.2.1 HDFS 文件上傳(測試參數(shù)優(yōu)先級)
1)編寫源代碼
@Test
public void testCopyFromLocalFile() throws IOException, InterruptedException, URISyntaxException {
// 1 獲取文件系統(tǒng)
Configuration configuration = new Configuration();
configuration.set("dfs.replication", "2");
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration, "xiang");
// 2 上傳文件
fs.copyFromLocalFile(new Path("L:\\hadoop\\sunwukong.txt"), new Path("/xiyou/huaguoshan"));
// 3 關(guān)閉資源
fs.close();
}
2)將 hdfs-site.xml 拷貝到項(xiàng)目的 resources 資源目錄下
3)參數(shù)優(yōu)先級
參數(shù)優(yōu)先級排序:(1)客戶端代碼中設(shè)置的值 >(2)ClassPath 下的用戶自定義配置文件 >(3)然后是服務(wù)器的自定義配置(xxx-site.xml)>(4)服務(wù)器的默認(rèn)配置(xxx-default.xml)
3.2.2 HDFS 文件下載
@Test
public void testCopyToLocalFile() throws IOException,
InterruptedException, URISyntaxException{
// 1 獲取文件系統(tǒng)
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration, "xiang");
// 2 執(zhí)行下載操作
// boolean delSrc 指是否將原文件刪除
// Path src 指要下載的文件路徑
// Path dst 指將文件下載到的路徑
// boolean useRawLocalFileSystem 是否開啟文件校驗(yàn)
fs.copyToLocalFile(false, new Path("/xiyou/huaguoshan/sunwukong.txt"), new Path("L:\\hadoop\\sunwukong2.txt"), true);
// 3 關(guān)閉資源
fs.close();
}
3.2.3 HDFS 文件更名和移動(dòng)
@Test
public void testRename() throws IOException, InterruptedException, URISyntaxException {
// 1 獲取文件系統(tǒng)
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration, "atguigu");
// 2 修改文件名稱
fs.rename(new Path("/xiyou/huaguoshan/sunwukong.txt"), new Path("/xiyou/huaguoshan/meihouwang.txt"));
// 3 關(guān)閉資源
fs.close();
}
3.2.4 HDFS 刪除文件和目錄
@Test
public void testDelete() throws IOException, InterruptedException, URISyntaxException{
// 1 獲取文件系統(tǒng)
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration, "xiang");
// 2 執(zhí)行刪除
fs.delete(new Path("/xiyou"), true);
// 3 關(guān)閉資源
fs.close();
}
3.2.5 HDFS 文件詳情查看
查看文件名稱、權(quán)限、長度、塊信息
@Test
public void testListFiles() throws IOException, InterruptedException, URISyntaxException {
// 1 獲取文件系統(tǒng)
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration, "xiang");
// 2 獲取文件詳情
RemoteIterator
while (listFiles.hasNext()) {
LocatedFileStatus fileStatus = listFiles.next();
System.out.println("========" + fileStatus.getPath() + "=========");
System.out.println(fileStatus.getPermission());
System.out.println(fileStatus.getOwner());
System.out.println(fileStatus.getGroup());
System.out.println(fileStatus.getLen());
System.out.println(fileStatus.getModificationTime());
System.out.println(fileStatus.getReplication());
System.out.println(fileStatus.getBlockSize());
System.out.println(fileStatus.getPath().getName());
// 獲取塊信息
BlockLocation[] blockLocations = fileStatus.getBlockLocations();
System.out.println(Arrays.toString(blockLocations));
}
// 3 關(guān)閉資源
fs.close();
}
3.2.6 HDFS 文件和文件夾判斷
@Test
public void testListStatus() throws IOException, InterruptedException, URISyntaxException {
// 1 獲取文件配置信息
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration, "xiang");
// 2 判斷是文件還是文件夾
FileStatus[] listStatus = fs.listStatus(new Path("/"));
for (FileStatus fileStatus : listStatus) {
// 如果是文件
if (fileStatus.isFile()) {
System.out.println("f:" + fileStatus.getPath().getName());
} else {
System.out.println("d:" + fileStatus.getPath().getName());
}
}
// 3 關(guān)閉資源
fs.close();
}
四、HDFS 的讀寫流程
4.1 HDFS 寫數(shù)據(jù)流程
4.1.1 剖析文件寫入
HDFS的寫數(shù)據(jù)流程
客戶端通過 Distributed FileSystem 模塊向 NameNode 請求上傳文件,NameNode 檢查目標(biāo)文件是否已存在,父目錄是否存在。NameNode 返回是否可以上傳??蛻舳苏埱蟮谝粋€(gè) Block 上傳到哪幾個(gè) DataNode 服務(wù)器上。NameNode 返回 3 個(gè) DataNode 節(jié)點(diǎn),分別為 dn1、dn2、dn3??蛻舳送ㄟ^ FSDataOutputStream 模塊請求 dn1 上傳數(shù)據(jù),dn1 收到請求會(huì)繼續(xù)調(diào)用dn2,然后 dn2 調(diào)用 dn3,將這個(gè)通信管道建立完成。dn1、dn2、dn3 逐級應(yīng)答客戶端??蛻舳碎_始往 dn1 上傳第一個(gè) Block(先從磁盤讀取數(shù)據(jù)放到一個(gè)本地內(nèi)存緩存),以 Packet 為單位,dn1 收到一個(gè) Packet 就會(huì)傳給 dn2,dn2 傳給 dn3;dn1 每傳一個(gè) packet會(huì)放入一個(gè)應(yīng)答隊(duì)列等待應(yīng)答。當(dāng)一個(gè) Block 傳輸完成之后,客戶端再次請求 NameNode 上傳第二個(gè) Block 的服務(wù)器。(重復(fù)執(zhí)行 3-7 步)。
4.1.2 網(wǎng)絡(luò)拓?fù)?節(jié)點(diǎn)距離計(jì)算
在 HDFS 寫數(shù)據(jù)的過程中,NameNode會(huì)選擇距離待上傳數(shù)據(jù)最近距離的 DataNode 接收數(shù)據(jù)。那么這個(gè)最近距離怎么計(jì)算呢?
節(jié)點(diǎn)距離:兩個(gè)節(jié)點(diǎn)到達(dá)最近的共同祖先的距離總和。
網(wǎng)絡(luò)拓?fù)?節(jié)點(diǎn)距離計(jì)算
4.1.3 機(jī)架感知(副本存儲(chǔ)節(jié)點(diǎn)選擇)
機(jī)架感知說明
Apache Hadoop 3.3.6 – HDFS Architecture
For the common case, when the replication factor is three, HDFS’s placement policy is to put one replica on the local machine if the writer is on a datanode, otherwise on a random datanode in the same rack as that of the writer, another replica on a node in a different (remote) rack, and the last on a different node in the same remote rack. This policy cuts the inter-rack write traffic which generally improves write performance. The chance of rack failure is far less than that of node failure; this policy does not impact data reliability and availability guarantees. However, it does not reduce the aggregate network bandwidth used when reading data since a block is placed in only two unique racks rather than three. With this policy, the replicas of a block do not evenly distribute across the racks. Two replicas are on different nodes of one rack and the remaining replica is on a node of one of the other racks. This policy improves write performance without compromising data reliability or read performance.
副本節(jié)點(diǎn)選擇,即:
第一個(gè)副本在Client所處的節(jié)點(diǎn)上。如果客戶端在集群外,隨機(jī)選一個(gè)。
第二個(gè)副本在另一個(gè)機(jī)架的隨機(jī)一個(gè)節(jié)點(diǎn)。
第三個(gè)副本在第二個(gè)副本所在機(jī)架的隨機(jī)節(jié)點(diǎn)
4.2 HDFS 讀數(shù)據(jù)流程
客戶端通過 DistributedFileSystem 向 NameNode 請求下載文件,NameNode 通過查詢元數(shù)據(jù),找到文件塊所在的 DataNode 地址。挑選一臺(tái) DataNode(就近原則,然后隨機(jī))服務(wù)器,請求讀取數(shù)據(jù)。DataNode 開始傳輸數(shù)據(jù)給客戶端(從磁盤里面讀取數(shù)據(jù)輸入流,以Packet為單位來做校驗(yàn))??蛻舳艘訮acket為單位接收,先在本地緩存,然后寫入目標(biāo)文件。
五、NameNode 和 SecondaryNameNode
5.1 NN 和 2NN 工作機(jī)制
思考:NameNode 中的元數(shù)據(jù)是存儲(chǔ)在哪里的?
一、如果存儲(chǔ)在 NameNode 節(jié)點(diǎn)的磁盤中,因?yàn)榻?jīng)常需要進(jìn)行隨機(jī)訪問,還有響應(yīng)客戶請求,必然是效率過低。
因此,元數(shù)據(jù)需要存放在內(nèi)存中。
二、但如果只存在內(nèi)存中,一旦斷電,元數(shù)據(jù)丟失,整個(gè)集群就無法工作了。
因此產(chǎn)生在磁盤中備份元數(shù)據(jù)的FsImage。
三、當(dāng)在內(nèi)存中的元數(shù)據(jù)更新時(shí),如果同時(shí)更新 FsImage,就會(huì)導(dǎo)致效率過低,但如果不更新,就會(huì)發(fā)生一致性問題,一旦 NameNode 節(jié)點(diǎn)斷電,就會(huì)產(chǎn)生數(shù)據(jù)丟失。
因此,引入 Edits 文件(只進(jìn)行追加操作,效率很高)。每當(dāng)元數(shù)據(jù)有更新或者添加元數(shù)據(jù)時(shí),修改內(nèi)存中的元數(shù)據(jù)并追加到 Edits 中。一旦 NameNode 節(jié)點(diǎn)斷電,可以通過 FsImage 和 Edits 的合并,合成元數(shù)據(jù)。
四、但如果長時(shí)間添加數(shù)據(jù)到 Edits 中,會(huì)導(dǎo)致該文件數(shù)據(jù)過大,效率降低,而且一旦斷電,恢復(fù)元數(shù)據(jù)需要的時(shí)間過長。
因此,需要定期進(jìn)行 FsImage 和 Edits 的合并
五、如果這個(gè)操作由NameNode節(jié)點(diǎn)完成,又會(huì)效率過低。
因此,引入一個(gè)新的節(jié)點(diǎn)SecondaryNamenode,專門用于 FsImage 和 Edits 的合并
1)第一階段:NameNode 啟動(dòng)
(1)第一次啟動(dòng) NameNode 格式化后,創(chuàng)建 Fsimage 和 Edits 文件。如果不是第一次啟 動(dòng),直接加載編輯日志和鏡像文件到內(nèi)存。
(2)客戶端對元數(shù)據(jù)進(jìn)行增刪改的請求。
(3)NameNode 記錄操作日志,更新滾動(dòng)日志。
(4)NameNode 在內(nèi)存中對元數(shù)據(jù)進(jìn)行增刪改。
2)第二階段:Secondary NameNode 工作
(1)Secondary NameNode 詢問 NameNode 是否需要 CheckPoint。直接帶回 NameNode是否檢查結(jié)果。
(2)Secondary NameNode 請求執(zhí)行 CheckPoint。
(3)NameNode 滾動(dòng)正在寫的 Edits 日志。
(4)將滾動(dòng)前的編輯日志和鏡像文件拷貝到 Secondary NameNode。
(5)Secondary NameNode 加載編輯日志和鏡像文件到內(nèi)存,并合并。
(6)生成新的鏡像文件 fsimage.chkpoint。
(7)拷貝 fsimage.chkpoint 到 NameNode。
(8)NameNode 將 fsimage.chkpoint 重新命名成 fsimage。
5.2 Fsimage 和 Edits 解析
NameNode被格式化之后,將在/opt/module/hadoop-3.3.6/data/dfs/name/current目錄中產(chǎn)生如下文件
fsimage_0000000000000000000fsimage_0000000000000000000.md5seen_txidVERSION
Fsimage文件:HDFS文件系統(tǒng)元數(shù)據(jù)的一個(gè)永久性的檢查點(diǎn),其中包含HDFS文件系統(tǒng)的所有目錄和文件inode的序列化信息。Edits文件:存放HDFS文件系統(tǒng)的所有更新操作的路徑,文件系統(tǒng)客戶端執(zhí)行的所有寫操作首先會(huì)被記錄到Edits文件中。seen_txid文件:保存的是一個(gè)數(shù)字,就是最后一個(gè)edits_的數(shù)字每次NameNode啟動(dòng)的時(shí)候都會(huì)將Fsimage文件讀入內(nèi)存,加載Edits里面的更新操作,保證內(nèi)存中的元數(shù)據(jù)信息是最新的、同步的,可以看成NameNode啟動(dòng)的時(shí)候就將Fsimage和Edits文件進(jìn)行了合并。
5.2.1 oiv 查看 Fsimage 文件
(1)查看 oiv 和 oev 命令
hdfs
oiv apply the offline fsimage viewer to an fsimage
oev apply the offline edits viewer to an edits file
(2)基本語法
hdfs oiv -p 文件類型 -i 鏡像文件 -o 轉(zhuǎn)換后文件輸出路徑
(3)案例實(shí)操
cd /opt/module/hadoop-3.3.6/data/dfs/name/current
hdfs oiv -p XML -i fsimage_0000000000000000189 -o /opt/module/fsimage.xml
fsimage.xml部分顯示結(jié)果如下:
思考:可以看出,F(xiàn)simage 中沒有記錄塊所對應(yīng) DataNode,為什么?
在集群啟動(dòng)后,要求 DataNode 上報(bào)數(shù)據(jù)塊信息,并間隔一段時(shí)間后再次上報(bào)。
5.2.2 oev 查看 Edits 文件
(1)基本語法
hdfs oev -p 文件類型 -i 編輯日志 -o 轉(zhuǎn)換后文件輸出路徑
(2)案例實(shí)操
cd /opt/module/hadoop-3.3.6/data/dfs/name/current
hdfs oev -p XML -i edits_0000000000000000190-0000000000000000214 -o /opt/module/edits.xml
edits.xml部分顯示結(jié)果如下:
5.3 CheckPoint 時(shí)間設(shè)置
1)通常情況下,SecondaryNameNode 每隔一小時(shí)執(zhí)行一次。
[hdfs-default.xml]
2)一分鐘檢查一次操作次數(shù),當(dāng)操作次數(shù)達(dá)到 1 百萬時(shí),SecondaryNameNode 執(zhí)行一次。
六、 DataNode
6.1 DataNode 工作機(jī)制
(1)一個(gè)數(shù)據(jù)塊在 DataNode 上以文件形式存儲(chǔ)在磁盤上,包括兩個(gè)文件,一個(gè)是數(shù)據(jù)本身,一個(gè)是元數(shù)據(jù)包括數(shù)據(jù)塊的長度,塊數(shù)據(jù)的校驗(yàn)和,以及時(shí)間戳。
(2)DataNode 啟動(dòng)后向 NameNode 注冊,通過后,周期性(6 小時(shí))的向 NameNode 上報(bào)所有的塊信息。
DN 向 NN 匯報(bào)當(dāng)前解讀信息的時(shí)間間隔,默認(rèn) 6 小時(shí);
milliseconds.
DN 掃描自己節(jié)點(diǎn)塊信息列表的時(shí)間,默認(rèn) 6 小時(shí)
(3)心跳是每 3 秒一次,心跳返回結(jié)果帶有 NameNode 給該 DataNode 的命令如復(fù)制塊數(shù)據(jù)到另一臺(tái)機(jī)器,或刪除某個(gè)數(shù)據(jù)塊。如果超過 10 分鐘沒有收到某個(gè) DataNode 的心跳,則認(rèn)為該節(jié)點(diǎn)不可用。
(4)集群運(yùn)行中可以安全加入和退出一些機(jī)器。
6.2 數(shù)據(jù)完整性
思考:如果電腦磁盤里面存儲(chǔ)的數(shù)據(jù)是控制高鐵信號(hào)燈的紅燈信號(hào)(1)和綠燈信號(hào)(0),但是存儲(chǔ)該數(shù)據(jù)的磁盤壞了,一直顯示是綠燈,是否很危險(xiǎn)?
同理 DataNode 節(jié)點(diǎn)上的數(shù)據(jù)損壞了,卻沒有發(fā)現(xiàn),是否也很危險(xiǎn),那么如何解決呢?
如下是 DataNode 節(jié)點(diǎn)保證數(shù)據(jù)完整性的方法。
當(dāng) DataNode 讀取 Block 的時(shí)候,它會(huì)計(jì)算 CheckSum。如果計(jì)算后的 CheckSum,與 Block 創(chuàng)建時(shí)值不一樣,說明 Block 已經(jīng)損壞。Client 讀取其他 DataNode 上的 Block。常見的校驗(yàn)算法 crc(32),md5(128),sha1(160)DataNode 在其文件創(chuàng)建后周期驗(yàn)證 CheckSum。
6.3 掉線時(shí)限參數(shù)設(shè)置
DataNode進(jìn)程死亡或者網(wǎng)絡(luò)故障造成DataNode無法與NameNode通信NameNode不會(huì)立即把該節(jié)點(diǎn)判定為死亡,要經(jīng)過一段時(shí)間,這段時(shí)間暫稱作超時(shí)時(shí)長。HDFS默認(rèn)的超時(shí)時(shí)長為10分鐘+30秒。如果定義超時(shí)時(shí)間為TimeOut,則超時(shí)時(shí)長的計(jì)算公式為:TimeOut = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval。而默認(rèn)的dfs.namenode.heartbeat.recheck-interval 大小為5分鐘,dfs.heartbeat.interval默認(rèn)為3秒。
需要注意的是 hdfs-site.xml 配置文件中的 heartbeat.recheck.interval 的單位為毫秒,dfs.heartbeat.interval 的單位為秒。
柚子快報(bào)激活碼778899分享:大數(shù)據(jù) Hadoop-HDFS
推薦閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。