日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

03.Hadoop之HDFS

發布時間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 03.Hadoop之HDFS 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第1章 HDFS概述

1.1 HDFS產出背景及定義

1)HDFS產生背景

隨著數據量越來越大,在一個操作系統存不下所有的數據,那么就分配到更多的操作系統管理的磁盤中,但是不方便管理和維護,迫切需要一種系統來管理多臺機器上的文件,這就是分布式文件管理系統。HDFS只是分布式文件管理系統中的一種。

2)HDFS定義

HDFS(Hadoop Distributed File System),它是一個文件系統,用于存儲文件,通過目錄樹來定位文件;其次,它是分布式的,由很多服務器聯合起來實現其功能,集群中的服務器有各自的角色。
HDFS的使用場景:適合一次寫入,多次讀出的場景。一個文件經過創建、寫入和關閉之后就不需要改變。

1.2 HDFS優缺點

1.2.1 優點:

1)高容錯性

數據自動保存多個副本。它通過增加副本的形式,提高容錯性。


2)適合處理大數據

數據規模:能夠處理數據規模達到GB、TB、甚至PB級別的數據;
文件規模:能夠處理百萬規模以上的文件數量,數量相當之大。

3)可構建在廉價機器上,通過多副本機制,提高可靠性。

1.2.2 缺點:

1)不適合低延時數據訪問,比如毫秒級的存儲數據,是做不到的。
2)無法高效的對大量小文件進行存儲。

存儲大量小文件的話,它會占用NameNode大量的內存來存儲文件目錄和塊信息。這樣是不可取的,因為NameNode的內存總是有限的;
小文件存儲的尋址時間會超過讀取時間,它違反了HDFS的設計目標。

3)不支持并發寫入、文件隨機修改。

一個文件只能有一個寫,不允許多個線程同時寫;
僅支持數據append(追加),不支持文件的隨機修改。

1.3 HDFS組成架構


1)NameNode(nn):就是Master,它是一個主管、管理者。
(1)管理HDFS的名稱空間;
(2)配置副本策略;
(3)管理數據塊(Block)映射信息;
(4)處理客戶端讀寫請求。
2)DataNode:就是Slave。NameNode下達命令,DataNode執行實際的操作。
(1)存儲實際的數據塊;
(2)執行數據塊的讀/寫操作。
3)Client:就是客戶端。
(1)文件切分。文件上傳HDFS的時候,Client將文件切分成一個一個的Block,然后進行上傳;
(2)與NameNode交互,獲取文件的位置信息;
(3)與DataNode交互,讀取或者寫入數據;
(4)Client提供一些命令來管理HDFS,比如NameNode格式化;
(5)Client可以通過一些命令來訪問HDFS,比如對HDFS增刪查改操作;
4)Secondary NameNode:并非NameNode]熱備。當NameNode掛掉的時候,它并不能馬上替換NameNode并提供服務。
(1)輔助NameNode,分擔其工作量,比如定期合并Fsimage和Edits,并推送給NamelNode;
(2)在緊急情兄下,可輔助恢復NameNode。

1.4 HDFS文件塊大小(面試重點)

HDFS中的文件在物理上是分塊存儲(Block),塊的大小可以通過配置參數(dfs.blocksize)來規定,默認大小在Hadoop2.x/3.x版本中是128M,1.x版本中是64M。

思考:為什么塊的大小不能設置太小,也不能設置太大?
(1)HDFS的塊設置太小,會增加尋址時間,程序一直在找塊的開始位置;
(2)如果塊設置的太大,從磁盤傳輸數據的時間會明顯大于定位這個塊開始位置所需的時間。導致程序在處理這塊數據時,會非常慢。
總結:HDFS塊的大小設置主要取決于磁盤傳輸速率。

第2章 HDFS的Shell操作(開發重點)

2.1 基本語法

hadoop fs 具體命令 OR hdfs dfs 具體命令
兩個是完全相同的。

2.2 命令大全

