欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報(bào)激活碼778899分享:大數(shù)據(jù) Hadoop-HDFS

柚子快報(bào)激活碼778899分享:大數(shù)據(jù) Hadoop-HDFS

http://yzkb.51969.com/

資料來源:尚硅谷-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] PATH...]

[-chown [-R] [OWNER][:[GROUP]] PATH...]

[-concat ...]

[-copyFromLocal [-f] [-p] [-l] [-d] [-t ] [-q ] ... ]

[-copyToLocal [-f] [-p] [-crc] [-ignoreCrc] [-t ] [-q ] ... ]

[-count [-q] [-h] [-v] [-t []] [-u] [-x] [-e] [-s] ...]

[-cp [-f] [-p | -p[topax]] [-d] [-t ] [-q ] ... ]

[-createSnapshot []]

[-deleteSnapshot ]

[-df [-h] [ ...]]

[-du [-s] [-h] [-v] [-x] ...]

[-expunge [-immediate] [-fs ]]

[-find ... ...]

[-get [-f] [-p] [-crc] [-ignoreCrc] [-t ] [-q ] ... ]

[-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 ] [-q ] ... ]

[-renameSnapshot ]

[-rm [-f] [-r|-R] [-skipTrash] [-safely] ...]

[-rmdir [--ignore-fail-on-non-empty]

...]

[-setfacl [-R] [{-b|-k} {-m|-x } ]|[--set ]]

[-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 specify an application configuration file

-D define a value for a given property

-fs specify default filesystem URL to use, overrides 'fs.defaultFS' property from configurations.

-jt specify a ResourceManager

-files specify a comma-separated list of files to be copied to the map reduce cluster

-libjars specify a comma-separated list of jar files to be included in the classpath

-archives specify a comma-separated list of archives to be unarchived on the compute machines

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)+日志添加

org.apache.hadoop

hadoop-client

3.1.3

junit

junit

4.12

org.slf4j

slf4j-log4j12

1.7.30

在項(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 資源目錄下

dfs.replication

1

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 listFiles = fs.listFiles(new Path("/"), true);

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é)果如下:

16433

FILE

wuguo.txt

3

1708012591072

1708012590924

134217728

xiang:supergroup:0644

1073741841

1017

6

0

16434

DIRECTORY

jinguo

1708013296242

xiang:supergroup:0755

-1

-1

16435

FILE

shuguo.txt

10

1708013255711

1708013255570

134217728

xiang:supergroup:0644

1073741842

1019

14

0

思考:可以看出,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é)果如下:

OP_ALLOCATE_BLOCK_ID

194

1073741843

OP_SET_GENSTAMP_V2

195

1020

OP_ADD_BLOCK

196

/xiyou/huaguoshan/sunwukong.txt

1073741843

0

1020

-2

OP_ADD

197

0

16439

/xiyou/huaguoshan/sunwukong.txt

2

1708017510113

1708017510113

134217728

DFSClient_NONMAPREDUCE_657804169_1

192.168.10.1

true

xiang

supergroup

420

0

675e9ac2-6365-43b3-a923-c6e4a8a316fb

2

5.3 CheckPoint 時(shí)間設(shè)置

1)通常情況下,SecondaryNameNode 每隔一小時(shí)執(zhí)行一次。

[hdfs-default.xml]

dfs.namenode.checkpoint.period

3600s

2)一分鐘檢查一次操作次數(shù),當(dāng)操作次數(shù)達(dá)到 1 百萬時(shí),SecondaryNameNode 執(zhí)行一次。

dfs.namenode.checkpoint.txns

1000000

操作動(dòng)作次數(shù)

dfs.namenode.checkpoint.check.period

60s

1 分鐘檢查一次操作次數(shù)

六、 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í);

dfs.blockreport.intervalMsec

21600000

Determines block reporting interval in

milliseconds.

DN 掃描自己節(jié)點(diǎn)塊信息列表的時(shí)間,默認(rèn) 6 小時(shí)

dfs.datanode.directoryscan.interval

21600s

Interval in seconds for Datanode to scan data directories and reconcile the difference between blocks in memory and on the disk. Support multiple time unit suffix(case insensitive), as described in dfs.heartbeat.interval.

(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 的單位為秒。

dfs.namenode.heartbeat.recheck-interval

300000

dfs.heartbeat.interval

3

柚子快報(bào)激活碼778899分享:大數(shù)據(jù) Hadoop-HDFS

http://yzkb.51969.com/

推薦閱讀

評論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。

轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19210745.html

發(fā)布評論

您暫未設(shè)置收款碼

請?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問

文章目錄