【Hadoop_04】HDFS的API操作與讀寫流程

  • 1、HDFS的API操作
    • 1.1 客戶端環境準備
    • 1.2 API創建文件夾
    • 1.3 API上傳
    • 1.4 API參數的優先級
    • 1.5 API文件夾下載
    • 1.6 API文件刪除
    • 1.7 API文件更名和移動
    • 1.8 API文件詳情和查看
    • 1.9 API文件和文件夾判斷
  • 2、HDFS的讀寫流程(面試重點)
    • 2.1 HDFS寫數據流程
    • 2.2 網絡拓撲-節點距離計算
    • 2.3 機架感知(副本存儲節點選擇)
    • 2.4 讀數據流程

1、HDFS的API操作

1.1 客戶端環境準備

  • 首先要配置環境變量

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

  • 其次在IDEA中創建一個Maven工程HdfsClientDemo,并導入相應的依賴坐標+日志添加
    <properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.hamcrest</groupId><artifactId>hamcrest-core</artifactId><version>1.3</version></dependency><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>
</project>

1.2 API創建文件夾

package com.wenxin.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;/*** @author Susie-Wen* @version 1.0* @description:客戶端代碼常用套路* 1、獲取一個客戶端對象* 2、執行相關的操作命令* 3、關閉資源* HDFS zookeeper* @date 2023/12/11 12:27*/
public class HdfsClient {private FileSystem fs;@Beforepublic void init() throws URISyntaxException, IOException, InterruptedException {// 連接的集群地址URI uri = new URI("hdfs://hadoop102:8020");// 用戶String user = "root";// 創建一個配置文件Configuration configuration = new Configuration();// 1、獲取到了客戶端對象fs = FileSystem.get(uri, configuration, user);}@Afterpublic void close() throws IOException {// 3、關閉資源fs.close();}@Testpublic void testMkdir() throws IOException {// 2、創建一個文件夾fs.mkdirs(new Path("/xiyou/huaguoshan"));}
}

上面這段代碼把連接和關閉資源都進行了封裝,更加方便。

  • @Before 注解標識的方法 init() 是一個在測試方法執行之前會被調用的初始化方法。
  • @After 注解標識的方法 close() 是一個在測試方法執行之后會被調用的清理方法。

在這里插入圖片描述

如下所示,確實創建了文件夾
在這里插入圖片描述
在這里插入圖片描述

1.3 API上傳

接下來進行API上傳操作:使用客戶端遠程訪問HDFS,之后上傳文件。

在這里插入圖片描述

    // 上傳:客戶端遠程訪問HDFS,之后上傳文件@Testpublic void testPut() throws IOException {fs.copyFromLocalFile(false,false,new Path("E:\\VMWare\\Centos\\sunwukong.txt"),new Path("hdfs://hadoop102/xiyou/huaguoshan"));}

1.4 API參數的優先級

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, "atguigu");// 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>

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

在這里插入圖片描述

1.5 API文件夾下載

下載相當于從HDFS將文件下載到windows本地:

在這里插入圖片描述

//下載:將文件從HDFS下載到windows當中public void testGet() throws IOException {fs.copyToLocalFile(false,new Path("hdfs://hadoop102/xiyou/huaguoshan"),new Path("E:\\VMWare\\"),false);}
  • 如果參數四設置為true的話,就不會進行crc校驗
    在這里插入圖片描述

1.6 API文件刪除

在這里插入圖片描述

    //刪除@Testpublic void testRm() throws IOException {fs.delete(new Path("/xiyou/huaguoshan/sunwukong.txt"),false);}
  • 除了刪除文件之外,我們還可以刪除空目錄以及非空目錄
  • 多個文件如果是非遞歸刪除的話,會報錯
    //刪除@Testpublic void testRm() throws IOException {//1.刪除文件fs.delete(new Path("/xiyou/huaguoshan/sunwukong.txt"),false);//2.刪除空目錄fs.delete(new Path("/xiyou"),false);//3.刪除非空目錄fs.delete(new Path("/xiyou/huaguoshan/"),false);}

1.7 API文件更名和移動