[admin@hadoop102 hadoop-3.1.3]$ bin/hadoop fs[-appendToFile <localsrc> ... <dst>][-cat [-ignoreCrc] <src> ...][-chgrp [-R] GROUP PATH...][-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...][-chown [-R] [OWNER][:[GROUP]] PATH...][-copyFromLocal [-f] [-p] <localsrc> ... <dst>][-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>][-count [-q] <path> ...][-cp [-f] [-p] <src> ... <dst>][-df [-h] [<path> ...]][-du [-s] [-h] <path> ...][-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>][-getmerge [-nl] <src> <localdst>][-help [cmd ...]][-ls [-d] [-h] [-R] [<path> ...]][-mkdir [-p] <path> ...][-moveFromLocal <localsrc> ... <dst>][-moveToLocal <src> <localdst>][-mv <src> ... <dst>][-put [-f] [-p] <localsrc> ... <dst>][-rm [-f] [-r|-R] [-skipTrash] <src> ...][-rmdir [--ignore-fail-on-non-empty] <dir> ...] <acl_spec> <path>]][-setrep [-R] [-w] <rep> <path> ...][-stat [format] <path> ...][-tail [-f] <file>][-test -[defsz] <path>][-text [-ignoreCrc] <src> ...]

2.3 常用命令實操

2.3.1 準備工作

1)啟動Hadoop集群(方便后續的測試)

[admin@hadoop102 hadoop-3.1.3]$ sbin/start-dfs.sh [admin@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh

2)-help:輸出這個命令參數

[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -help rm

3)創建/sanguo文件夾

[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /sanguo

2.3.2 上傳

1)-moveFromLocal:從本地剪切粘貼到HDFS

[admin@hadoop102 hadoop-3.1.3]$ vim shuguo.txt 輸入: shuguo[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -moveFromLocal ./shuguo.txt /sanguo

2)-copyFromLocal:從本地文件系統中拷貝文件到HDFS路徑去

[admin@hadoop102 hadoop-3.1.3]$ vim weiguo.txt 輸入: weiguo[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -copyFromLocal weiguo.txt /sanguo

3)-put:等同于copyFromLocal,生產環境更習慣用put

[admin@hadoop102 hadoop-3.1.3]$ vim wuguo.txt 輸入: wuguo[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -put ./wuguo.txt /sanguo

4)-appendToFile:追加一個文件到已經存在的文件末尾

[admin@hadoop102 hadoop-3.1.3]$ vim liubei.txt 輸入: liubei[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -appendToFile liubei.txt /sanguo/shuguo.txt

2.3.3 下載

1)-copyToLocal:從HDFS拷貝到本地

[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -copyToLocal /sanguo/shuguo.txt ./

2)-get:等同于copyToLocal,生產環境更習慣用get

[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -get /sanguo/shuguo.txt ./shuguo2.txt

2.3.4 HDFS直接操作

1)-ls: 顯示目錄信息

[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -ls /sanguo

2)-cat:顯示文件內容

[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -cat /sanguo/shuguo.txt

3)-chgrp、-chmod、-chown:Linux文件系統中的用法一樣,修改文件所屬權限

[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -chmod 666 /sanguo/shuguo.txt [admin@hadoop102 hadoop-3.1.3]$ hadoop fs -chown admin:admin /sanguo/shuguo.txt

4)-mkdir:創建路徑

[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /jinguo

5)-cp:從HDFS的一個路徑拷貝到HDFS的另一個路徑

[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -cp /sanguo/shuguo.txt /jinguo

6)-mv:在HDFS目錄中移動文件

[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -mv /sanguo/wuguo.txt /jinguo [admin@hadoop102 hadoop-3.1.3]$ hadoop fs -mv /sanguo/weiguo.txt /jinguo

7)-tail:顯示一個文件的末尾1kb的數據

[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -tail /jinguo/shuguo.txt

8)-rm:刪除文件或文件夾

[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -rm /sanguo/shuguo.txt

9)-rm -r:遞歸刪除目錄及目錄里面內容

[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -rm -r /sanguo

10)-du統計文件夾的大小信息

