主頁 >  其他 > 大資料Hadoop3.1.3 HDFS 詳細入門筆記

大資料Hadoop3.1.3 HDFS 詳細入門筆記

2021-04-19 12:56:27 其他

網頁右邊,向下滑有目錄索引,可以根據標題跳轉到你想看的內容
如果右邊沒有就找找左邊
主文章鏈接https://blog.csdn.net/grd_java/article/details/115639179
第一章:環境搭建https://blog.csdn.net/grd_java/article/details/115693312

還沒有搭建環境的可以參考第一章:環境搭建,當然不搭建你也可以看圖片學習

宣告:此文是學習尚硅谷Hadoop3.1.x課程的學習筆記
尚硅谷視瞥澩地址:https://www.bilibili.com/video/BV1Qp4y1n7EN?p=34&spm_id_from=pageDriver

一、概述

1、HDFS的產生背景和定義

HDFS 產生背景

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

HDFS 定義

  1. 一個檔案系統,用于存盤檔案,通過目錄樹來定位檔案;其次,它是分布式的,由很多服務器聯合起來實作其功能,集群中的服務器有各自的角色,

適用場景

  1. 適合一次寫入,多次讀出的場景,一個檔案經過創建、寫入和關閉之后就不需要改變,唯一的改變,就只有追加內容和洗掉內容,無法修改存盤的檔案

2、優缺點

優點

  1. 高容錯性
    在這里插入圖片描述
  2. 適合處理大資料
  1. 資料規模:能夠處理資料規模達到GB、TB、甚至PB級別的資料
  2. 檔案規模:能夠處理百萬規模以上的檔案數量,數量相當之大
  1. 可構建在廉價機器上,通過多副本機制,提高可靠性

缺點

  1. 不適合低延時資料訪問,比如毫秒級的存盤資料,是做不到的
  2. 無法高效的對大量小檔案進行存盤
  1. 存盤大量小檔案的話,它會占用NameNode大量的記憶體來存盤檔案目錄和塊資訊,這樣是不可取的,因為NameNode的記憶體總是有限的
  2. 小檔案存盤的尋址時間會超過讀取時間,它違反了HDFS的設計目標
  1. 不支持并發寫入、檔案隨機修改
    在這里插入圖片描述
  1. 一個檔案只能有一個寫,不允許多個執行緒同時寫
  2. 僅支持資料append(追加),不支持檔案的隨機修改

3、組成

在這里插入圖片描述

  1. NameNode(nn):就是Master,它是一個主管、管理者
  1. 管理HDFS的名稱空間,所有檔案元資料都存在這里,(檔案名之類的)
  2. 配置副本策略(記錄每個檔案有幾個副本)
  3. 管理資料塊(Block)映射資訊(一個大檔案通常分成多個資料塊,這些資料塊統一由NameNode記錄管理,每個資料塊還有不等量副本,也由NameNode管理)
  4. 處理客戶端讀寫請求
  1. DataNode:就是Slave,NameNode下達命令,DataNode執行實際的操作
  1. 存盤實際的資料塊
  2. 執行資料塊的讀/寫操作
  1. Client:就是客戶端
  1. 檔案切分,檔案上傳HDFS的時候,Client將檔案切分成一個一個的Block,然后進行上傳,一般最大128M或256M一個資料塊
  2. 與NameNode互動,獲取檔案的位置資訊,就是NameNode先出個方案,你這檔案應該往哪存
  3. 與DataNode互動,讀取或者寫入資料,根據NameNode的方案,和對應DataNode交涉,存盤資料
  4. Client提供一些命令來管理HDFS,比如NameNode格式化
  5. Client可以通過一些命令來訪問HDFS,比如對HDFS增刪查改操作
  1. Secondary NameNode:并非NameNode的熱備,當NameNode掛掉的時候,它并不能馬上替換NameNode并提供服務
  1. 輔助NameNode,分擔其作業量,比如定期合并Fsimage和Edits,并推送給NameNode
  2. 在緊急情況下,可輔助恢復NameNode

4、檔案塊大小

HDFS中的檔案在物理上是分塊存盤(Block),塊的大小可以通過配置引數( dfs.blocksize)來規定,默認大小在Hadoop2.x/3.x版本中是128M,1.x版本中是64M,如果有個1KB的資料,也會分配128M的塊,但是并不會直接占用128M空間,而是塊最大128M,實際上還是塊中資料的大小

  1. 集群中的block
    在這里插入圖片描述
  2. 如果尋址時間約為10ms,即查找到目標block的時間為10ms
  3. 尋址時間為傳輸時間的1%時,則為最佳狀態,(專家)因此,傳輸時間=10ms/0.01=1000ms=1s
  4. 而目前磁盤的傳輸速率普遍為100MB/s,所以我們一般選擇最接近的128m作為塊最大空間,而公司有錢用固態硬碟可達到300M/s資料,選擇256m作為塊空間大小