在這里插入圖片描述

  • 包括文件名稱的修改,文件的移動和更名以及目錄的更名
    //文件的更名和移動@Testpublic void testMove() throws IOException {//1.文件名稱的修改fs.rename(new Path("/input/word.txt"),new Path("/input/ss.txt"));//2.文件的移動和更名:從input目錄移動到根目錄下并修改姓名fs.rename(new Path("/input/ss.txt"),new Path("/wenxin.txt"));//3.目錄的更名fs.rename(new Path("/input"),new Path("/output"));}

1.8 API文件詳情和查看

在這里插入圖片描述
在這里插入圖片描述

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

    //獲取文件詳情信息@Testpublic void fileDetail() throws IOException {//1.獲取所有文件信息RemoteIterator<LocatedFileStatus> listFiles=fs.listFiles(new Path("/"), true);//2.遍歷文件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.getPath());System.out.println(fileStatus.getModificationTime());System.out.println(fileStatus.getReplication());System.out.println(fileStatus.getBlockLocations());System.out.println(fileStatus.getPath().getName());}}

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

    //獲取文件詳情信息@Testpublic void fileDetail() throws IOException {//1.獲取所有文件信息RemoteIterator<LocatedFileStatus> listFiles=fs.listFiles(new Path("/"), true);//2.遍歷文件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.getPath());System.out.println(fileStatus.getModificationTime());System.out.println(fileStatus.getReplication());System.out.println(fileStatus.getBlockLocations());System.out.println(fileStatus.getPath().getName());//獲取塊信息BlockLocation[] blockLocations = fileStatus.getBlockLocations();System.out.println(Arrays.toString(blockLocations));}}

1.9 API文件和文件夾判斷

判斷根目錄那個是文件,那個是文件夾

    //判斷文件與文件夾@Testpublic void testFile() throws IOException{FileStatus[] listStatus = fs.listStatus(new Path("/"));for(FileStatus status:listStatus){if(status.isFile()){System.out.println("文件:"+status.getPath().getName());}else{System.out.println("目錄:"+status.getPath().getName());}}}

在這里插入圖片描述

2、HDFS的讀寫流程(面試重點)

2.1 HDFS寫數據流程

在這里插入圖片描述(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步)。

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

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

節點距離:兩個節點到達最近的共同祖先的距離總和。
在這里插入圖片描述

在這里插入圖片描述

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

算一算每兩個節點之間的距離:

在這里插入圖片描述

在這里插入圖片描述

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

官方說明:

對于常見情況,當副本為3時,HDFS的放置策略是,如果編寫器在datanode上,則將一個副本放在本地計算機上,否則放在隨機datanode上,另一個副本放在不同(遠程)機架中的節點上最后一個放在同一遠程機架中的不同節點上。此策略減少了機架間的寫入流量,從而總體上提高了寫入性能。機架故障的幾率遠小于節點故障的幾率;該策略不影響數據可靠性和可用性保證。但是,它確實減少了讀取數據時使用的聚合網絡帶寬,因為一個數據塊只放在兩個不同的機架中,而不是三個。使用此策略,文件的副本不會均勻分布在機架上。三分之一的副本位于一個節點上,三分之二的副本位于一個機架上,另外三分之一的副本均勻分布在其余機架上。該策略提高了寫入性能,而不影響數據可靠性或讀取性能。

  • 第一個副本考慮的是節點距離最近,上傳速度最快。
  • 第二個節點保證數據的可靠性。
  • 第三個節點在保證數據可靠性的前提下兼顧效率。

在這里插入圖片描述
查看源碼:

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

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

2.4 讀數據流程

在這里插入圖片描述

(1)客戶端通過DistributedFileSystem向NameNode請求下載文件,NameNode通過查詢元數據,找到文件塊所在的DataNode地址。【DistributedFileSystem是分布式文件系統對象】

(2)挑選一臺DataNode(就近原則,然后隨機)服務器,請求讀取數據。【除了考慮節點最近之外,還會考慮當前節點的負載能力】

(3)DataNode開始傳輸數據給客戶端(從磁盤里面讀取數據輸入流,以Packet為單位來做校驗)。

(4)客戶端以Packet為單位接收,先在本地緩存,然后寫入目標文件。

  • 這里讀取數據采用的是串行讀取,而不是并行讀取。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/215396.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/215396.shtml