[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -du -s -h /jinguo 27 81 /jinguo[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -du -h /jinguo 14 42 /jinguo/shuguo.txt 7 21 /jinguo/weiguo.txt 6 18 /jinguo/wuguo.tx 說明:27表示文件大小;81表示27*3個副本;/jinguo表示查看的目錄

11)-setrep:設置HDFS中文件的副本數量

[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -setrep 10 /jinguo/shuguo.txt


這里設置的副本數只是記錄在NameNode的元數據中,是否真的會有這么多副本,還得看DataNode的數量。因為目前只有3臺設備,最多也就3個副本,只有節點數的增加到10臺時,副本數才能達到10。

第3章 HDFS的API操作

3.1 客戶端環境準備

1)找到資料包路徑下的Windows依賴文件夾,拷貝hadoop-3.1.0到非中文路徑(比如d:\)。
2)配置HADOOP_HOME環境變量

3)配置Path環境變量。
注意:如果環境變量不起作用,可以重啟電腦試試。

驗證Hadoop環境變量是否正常。雙擊winutils.exe,如果報如下錯誤。說明缺少微軟運行庫(正版系統往往有這個問題)。再資料包里面有對應的微軟運行庫安裝包雙擊安裝即可。

4)在IDEA中創建一個Maven工程HdfsClientDemo,并導入相應的依賴坐標+日志添加

<dependencies><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.1.3</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.30</version></dependency> </dependencies>

在項目的src/main/resources目錄下,新建一個文件,命名為“log4j.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)創建包名:com.admin,.hdfs
6)創建HdfsClient類

public class HdfsClient {@Testpublic void testMkdirs() throws IOException, URISyntaxException, InterruptedException {// 1 獲取文件系統Configuration configuration = new Configuration();// FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration);FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration,"admin");// 2 創建目錄fs.mkdirs(new Path("/xiyou/huaguoshan/"));// 3 關閉資源fs.close();} }

7)執行程序
客戶端去操作HDFS時,是有一個用戶身份的。默認情況下,HDFS客戶端API會從采用Windows默認用戶訪問HDFS,會報權限異常錯誤。所以在訪問HDFS時,一定要配置用戶。

org.apache.hadoop.security.AccessControlException: Permission denied: user=56576, access=WRITE, inode="/xiyou/huaguoshan":admin:supergroup:drwxr-xr-x

3.2 HDFS的API案例實操

3.2.1 HDFS文件上傳(測試參數優先級)

1)編寫源代碼

@Test public void testCopyFromLocalFile() throws IOException, InterruptedException, URISyntaxException {// 1 獲取文件系統Configuration configuration = new Configuration();configuration.set("dfs.replication", "2");FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration, "admin");// 2 上傳文件fs.copyFromLocalFile(new Path("d:/sunwukong.txt"), new Path("/xiyou/huaguoshan"));// 3 關閉資源fs.close(); }

2)將hdfs-site.xml拷貝到項目的resources資源目錄下

<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration><property><name>dfs.replication</name><value>1</value></property> </configuration>

3)參數優先級
參數優先級排序:(1)客戶端代碼中設置的值 >(2)ClassPath下的用戶自定義配置文件 >(3)然后是服務器的自定義配置(xxx-site.xml) >(4)服務器的默認配置(xxx-default.xml)

3.2.2 HDFS文件下載