為什么塊的大小不能設定太小也不能設定太大

  1. HDFS的塊設定太小會增加尋址時間,程式一直在找塊的開始位置,比如一個檔案100m,分了100個1m的塊,光尋址就要100次,尋址完了才開始獲取資料
  2. 如果塊設定的太大,從磁盤傳輸資料的時間會明顯大于定位這個塊開始位置所需的時間,導致程式在處理這塊資料時,會非常慢,我們要遵循尋址時間正好是傳輸時間的1%的原則
  3. HDFS塊的大小設定主要取決于磁盤傳輸速率,普通機械硬碟,我們用128m設定塊大小,固態硬碟,用256m

二、shell相關操作

  1. 基本語法
兩條命令都可以
1. hadoop fs 具體命令
2. hdfs dfs 具體命令
  1. 常用命令查看方式
--查看hadoop,就是hdfs的相關命令
[hadoop100@hadoop102 hadoop-3.1.3]$ bin/hadoop fs
--使用-help查看指定命令的引數,比如下面查詢rm命令的引數
[hadoop100@hadoop102 hadoop-3.1.3]$ hadoop fs -help rm
  1. 常用命令介紹
  1. 啟動hadoop集群
    在這里插入圖片描述
  2. 創建一個sanguo檔案夾,-mkdir
    在這里插入圖片描述