英文地址,請注明出處:http://en.pswp.cn/news/215396.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學會面向對象經典練習題21道

1.面向對象練習&#xff1a;設計小狗類 需求&#xff1a; 抽象形成一個小狗類Dog 屬性&#xff1a;名字name 年齡age 品種kind 主人host 價格price 功能&#xff1a; 跑run&#xff1a;無參&#xff0c;打印&#xff1a;小狗Dog跑的老快了~ 吃eat&#xff1a;參數int n&#x…

當MongoDB主鍵為String時,mongoTemplate無法根據id查詢的問題

MongoDB推薦使用ObjectId作為主鍵&#xff0c;但國內的開發都知道&#xff0c;事情往往不如人所愿&#xff0c;當我們真的出現了“_id”主鍵的類型為String時&#xff0c;且還必須想用mongoTemplate.findOne或findList時&#xff0c;直接使用該方法會導致查詢結果為空。 因為m…

https 協議

目錄 加密方式 對稱加密 非對稱加密 非對稱加密 非對稱加密 非對稱加密 對稱加密 AC證書 AC證書內容 數據摘要 數據簽名 在我們前面學習的http協議里面&#xff0c;我們發送的內容都是明文傳輸的&#xff0c;所以在安全上并不安全&#xff0c;但是在現在信息發達的時…

Java高級技術:優化性能與擴展性的最佳實踐

標題&#xff1a;Java高級技術&#xff1a;優化性能與擴展性的最佳實踐 摘要&#xff1a;本文將介紹Java中一些高級技術&#xff0c;以提高性能和代碼的擴展性。本文不包括反射和并發編程&#xff0c;旨在幫助開發者進一步提升Java應用程序的質量和可維護性。 優化性能的最佳實…

面試題目總結(三)

1. Spring、Springboot、springMVC、Spring Cloud 的區別&#xff1a; Spring&#xff1a;Spring 是一個開源的、輕量級的Java框架&#xff0c;提供了豐富的功能和組件&#xff0c;用于構建企業級應用程序。Spring框架包含了很多模塊&#xff0c;包括核心容器、數據訪問、事物…

MATLAB算法實戰應用案例精講-【數模應用】漫談機器學習(七)

目錄 幾個高頻面試題目 機器學習算法工程師需要掌握哪些編程語言? 1.Python 2. C# 3.JavaScript 4. R 5.Java

Linux之Apache服務器安裝及配置

一、Apache服務器簡介 Apache HTTP Server&#xff08;簡稱Apache&#xff09;是Apache軟件基金會的一個開放源碼的網頁服務器&#xff0c;可以在大多數計算機操作系統中運行&#xff0c;由于其多平臺和安全性被廣泛使用。Apache曾經是世界使用排名第一的Web服務器軟件&#xf…

VSCODE連接遠程服務器

安裝ssh插件 根據你的操作系統選擇對應的版本進行下載和安裝。 安裝完成之后&#xff0c;啟動vscode&#xff0c;選擇左側Extensions 選項卡&#xff0c;在輸入框搜索 remote &#xff0c;選擇安裝Remote-SSH插件。 安裝完成之后會在左側新增一個選項卡Remote Explorer&#xf…

肥貓游戲報價器|計價器|王者榮耀代練陪練等游戲報價器軟件介紹說明

目錄 1. 前言2. 軟件著作權3. 軟件使用說明3.1 進入軟件3.2 用戶登錄3.3 首頁3.4 報價器3.4.1 總體介紹3.4.2 王者報價器3.4.3 LOL手游報價器3.4.4 英雄聯盟報價器3.4.5 云頂之弈報價器3.4.7 王者水晶報價器3.4.8 和平精英報價器3.4.9 蛋仔派對報價器3.4.10 穿越火線報價器3.4.…

kafka學習筆記--broker工作流程、重要參數

本文內容來自尚硅谷B站公開教學視頻&#xff0c;僅做個人總結、學習、復習使用&#xff0c;任何對此文章的引用&#xff0c;應當說明源出處為尚硅谷&#xff0c;不得用于商業用途。 如有侵權、聯系速刪 視頻教程鏈接&#xff1a;【尚硅谷】Kafka3.x教程&#xff08;從入門到調優…

Linux mc命令教程:如何有效地使用mc命令(附案例詳解和注意事項)