@Test public void testCopyToLocalFile() throws IOException, InterruptedException, URISyntaxException{// 1 獲取文件系統Configuration configuration = new Configuration();FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration, "admin");// 2 執行下載操作// boolean delSrc 指是否將原文件刪除// Path src 指要下載的文件路徑// Path dst 指將文件下載到的路徑// boolean useRawLocalFileSystem 是否開啟文件校驗fs.copyToLocalFile(false, new Path("/xiyou/huaguoshan/sunwukong.txt"), new Path("d:/sunwukong2.txt"), true);// 3 關閉資源fs.close(); }

3.2.3 HDFS文件更名和移動

@Test public void testRename() throws IOException, InterruptedException, URISyntaxException{// 1 獲取文件系統Configuration configuration = new Configuration();FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration, "admin"); // 2 修改文件名稱fs.rename(new Path("/xiyou/huaguoshan/sunwukong.txt"), new Path("/xiyou/huaguoshan/meihouwang.txt"));// 3 關閉資源fs.close(); }

3.2.4 HDFS刪除文件和目錄

@Test public void testDelete() throws IOException, InterruptedException, URISyntaxException{// 1 獲取文件系統Configuration configuration = new Configuration();FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration, "admin");// 2 執行刪除fs.delete(new Path("/xiyou"), true);// 3 關閉資源fs.close(); }

3.2.5 HDFS文件詳情查看

查看文件名稱、權限、長度、塊信息

@Test public void testListFiles() throws IOException, InterruptedException, URISyntaxException {// 1獲取文件系統Configuration configuration = new Configuration();FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration, "admin");// 2 獲取文件詳情RemoteIterator<LocatedFileStatus> 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 關閉資源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, "admin");// 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 關閉資源fs.close(); }

第4章 HDFS的讀寫流程(面試重點)

4.1 HDFS寫數據流程

4.1.1 剖析文件寫入

(1)客戶端通過Distributed FileSystem模塊向NameNode請求上傳文件,NameNode檢查目標文件是否已存在,父目錄是否存在。
(2)NameNode返回是否可以上傳。
(3)客戶端請求第一個 Block上傳到哪幾個DataNode服務器上。
(4)NameNode返回3個DataNode節點,分別為dn1、dn2、dn3。
(5)客戶端通過FSDataOutputStream模塊請求dn1上傳數據,dn1收到請求會繼續調用dn2,然后dn2調用dn3,將這個通信管道建立完成。
(6)dn1、dn2、dn3逐級應答客戶端。
(7)客戶端開始往dn1上傳第一個Block(先從磁盤讀取數據放到一個本地內存緩存),以Packet為單位,dn1收到一個Packet就會傳給dn2,dn2傳給dn3;dn1每傳一個packet會放入一個應答隊列等待應答。
(8)當一個Block傳輸完成之后,客戶端再次請求NameNode上傳第二個Block的服務器。(重復執行3-7步)。

4.1.2 網絡拓撲-節點距離計算

在HDFS寫數據的過程中,NameNode會選擇距離待上傳數據最近距離的DataNode接收數據。那么這個最近距離怎么計算呢?

節點距離:兩個節點到達最近的共同祖先的距離總和。

例如,假設有數據中心d1機架r1中的節點n1。該節點可以表示為/d1/r1/n1。利用這種標記,這里給出四種距離描述。
大家算一算每兩個節點之間的距離。

4.1.3 機架感知(副本存儲節點選擇)

1)機架感知說明
(1)官方說明

http://hadoop.apache.org/docs/r3.1.3/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html#Data_Replication 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, 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 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 file do not evenly distribute across the racks. One third of replicas are on one node, two thirds of replicas are on one rack, and the other third are evenly distributed across the remaining racks. This policy improves write performance without compromising data reliability or read performance.

(2)源碼說明

Crtl + n 查找BlockPlacementPolicyDefault,在該類中查找chooseTargetInOrder方法。

2)Hadoop3.1.3副本節點選擇

第一個副本在Client所處的節點上。
如果客戶端在集群外,隨機選一個。
第二個副本在另一個機架的隨機一個節點
第三個副本在第二個副本所在機架的隨機節點

4.2 HDFS讀數據流程


(1)客戶端通過DistributedFileSystem向NameNode請求下載文件,NameNode通過查詢元數據,找到文件塊所在的DataNode地址。
(2)挑選一臺DataNode(就近原則,然后隨機)服務器,請求讀取數據。
(3)DataNode開始傳輸數據給客戶端(從磁盤里面讀取數據輸入流,以Packet為單位來做校驗)。
(4)客戶端以Packet為單位接收,先在本地緩存,然后寫入目標文件。

第5章 NameNode和SecondaryNameNode

5.1 NN和2NN工作機制

思考:NameNode中的元數據是存儲在哪里的?
首先,我們做個假設,如果存儲在NameNode節點的磁盤中,因為經常需要進行隨機訪問,還有響應客戶請求,必然是效率過低。因此,元數據需要存放在內存中。但如果只存在內存中,一旦斷電,元數據丟失,整個集群就無法工作了。因此產生在磁盤中備份元數據的FsImage。
這樣又會帶來新的問題,當在內存中的元數據更新時,如果同時更新FsImage,就會導致效率過低,但如果不更新,就會發生一致性問題,一旦NameNode節點斷電,就會產生數據丟失。因此,引入Edits文件(只進行追加操作,效率很高)。每當元數據有更新或者添加元數據時,修改內存中的元數據并追加到Edits中。這樣,一旦NameNode節點斷電,可以通過FsImage和Edits的合并,合成元數據。
但是,如果長時間添加數據到Edits中,會導致該文件數據過大,效率降低,而且一旦斷電,恢復元數據需要的時間過長。因此,需要定期進行FsImage和Edits的合并,如果這個操作由NameNode節點完成,又會效率過低。因此,引入一個新的節點SecondaryNamenode,專門用于FsImage和Edits的合并。

1)第一階段:NameNode啟動
(1)第一次啟動NameNode格式化后,創建Fsimage和Edits文件。如果不是第一次啟
動,直接加載編輯日志和鏡像文件到內存。
(2)客戶端對元數據進行增刪改的請求。
(3)NameNode記錄操作日志,更新滾動日志。
(4)NameNode在內存中對元數據進行增刪改。
2)第二階段:Secondary NameNode工作
(1)Secondary NameNode詢問NameNode是否需要CheckPoint。直接帶回NameNode是否檢查結果。
(2)Secondary NameNode請求執行CheckPoint。
(3)NameNode滾動正在寫的Edits日志。
(4)將滾動前的編輯日志和鏡像文件拷貝到Secondary NameNode。
(5)Secondary NameNode加載編輯日志和鏡像文件到內存,并合并。
(6)生成新的鏡像文件fsimage.chkpoint。
(7)拷貝fsimage.chkpoint到NameNode。
(8)NameNode將fsimage.chkpoint重新命名成fsimage。

