Hadoop原理之——HDFS原理

来源:https://www.cnblogs.com/xuexiqun784789432/archive/2018/07/28/9382587.html
-Advertisement-
Play Games

Hadoop 3個核心組件: 分散式文件系統:Hdfs——實現將文件分散式存儲在很多的伺服器上(hdfs是一個基於Linux本地文件系統上的文件系統) 分散式運算編程框架:Mapreduce——實現在很多機器上分散式並行運算 分散式資源調度平臺:Yarn——幫用戶調度大量的mapreduce程式,並 ...


 

 

Hadoop 3個核心組件:

分散式文件系統:Hdfs——實現將文件分散式存儲在很多的伺服器上(hdfs是一個基於Linux本地文件系統上的文件系統)

分散式運算編程框架:Mapreduce——實現在很多機器上分散式並行運算

分散式資源調度平臺:Yarn——幫用戶調度大量的mapreduce程式,併合理分配運算資源

 

HDFS的設計特點是:

1、大數據文件,非常適合上T級別的大文件或者一堆大數據文件的存儲,如果文件只有幾個G甚至更小就沒啥意思了。

2、文件分塊存儲,HDFS會將一個完整的大文件平均分塊存儲到不同計算器上,它的意義在於讀取文件時可以同時從多個主機取不同區塊的文件,多主機讀取比單主機讀取效率要高得多得都。

3、流式數據訪問,一次寫入多次讀寫,這種模式跟傳統文件不同,它不支持動態改變文件內容,而是要求讓文件一次寫入就不做變化,要變化也只能在文件末添加內容。

4、廉價硬體,HDFS可以應用在普通PC機上,這種機制能夠讓給一些公司用幾十臺廉價的電腦就可以撐起一個大數據集群。

5、硬體故障,HDFS認為所有電腦都可能會出問題,為了防止某個主機失效讀取不到該主機的塊文件,它將同一個文件塊副本分配到其它某幾個主機上,如果其中一臺主機失效,可以迅速找另一塊副本取文件。

 

HDFS的關鍵元素:

1、Block:將一個文件進行分塊,通常是64M。

2、NameNode:保存整個文件系統的目錄信息、文件信息及分塊信息,這是由唯一 一臺主機專門保存,當然這台主機如果出錯,NameNode就失效了。在 Hadoop2.* 開始支持 activity-standy 模式----如果主 NameNode 失效,啟動備用主機運行 NameNode。

3、DataNode:分佈在廉價的電腦上,用於存儲Block塊文件。

如果你想瞭解大數據的學習路線,想學習大數據知識以及需要免費的學習資料可以加群:784789432.歡迎你的加入。每天下午三點開直播分享基礎知識,晚上20:00都會開直播給大家分享大數據項目實戰。

 

一、HDFS運行原理

1、NameNode和DataNode節點初始化完成後,採用RPC進行信息交換,採用的機制是心跳機制,即DataNode節點定時向NameNode反饋狀態信息,反饋信息如:是否正常、磁碟空間大小、資源消耗情況等信息,以確保NameNode知道DataNode的情況;

2、NameNode會將子節點的相關元數據信息緩存在記憶體中,對於文件與Block塊的信息會通過fsImage和edits文件方式持久化在磁碟上,以確保NameNode知道文件各個塊的相關信息;

3、NameNode負責存儲fsImage和edits元數據信息,但fsImage和edits元數據文件需要定期進行合併,這時則由SecondNameNode進程對fsImage和edits文件進行定期合併,合併好的文件再交給NameNode存儲。 

二、HDFS數據合併原理

1、NameNode初始化時會產生一個edits文件和一個fsimage文件,edits文件用於記錄操作日誌,比如文件的刪除或添加等操作信息,fsImage用於存儲文件與目錄對應的信息以及edits合併進來的信息,即相當於fsimage文件在這裡是一個總的元數據文件,記錄著所有的信息;

2、隨著edits文件不斷增大,當達到設定的一個閥值的時候,這時SecondaryNameNode會將edits文件和fsImage文件通過採用http的方式進行複製到SecondaryNameNode下(在這裡考慮到網路傳輸,所以一般將NameNode和SecondaryNameNode放在相同的節點上,這樣就無需走網路帶寬了,以提高運行效率),同時NameNode會產生一個新的edits文件替換掉舊的edits文件,這樣以保證數據不會出現冗餘;

3、SecondaryNameNode拿到這兩個文件後,會在記憶體中進行合併成一個fsImage.ckpt的文件,合併完成後,再通過http的方式將合併後的文件fsImage.ckpt複製到NameNode下,NameNode文件拿到fsImage.ckpt文件後,會將舊的fsimage文件替換掉,並且改名成fsimage文件。  

通過以上幾步則完成了edits和fsimage文件的合併,依此不斷迴圈,從而到達保證元數據的正確性。

三、HDFS寫原理

1、HDFS客戶端提交寫操作到NameNode上,NameNode收到客戶端提交的請求後,會先判斷此客戶端在此目錄下是否有寫許可權,如果有,然後進行查看,看哪幾個DataNode適合存放,再給客戶端返回存放數據塊的節點信息,即告訴客戶端可以把文件存放到相關的DataNode節點下;

2、客戶端拿到數據存放節點位置信息後,會和對應的DataNode節點進行直接交互,進行數據寫入,由於數據塊具有副本replication,在數據寫入時採用的方式是先寫第一個副本,寫完後再從第一個副本的節點將數據拷貝到其它節點,依次類推,直到所有副本都寫完了,才算數據成功寫入到HDFS上,副本寫入採用的是串列,每個副本寫的過程中都會逐級向上反饋寫進度,以保證實時知道副本的寫入情況;