Linux mc命令介紹 mc命令是Linux中的一個視覺文件管理器&#xff0c;全稱為Midnight Commander。它提供了一個用戶友好的界面&#xff0c;使得在Linux環境中的文件和目錄管理變得更加直觀和方便。mc命令支持鼠標操作和顏色顯示&#xff0c;同時也提供了一套菜單接口&#xff0…

TypeScript 常用高級類型

目錄 前言&#xff1a; TypeScript 常用高級類型 基本概念 高級類型 1. 交叉類型&#xff08;Intersection Types&#xff09; 2. 聯合類型&#xff08;Union Types&#xff09; 3. 映射類型&#xff08;Mapped Types&#xff09; 4. 條件類型&#xff08;Conditional…

GGML 或GGUF的14種不同量化模式說明

查看 TheBloke/Llama-2–13B-chat-GGML 存儲庫中的文件&#xff0c;我們可以看到 14 種不同的 GGML 模型&#xff0c;對應于不同類型的量化。它們遵循特定的命名約定&#xff1a;“q” 用于存儲權重的位數&#xff08;精度&#xff09; 特定變體。以下是所有可能的量化方法及其…

Pytorch-Transformer軸承故障一維信號分類(三)

目錄 前言 1 數據集制作與加載 1.1 導入數據 第一步&#xff0c;導入十分類數據 第二步&#xff0c;讀取MAT文件驅動端數據 第三步&#xff0c;制作數據集 第四步&#xff0c;制作訓練集和標簽 1.2 數據加載&#xff0c;訓練數據、測試數據分組&#xff0c;數據分batch…

據房間Id是否存在,判斷當前房間是否到期且實時更改顏色

重點代碼展示&#xff1a; <template><el-col style"width: 100%;height: 100%;"><el-col :span"20"><el-card class"room_info"><avue-data-icons :option"option"></avue-data-icons></el-…

RT-DETR算法優化改進:輕量化自研設計雙卷積重新設計backbone和neck,完成漲點且計算量和參數量顯著下降

??????本文自研創新改進:雙卷積由組卷積和異構卷積組成,執行 33 和 11 卷積運算代替其他卷積核僅執行 11 卷積,YOLOv8 Conv,從而輕量化RT-DETR,性能如下表,GFLOPs 8.1降低至7.6,參數量6.3MB降低至5.8MB RT-DETR魔術師專欄介紹: https://blog.csdn.net/m0_637742…

ubuntu-c++-可執行模塊-動態鏈接庫-鏈接庫搜索-基礎知識

文章目錄 1.動態鏈接庫簡介2.動態庫搜索路徑3.運行時鏈接及搜索順序4.查看可運行模塊的鏈接庫5.總結 1.動態鏈接庫簡介 動態庫又叫動態鏈接庫&#xff0c;是程序運行的時候加載的庫&#xff0c;當動態鏈接庫正確安裝后&#xff0c;所有的程序都可以使用動態庫來運行程序。動態…

Android帝國之日志系統--logd、logcat

本文概要 這是Android系統進程系列的第四篇文章&#xff0c;本文以自述的方式來介紹logd進程&#xff0c;通過本文您將了解到logd進程存在的意義&#xff0c;以及日志系統的實現原理。&#xff08;文中的代碼是基于android13&#xff09; Android系統進程系列的前三篇文章如下…

C#基礎與進階擴展合集-基礎篇(持續更新)

目錄 本文分兩篇&#xff0c;進階篇點擊&#xff1a;C#基礎與進階擴展合集-進階篇 一、基礎入門 Ⅰ 關鍵字 Ⅱ 特性 Ⅲ 常見異常 Ⅳ 基礎擴展 1、哈希表 2、擴展方法 3、自定義集合與索引器 4、迭代器與分部類 5、yield return 6、注冊表 7、不安全代碼 8、方法…

MATLAB中cell函數的用法

cell用法 在MATLAB中&#xff0c;cell 是一種特殊的數據類型&#xff0c;用于存儲不同大小和類型的數據。cell 數組是一種容器&#xff0c;每個元素可以包含任意類型的數據&#xff0c;包括數值、字符串、矩陣、甚至其他的 cell 數組。 以下是 cell 數組的基本語法和示例&…