5.2 Fsimage和Edits解析

NameNode被格式化之后,將在/opt/module/hadoop-3.1.3/data/tmp/dfs/name/current目錄中產生如下文件fsimage 0000000000000000000
fsimage 0000000000000000000.md5
seen txid VERSION
(1)Fsimage文件:HDFS文件系統元數據的一個久性的檢查點,其中包含HDFS文件系統的所有目錄和文件inode的序列化信息。
(2)Edits文件:存放HDFS文件系統的所有更新操作的路徑,文件系統客戶端執行的所有寫操作首先會被記錄到Edits文件中。
(3)seen_txid文件保存的是一個數字,就是最后一個edits_的數字(4)每次NameNode啟動的時候都會將Fsimage文件讀入內存,加載Edits里面的更新操作,保證內存中的元數據信息是最新的、同步的,可以看成NameNode啟動的時候就將Fsimage和Edits文件進行了合并。

1)oiv查看Fsimage文件

(1)查看oiv和oev命令

[admin@hadoop102 current]$ 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 轉換后文件輸出路徑
(3)案例實操

[admin@hadoop102 current]$ pwd /opt/module/hadoop-3.1.3/data/dfs/name/current[admin@hadoop102 current]$ hdfs oiv -p XML -i fsimage_0000000000000000025 -o /opt/module/hadoop-3.1.3/fsimage.xml[admin@hadoop102 current]$ cat /opt/module/hadoop-3.1.3/fsimage.xml

將顯示的xml文件內容拷貝到Idea中創建的xml文件中,并格式化。部分顯示結果如下。