[hadoop100@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /sanguo
  1. 從本地剪切到HDFS,-moveFormLocal
    在這里插入圖片描述
[hadoop100@hadoop102 hadoop-3.1.3]$ hadoop fs -moveFromLocal ./shuguo.txt /sanguo
  1. 從本地檔案系統中拷貝檔案到 HDFS 路徑去,-copyFromLocal
    在這里插入圖片描述
[hadoop100@hadoop102 hadoop-3.1.3]$ hadoop fs -copyFromLocal weiguo.txt /sanguo
  1. -put,等同于copyFromLocal,生產環境更多的用put命令
[hadoop100@hadoop102 hadoop-3.1.3]$ hadoop fs -put ./wuguo.txt /sanguo
  1. 追加一個檔案到已經存在的檔案末尾,-appendToFile
    在這里插入圖片描述
[hadoop100@hadoop102 hadoop-3.1.3]$ hadoop fs -appendToFile liubei.txt /sanguo/shuguo.txt
  1. 下載,從HDFS拷貝到本地,-copyToLocal,-get
[hadoop100@hadoop102 hadoop-3.1.3]$ hadoop fs -copyToLocal /sanguo/shuguo.txt ./

[hadoop100@hadoop102 hadoop-3.1.3]$ hadoop fs -get /sanguo/shuguo.txt ./shuguo2.txt
  1. 一些直接操作HDFS的命令
1-ls: 顯示目錄資訊
	[hadoop100@hadoop102 hadoop-3.1.3]$ hadoop fs -ls /sanguo
2-cat:顯示檔案內容
	[hadoop100@hadoop102 hadoop-3.1.3]$ hadoop fs -cat /sanguo/shuguo.txt
3-chgrp、-chmod、-chown:Linux 檔案系統中的用法一樣,修改檔案所屬權限
	[hadoop100@hadoop102 hadoop-3.1.3]$ hadoop fs -chmod 666 /sanguo/shuguo.txt
	[hadoop100@hadoop102 hadoop-3.1.3]$ hadoop fs -chown hadoop100:hadoop100 /sanguo/shuguo.txt
4-mkdir:創建路徑
	[hadoop100@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /jinguo
5-cp:從 HDFS 的一個路徑拷貝到 HDFS 的另一個路徑
	[hadoop100@hadoop102 hadoop-3.1.3]$ hadoop fs -cp /sanguo/shuguo.txt /jinguo
6-mv:在 HDFS 目錄中移動檔案
	[hadoop100@hadoop102 hadoop-3.1.3]$ hadoop fs -mv /sanguo/wuguo.txt/jinguo
	[hadoop100@hadoop102 hadoop-3.1.3]$ hadoop fs -mv /sanguo/weiguo.txt /jinguo
7-tail:顯示一個檔案的末尾 1kb 的資料
	[hadoop100@hadoop102 hadoop-3.1.3]$ hadoop fs -tail /jinguo/shuguo.txt
8-rm:洗掉檔案或檔案夾
	[hadoop100@hadoop102 hadoop-3.1.3]$ hadoop fs -rm /sanguo/shuguo.txt
9-rm -r:遞回洗掉目錄及目錄里面內容
	[hadoop100@hadoop102 hadoop-3.1.3]$ hadoop fs -rm -r /sanguo
10-du 統計檔案夾的大小資訊
	[hadoop100@hadoop102 hadoop-3.1.3]$ hadoop fs -du -s -h /jinguo
		27 81 /jinguo
		說明:27 表示檔案大小;81 表示 27*3 個副本;/jinguo 表示查看的目錄
	[hadoop100@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		
11-setrep:設定 HDFS 中檔案的副本數量
	[hadoop100@hadoop102 hadoop-3.1.3]$ hadoop fs -setrep 10 /jinguo/shuguo.txt
	這里設定的副本數為10只是記錄在 NameNode 的元資料中,是否真的會有這么多副本,還得
	看 DataNode 的數量,因為目前只有 3 臺設備,最多也就 3 個副本,只有節點數的增加到 10臺時,
	副本數才能達到 10

三、HDFS的客戶端API

1、搭建客戶端環境

先搞到編譯后的hadoop客戶端
我將資源上傳到了這里,免費下載即可
https://download.csdn.net/download/grd_java/16728142
或者到github上下載https://github.com/cdarlint/winutils

在這里插入圖片描述

配置環境變數

在這里插入圖片描述

運行

在這里插入圖片描述
如果報如下錯誤,說明缺少微軟運行庫(正版系統往往有這個問題),百度對應的微軟運行庫安裝包雙擊安裝即可
在這里插入圖片描述

2、使用IDEA創建MAVEN專案

  1. 創建Maven專案,因為相關依賴
    在這里插入圖片描述
<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>
  1. 在專案的 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

3、遠程創建目錄

  1. 撰寫java代碼
    在這里插入圖片描述
package com.yzpnb.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

public class HdfsClient {
    @Test
    public void testMkdirs() throws IOException, URISyntaxException,
            InterruptedException {
        // 1 獲取檔案系統
        Configuration configuration = new Configuration();
        //建立連接,并指定一個用戶名(默認用windows默認用戶,不一致肯定報錯的),才能完成操作,下面給出兩種連接,ip地址192.168.10.102不推薦使用,推薦配置主機名映射hadoop102
        // FileSystem fs = FileSystem.get(new URI("hdfs://192.168.10.102:8020"),configuration,"hadoop100");
        FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"),configuration,"hadoop100");
        
        // 2 創建目錄,呼叫mkdirs方法,通過Path類構造方法,創建指定路徑目錄
        fs.mkdirs(new Path("/xiyou/huaguoshan1/"));
        // 3 關閉資源
        fs.close();
    }
}
  1. 執行結果
    在這里插入圖片描述在這里插入圖片描述

4、資料的上傳和下載

1、 HDFS檔案上傳(測驗引數優先級)

  1. 創建一個用來上傳的檔案
    在這里插入圖片描述
  2. 撰寫代碼執行
    在這里插入圖片描述
@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, "hadoop100");
     // 2 上傳檔案下面代碼省略了引數一:是否洗掉源資料,引數二:是否允許覆寫
     fs.copyFromLocalFile(new Path("d:/sunwukong.txt"), new
             Path("/xiyou/huaguoshan"));
     // 3 關閉資源
     fs.close();
 }
  1. 結果
    在這里插入圖片描述
  2. 引數優先級測驗(比如我客戶端代碼中有xml組態檔,服務器中也有相同的xml組態檔,那么,客戶端代碼執行時以誰為準呢?)
  1. 引數優先級

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

  1. 將 hdfs-site.xml 拷貝到專案的 resources 資源目錄下,利用dfs.replication配置副本數量,查看是客戶端配置的1生效了,還是服務器配置的3生效
<?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>

2、 檔案下載

  1. 撰寫測驗代碼(如果執行如下代碼,下載不了檔案,有可能是你電腦的微軟支持的運行庫少,需要安裝一下微軟運行庫,另外你可能會在下載的檔案旁邊看到.crc后綴的檔案,它是校驗檔案是否傳輸錯誤的,HDFS發送資料時,對檔案加密,結果保存到crc檔案,然后將crc和源資料一同發送,客戶端收到后,同樣對檔案加密,查看結果和crc檔案是否一致)
    在這里插入圖片描述
 @Test
public void testCopyToLocalFile() throws IOException,
        InterruptedException, URISyntaxException{
    // 1 獲取檔案系統
    Configuration configuration = new Configuration();
    FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"),
            configuration, "hadoop100");

    // 2 執行下載操作
    fs.copyToLocalFile(false,                                   //boolean delSrc 指是否將原檔案洗掉
            new Path("/xiyou/huaguoshan/sunwukong.txt"),    //Path src 指要下載的檔案路徑
            new Path("d:/sunwukong2.txt"),                  //Path dst 指將檔案下載到的路徑
            true);                               //boolean useRawLocalFileSystem 是否開啟檔案校驗
    // 3 關閉資源
    fs.close();
}