3、隨著所有副本寫完後,客戶端會收到數據節點反饋回來的一個成功狀態,成功結束後,關閉與數據節點交互的通道,並反饋狀態給NameNode,告訴NameNode文件已成功寫入到對應的DataNode。

代碼實現

  1.   /*
  2.   * 測試HDFS寫入數據
  3.   */
  4.   @Test
  5.   public void Test1() throws IOException {
  6.   // 載入配置文件
  7.   Configuration conf = new Configuration();
  8.   FileSystem fs = FileSystem.get(conf);
  9.   Path path = new Path("/gyb/student.txt");
  10.   // 產生IO流
  11.   FSDataOutputStream fsio = fs.create(path);
  12.   // 包裝輸出IO流
  13.   BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fsio));
  14.   // 包裝輸入IO流
  15.   BufferedReader br = new BufferedReader(
  16.   new InputStreamReader(new FileInputStream("student.txt")));
  17.   String line = null;
  18.   while ((line = br.readLine()) != null) {
  19.   bw.write(line);
  20.   bw.newLine();
  21.   bw.flush();
  22.   }
  23.   bw.close();
  24.   br.close();
  25.   }

四、HDFS讀原理

1、HDFS客戶端提交讀操作到NameNode上,NameNode收到客戶端提交的請求後,會先判斷此客戶端在此目錄下是否有讀許可權,如果有,則給客戶端返回存放數據塊的節點信息,即告訴客戶端可以到相關的DataNode節點下去讀取數據塊;

2、客戶端拿到塊位置信息後,會去和相關的DataNode直接構建讀取通道,讀取數據塊,當所有數據塊都讀取完成後關閉通道,並給NameNode返回狀態信息,告訴NameNode已經讀取完畢。

代碼實現

  1.   /*
  2.   * 測試HDFS讀出的操作
  3.   */
  4.   @Test
  5.   public void Test3() throws IOException {
  6.   // 載入配置類
  7.   Configuration conf = new Configuration();
  8.   FileSystem fs =FileSystem.newInstance(conf);
  9.   Path path = new Path("/gyb/student.txt");
  10.   FileStatus[] fileStatus = fs.listStatus(path);
  11.   for (FileStatus fileStatus2 : fileStatus) {
  12.   if(fileStatus2 != null && fileStatus2.isFile()) {
  13.   //open方法只能傳文件
  14.   FSDataInputStream fsi = fs.open(path);
  15.   // 包裝IO流
  16.   BufferedReader br = new BufferedReader(new InputStreamReader(fsi));
  17.   while(br.ready()) {
  18.   System.out.println(br.readLine());
  19.   }
  20.   }
  21.   }
  22.   System.out.println("--------over--------");
  23.   }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我這裡使用的時centos7-mini,centos系統本身預設安裝有python2.x,版本x根據不同版本系統有所不同,可通過 python --V 或 python --version 查看系統自帶的python版本 有一些系統命令時需要用到python2,不能卸載 1、安裝依賴包 1)首先安裝 ...
  • 今天郵箱里發現有一封某伺服器inode使用率發生告警的郵件 登錄到伺服器上df i查看,發現/路徑下91%,磁碟使用率卻不高,猜測可能是某個目錄下的小文件過多,進而造成inode占用率過高,但不清楚根路徑下各文件夾里的文件數 於是乎執行以下命令,查看根路徑下各國文件夾的文件數 for i in / ...
  • Linux下源碼安裝並配置Nginx,並將nginx命令添加到系統環境變數,將nginx添加到系統服務中 ...
  • NAT(Network address translation)即網路地址轉換,作為一種過渡解決手段,可以用來減少對全球合法IP地址的需求。簡單的說,NAT就是在內部專用網路中使用內部地址,而當內部節點要與外界網路發生聯繫時,就在邊緣路由器或者防火牆處,將內部地址轉換成全局地址,從而使得在外部公共網... ...
  • Vim進入和退出命令 本來不想寫任何關於vim的文章的,無奈我今天又忘記怎麼退出vim了,常用命令是ESC,然後:wq(保存並退出),:q!(不保存並強制退出),i進入vim模式。另外還有其它的,我可能都不會用到。。。 按ESC鍵 跳到命令模式,然後: :w 保存文件但不退出vi :w file 將 ...
  • 對於存儲過程中需要編寫大量的sql語句,這必然需要美化語句,使得程式可讀性更高。 pl/sql developer開發工具自帶美化工具,不過美化的時候容易使得語句全部改變成大寫格式,這樣就需要一個插件包或者說一個使得程式只格式不改變原來大小寫的文件包。 1、自帶美化,(自帶的不夠完美,不建議推薦使用 ...
  • 返回 "ProxySQL系列文章:http://www.cnblogs.com/f ck need u/p/7586194.html"   1.ProxySQL+組複製前言 在以前的ProxySQL版本中,要支持MySQL組複製(MGR,MySQL Group Replication)需要 ...
  • 視頻課程:李興華 Oracle從入門到精通 視頻課程學習者:陽光羅諾 視頻來源:51CTO學院 整體內容: 統計函數 在之前我們就學習過一個COUNT()函數,這個函數的主要作用是統計一張表之中的數據量的個數。和它功能與之類似的常用函數有五個: 統計個數COUNT():根據表中的實際數據量返回結果。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...