<inode><id>16386</id><type>DIRECTORY</type><name>user</name><mtime>1512722284477</mtime><permission>admin:supergroup:rwxr-xr-x</permission><nsquota>-1</nsquota><dsquota>-1</dsquota> </inode> <inode><id>16387</id><type>DIRECTORY</type><name>admin</name><mtime>1512790549080</mtime><permission>admin:supergroup:rwxr-xr-x</permission><nsquota>-1</nsquota><dsquota>-1</dsquota> </inode> <inode><id>16389</id><type>FILE</type><name>wc.input</name><replication>3</replication><mtime>1512722322219</mtime><atime>1512722321610</atime><perferredBlockSize>134217728</perferredBlockSize><permission>admin:supergroup:rw-r--r--</permission><blocks><block><id>1073741825</id><genstamp>1001</genstamp><numBytes>59</numBytes></block></blocks> </inode >

思考:可以看出,Fsimage中沒有記錄塊所對應DataNode,為什么?
在集群啟動后,要求DataNode上報數據塊信息,并間隔一段時間后再次上報。
2)oev查看Edits文件
(1)基本語法

hdfs oev -p 文件類型 -i編輯日志 -o 轉換后文件輸出路徑

(2)案例實操

[admin@hadoop102 current]$ hdfs oev -p XML -i edits_0000000000000000012-0000000000000000013 -o /opt/module/hadoop-3.1.3/edits.xml [admin@hadoop102 current]$ cat /opt/module/hadoop-3.1.3/edits.xml

將顯示的xml文件內容拷貝到Idea中創建的xml文件中,并格式化。顯示結果如下。

<?xml version="1.0" encoding="UTF-8"?> <EDITS><EDITS_VERSION>-63</EDITS_VERSION><RECORD><OPCODE>OP_START_LOG_SEGMENT</OPCODE><DATA><TXID>129</TXID></DATA></RECORD><RECORD><OPCODE>OP_ADD</OPCODE><DATA><TXID>130</TXID><LENGTH>0</LENGTH><INODEID>16407</INODEID><PATH>/hello7.txt</PATH><REPLICATION>2</REPLICATION><MTIME>1512943607866</MTIME><ATIME>1512943607866</ATIME><BLOCKSIZE>134217728</BLOCKSIZE><CLIENT_NAME>DFSClient_NONMAPREDUCE_-1544295051_1</CLIENT_NAME><CLIENT_MACHINE>192.168.10.102</CLIENT_MACHINE><OVERWRITE>true</OVERWRITE><PERMISSION_STATUS><USERNAME>admin</USERNAME><GROUPNAME>supergroup</GROUPNAME><MODE>420</MODE></PERMISSION_STATUS><RPC_CLIENTID>908eafd4-9aec-4288-96f1-e8011d181561</RPC_CLIENTID><RPC_CALLID>0</RPC_CALLID></DATA></RECORD><RECORD><OPCODE>OP_ALLOCATE_BLOCK_ID</OPCODE><DATA><TXID>131</TXID><BLOCK_ID>1073741839</BLOCK_ID></DATA></RECORD><RECORD><OPCODE>OP_SET_GENSTAMP_V2</OPCODE><DATA><TXID>132</TXID><GENSTAMPV2>1016</GENSTAMPV2></DATA></RECORD><RECORD><OPCODE>OP_ADD_BLOCK</OPCODE><DATA><TXID>133</TXID><PATH>/hello7.txt</PATH><BLOCK><BLOCK_ID>1073741839</BLOCK_ID><NUM_BYTES>0</NUM_BYTES><GENSTAMP>1016</GENSTAMP></BLOCK><RPC_CLIENTID></RPC_CLIENTID><RPC_CALLID>-2</RPC_CALLID></DATA></RECORD><RECORD><OPCODE>OP_CLOSE</OPCODE><DATA><TXID>134</TXID><LENGTH>0</LENGTH><INODEID>0</INODEID><PATH>/hello7.txt</PATH><REPLICATION>2</REPLICATION><MTIME>1512943608761</MTIME><ATIME>1512943607866</ATIME><BLOCKSIZE>134217728</BLOCKSIZE><CLIENT_NAME></CLIENT_NAME><CLIENT_MACHINE></CLIENT_MACHINE><OVERWRITE>false</OVERWRITE><BLOCK><BLOCK_ID>1073741839</BLOCK_ID><NUM_BYTES>25</NUM_BYTES><GENSTAMP>1016</GENSTAMP></BLOCK><PERMISSION_STATUS><USERNAME>admin</USERNAME><GROUPNAME>supergroup</GROUPNAME><MODE>420</MODE></PERMISSION_STATUS></DATA></RECORD> </EDITS >