3、 檔案更名和移動

  1. 撰寫代碼并測驗
    在這里插入圖片描述
@Test
public void testRename() throws IOException, InterruptedException,
        URISyntaxException{
    // 1 獲取檔案系統
    Configuration configuration = new Configuration();
    FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"),
            configuration, "hadoop100");
    // 2 修改檔案名稱
    fs.rename(new Path("/xiyou/huaguoshan/sunwukong.txt"),
            new Path("/xiyou/huaguoshan/meihouwang.txt"));
    // 3 關閉資源
    fs.close();
}

4、洗掉檔案和目錄

  1. 撰寫代碼運行
    在這里插入圖片描述
    在這里插入圖片描述
@Test
public void testDelete() throws IOException, InterruptedException,
        URISyntaxException{
    // 1 獲取檔案系統
    Configuration configuration = new Configuration();
    FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"),
            configuration, "hadoop100");
    // 2 執行洗掉,引數1:洗掉路徑,引數2:是否遞回洗掉,不遞回的話,洗掉不了它里面 的檔案
    fs.delete(new Path("/xiyou"), true);
    // 3 關閉資源
    fs.close();
}

5、 HDFS 檔案詳情查看

  1. 撰寫代碼運行
    在這里插入圖片描述
@Test
public void testListFiles() throws IOException, InterruptedException,
        URISyntaxException {
    // 1 獲取檔案系統
    Configuration configuration = new Configuration();
    FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"),
            configuration, "hadoop100");
    // 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();
}

6、HDFS 檔案和檔案夾判斷

  1. 撰寫代碼并運行
    在這里插入圖片描述
@Test
public void testListStatus() throws IOException, InterruptedException,
        URISyntaxException{
    // 1 獲取檔案配置資訊
    Configuration configuration = new Configuration();
    FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:8020"),
            configuration, "hadoop100");
    // 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();
}

四、HDFS的讀寫流程

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 步)
  1. 網路拓撲-節點距離計算
    在 HDFS 寫資料的程序中,NameNode 會選擇距離待上傳資料最近距離的 DataNode 接收資料,那么這個最近距離怎么計算呢?
  1. 節點距離:兩個節點到達最近的共同祖先的距離總和
  2. 根據下圖決議在這里插入圖片描述
  1. 假設有資料中心 d1 機架 r1 中的節點 n1,該節點可以表示為/d1/r1/n1,利用這種q標記,這里給出四種距離描述
    在這里插入圖片描述
  1. 機架感知(副本存盤節點選擇)
  1. 官方檔案:http://hadoop.apache.org/docs/r3.1.3/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html#Data_Replication
  2. 根據原始碼查看(Crtl + n 查找 BlockPlacementPolicyDefault,在該類中查找 chooseTargetInOrder 方法)
  3. 副本節點的選擇
    總體依據,就近和可靠原則
    在這里插入圖片描述

2、讀資料

  1. 流程
    先就近原則讀,當處理能力到上限,就去副本所在服務器讀
    在這里插入圖片描述
  1. 客戶端通過 DistributedFileSystem 向 NameNode 請求下載檔案,NameNode 通過查詢元資料,找到檔案塊所在的 DataNode 地址
  2. 挑選一臺 DataNode(就近原則,然后隨機)服務器,請求讀取資料
    3.DataNode 開始傳輸資料給客戶端(從磁盤里面讀取資料輸入流,以 Packet 為單位來做校驗)
    4.客戶端以 Packet 為單位接收,先在本地快取,然后寫入目標檔案

五、NN和2NN(NameNode 和 SecondaryNameNode)

