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.sh2)-help:輸出這個命令參數
[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -help rm3)創建/sanguo文件夾
[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /sanguo2.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 /sanguo2)-copyFromLocal:從本地文件系統中拷貝文件到HDFS路徑去
[admin@hadoop102 hadoop-3.1.3]$ vim weiguo.txt 輸入: weiguo[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -copyFromLocal weiguo.txt /sanguo3)-put:等同于copyFromLocal,生產環境更習慣用put
[admin@hadoop102 hadoop-3.1.3]$ vim wuguo.txt 輸入: wuguo[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -put ./wuguo.txt /sanguo4)-appendToFile:追加一個文件到已經存在的文件末尾
[admin@hadoop102 hadoop-3.1.3]$ vim liubei.txt 輸入: liubei[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -appendToFile liubei.txt /sanguo/shuguo.txt2.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.txt2.3.4 HDFS直接操作
1)-ls: 顯示目錄信息
[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -ls /sanguo2)-cat:顯示文件內容
[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -cat /sanguo/shuguo.txt3)-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.txt4)-mkdir:創建路徑
[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /jinguo5)-cp:從HDFS的一個路徑拷貝到HDFS的另一個路徑
[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -cp /sanguo/shuguo.txt /jinguo6)-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 /jinguo7)-tail:顯示一個文件的末尾1kb的數據
[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -tail /jinguo/shuguo.txt8)-rm:刪除文件或文件夾
[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -rm /sanguo/shuguo.txt9)-rm -r:遞歸刪除目錄及目錄里面內容
[admin@hadoop102 hadoop-3.1.3]$ hadoop fs -rm -r /sanguo10)-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,并導入相應的依賴坐標+日志添加
在項目的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%n5)創建包名:com.admin,.hdfs
6)創建HdfsClient類
7)執行程序
客戶端去操作HDFS時,是有一個用戶身份的。默認情況下,HDFS客戶端API會從采用Windows默認用戶訪問HDFS,會報權限異常錯誤。所以在訪問HDFS時,一定要配置用戶。
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)官方說明
(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)案例實操
將顯示的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)基本語法
(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]
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小時;
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秒。
總結
以上是生活随笔為你收集整理的03.Hadoop之HDFS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何听清楚、说明白--《结构思考力》
- 下一篇: Kotlin HashMap remov