思考:NameNode如何確定下次開機啟動的時候合并哪些Edits?

5.3 CheckPoint時間設置

1)通常情況下,SecondaryNameNode每隔一小時執行一次。
[hdfs-default.xml]

<property><name>dfs.namenode.checkpoint.period</name><value>3600s</value> </property>

2)一分鐘檢查一次操作次數,當操作次數達到1百萬時,SecondaryNameNode執行一次。

<property><name>dfs.namenode.checkpoint.txns</name><value>1000000</value> <description>操作動作次數</description> </property><property><name>dfs.namenode.checkpoint.check.period</name><value>60s</value> <description> 1分鐘檢查一次操作次數</description> </property>

第6章 DataNode

6.1 DataNode工作機制


(1)一個數據塊在DataNode上以文件形式存儲在磁盤上,包括兩個文件,一個是數據本身,一個是元數據包括數據塊的長度,塊數據的校驗和,以及時間戳。
(2)DataNode啟動后向NameNode注冊,通過后,周期性(6小時)的向NameNode上報所有的塊信息。
DN向NN匯報當前解讀信息的時間間隔,默認6小時;

<property><name>dfs.blockreport.intervalMsec</name><value>21600000</value><description>Determines block reporting interval in milliseconds.</description> </property>

DN掃描自己節點塊信息列表的時間,默認6小時

<property><name>dfs.datanode.directoryscan.interval</name><value>21600s</value><description>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 describedin dfs.heartbeat.interval.</description> </property>

(3)心跳是每3秒一次,心跳返回結果帶有NameNode給該DataNode的命令如復制塊數據到另一臺機器,或刪除某個數據塊。如果超過10分鐘沒有收到某個DataNode的心跳,則認為該節點不可用。
(4)集群運行中可以安全加入和退出一些機器。

6.2 數據完整性

思考:如果電腦磁盤里面存儲的數據是控制高鐵信號燈的紅燈信號(1)和綠燈信號(0),但是存儲該數據的磁盤壞了,一直顯示是綠燈,是否很危險?同理DataNode節點上的數據損壞了,卻沒有發現,是否也很危險,那么如何解決呢?
如下是DataNode節點保證數據完整性的方法。
(1)當DataNode讀取Block的時候,它會計算CheckSum。
(2)如果計算后的CheckSum,與Block創建時值不一樣,說明Block已經損壞。
(3)Client讀取其他DataNode上的Block。
(4)常見的校驗算法crc(32),md5(128),sha1(160)
(5)DataNode在其文件創建后周期驗證CheckSum。

6.3 掉線時限參數設置

DataNode掉線時限參數設置

1、DataNode進程死亡或
者網絡故障造成DataNode
無法與NameNode通信
2、NameNode不會立即把該節點判定為死亡,要經過一段時間,這段時間暫稱作超時時長。
3、HDFS默認的超時時長為10分鐘+30秒。
4、如果定義超時時間為TimeOut,則超時時長的計算公式為:
TimeOut =2dfs.namenode.heartbeat.recheck-interval +10dfs heartbeatinterval。而默認的dfs.namenode heartbeat.recheck-interval 大小為5分鐘,dfs.heartbeat.interval默認為3秒。

需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的單位為毫秒,dfs.heartbeat.interval的單位為秒。 <property><name>dfs.namenode.heartbeat.recheck-interval</name><value>300000</value> </property><property><name>dfs.heartbeat.interval</name><value>3</value> </property>

總結

以上是生活随笔為你收集整理的03.Hadoop之HDFS的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。