1、作業機制

  1. NameNode中的元資料存盤在哪
  1. 存盤在記憶體,但是為了斷電不丟失,產生了在磁盤中備份元資料的FsImage,但是同時更新FsImage效率又會低,因此引入Edits檔案,只進行追加操作,元資料有更新等操作時,同時會進行追加,但是Edits會越來越大,因此引入一個新節點,SecondaryNamenod,專門用于FsImage和Edits合并
    在這里插入圖片描述
NameNode作業機制

在這里插入圖片描述

  1. 第一階段:NameNode 啟動
  1. 第一次啟動 NameNode 格式化后,創建 Fsimage 和 Edits 檔案,如果不是第一次啟動,直接加載編輯日志和鏡像檔案到記憶體
  2. 客戶端對元資料進行增刪改的請求
  3. NameNode 記錄操作日志,更新滾動日志
  4. NameNode 在記憶體中對元資料進行增刪改
  1. 第二階段: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,

2、 Fsimage和Edits

  1. 概念
    在這里插入圖片描述
  1. Fsimage檔案:HDFS檔案系統元資料的一個永久性的檢查點,其中包含HDFS檔案系統的所有目錄和檔案inode的序列化資訊,
  2. Edits檔案:存放HDFS檔案系統的所有更新操作的路徑,檔案系統客戶端執行的所有寫操作首先會被記錄到Edits檔案中
  3. seen_txid檔案保存的是一個數字,就是最后一個edits_的數字
  4. 每次NameNode啟動的時候都會將Fsimage檔案讀入記憶體,加 載Edits里面的更新操作,保證記憶體中的元資料資訊是最新的、同步的,可以看成NameNode啟動的時候就將Fsimage和Edits檔案進行了合并,
  1. oiv 查看 Fsimage 檔案
    在這里插入圖片描述
[hadoop100@hadoop102 current]$ hdfs
oiv apply the offline fsimage viewer to an fsimage
oev apply the offline edits viewer to an edits file

基本語法如下
hdfs oiv -p 檔案型別 -i 鏡像檔案 -o 轉換后檔案輸出路徑

實操:
[hadoop100@hadoop102 current]$ pwd
/opt/module/hadoop-3.1.3/data/dfs/name/current
[hadoop100@hadoop102 current]$ hdfs oiv -p XML -i fsimage_0000000000000000025 -o /opt/module/hadoop-3.1.3/fsimage.xml
[hadoop100@hadoop102 current]$ cat /opt/module/hadoop-3.1.3/fsimage.xml
  1. oev查看Edits檔案
    在這里插入圖片描述在這里插入圖片描述
基本語法
hdfs oev -p 檔案型別 -i 編輯日志 -o 轉換后檔案輸出路徑
實操:
[hadoop100@hadoop102 current]$ hdfs oev -p XML -i edits_0000000000000000012-0000000000000000013 -o /opt/module/hadoop-3.1.3/edits.xml
[hadoop100@hadoop102 current]$ cat /opt/module/hadoop-3.1.3/edits.xml
  1. CheckPoint時間設定
  1. 通常情況下,SecondaryNameNode 每隔一小時執行一次(參考下面hdfs-default.xml的默認配置)
<property>
 <name>dfs.namenode.checkpoint.period</name>
 <value>3600s</value>
</property>
  1. 一分鐘檢查一次操作次數,當操作次數達到 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

六、Datanode

1、 DataNode作業機制

在這里插入圖片描述

  1. 一個資料塊在 DataNode 上以檔案形式存盤在磁盤上,包括兩個檔案,一個是資料本身,一個是元資料包括資料塊的長度,塊資料的校驗和,以及時間戳
  2. DataNode 啟動后向 NameNode 注冊,通過后,周期性(6 小時)的向 NameNode 上報所有的塊資訊
    在這里插入圖片描述在這里插入圖片描述
  3. 心跳是每 3 秒一次,心跳回傳結果帶有 NameNode 給該 DataNode 的命令如復制塊資料到另一臺機器,或洗掉某個資料塊,如果超過 10 分鐘沒有收到某個 DataNode 的心跳,則認為該節點不可用
  4. 集群運行中可以安全加入和退出一些機器

2、資料完整性

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

3、掉線時限引數設定

在這里插入圖片描述

  1. hdfs-site.xml 組態檔中的 heartbeat.recheck.interval 的單位為毫秒,dfs.heartbeat.interval 的單位為秒
    在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/277820.html

標籤:其他

上一篇:Hadoop安裝教程_單機/偽分布式配置---------常見的問題

下一篇:華南農業大學Linux課程實驗四——搭建?個FastDFS服務器

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more