淺談HDFS(一)

来源:https://www.cnblogs.com/kocdaniel/archive/2019/09/26/11589382.html
-Advertisement-
Play Games

產生背景及定義 HDFS:分散式文件系統,用於存儲文件,主要特點在於其分散式,即有很多伺服器聯合起來實現其功能,集群中的伺服器各有各的角色 隨著數據量越來越大,一個操作系統存不下所有的數據,那麼就分配到更多的操作系統管理的磁碟中,但是管理和維護極不方便,於是迫切 需要一種系統來管理多台機器上的文件 ...


產生背景及定義

HDFS:分散式文件系統,用於存儲文件,主要特點在於其分散式,即有很多伺服器聯合起來實現其功能,集群中的伺服器各有各的角色

  • 隨著數據量越來越大,一個操作系統存不下所有的數據,那麼就分配到更多的操作系統管理的磁碟中,但是管理和維護極不方便,於是迫切需要一種系統來管理多台機器上的文件,這就是分散式管理系統,HDFS是其中一種
  • HDFS的使用適合一次寫入,多次讀出的場景,且不支持對文件的直接修改,僅支持在文件末尾追加
  • HDFS採用流式的數據訪問方式:特點就是像流水一樣,數據不是一次過來,而是一點一點“流”過來,處理數據也是一點一點處理。如果是數據全部過來之後才處理,那麼延遲就會很大,而且會消耗很大的記憶體。

優缺點

  1. 高容錯性
    • 數據自動保存多個副本,通過增加副本的方式,提高容錯性
    • 若某一個副本丟失後,它可以自動分配到其它節點作為新的副本
  2. 處理大數據
    • 數據規模:能夠處理的數據規模可以達到GB,TB,甚至PB級別的數據
    • 文件規模:能夠處理百萬規模以上的文件數量,數量相當之大
  3. 可構建在廉價的機器上,通過多副本機制,提高可靠性

組成架構

  1. namenode(nn):就是Master,是一個管理者,存放元數據
    • 管理HDFS的名稱空間
    • 配置副本策略
    • 管理數據塊的映射信息
    • 處理客戶端的讀寫請求
  2. datanode(dn):就是slave,真正存儲文件的地方
    • 存儲實際的數據塊
    • 執行數據塊的讀寫操作
  3. secondarynamenode(2nn):並非namenode的熱備,當namenode掛掉的時候,並不能馬上替換namenode並提供服務
    • 作為namenode的輔助,分擔其工作量,比如定期合併Fsimage和Edits(文章後邊會講到這兩個東西),並推送給namenode
    • 在緊急情況下,可輔助恢復namenode,但是只能恢復部分,而不能全部恢復
  4. client:客戶端
    • 文件的切分,在上傳HDFS之前,client將文件切分為一個一個的Block,然後一個一個進行上傳
    • 與namenode交互,獲取文件的datanode信息
    • 與datanode交互,讀取或寫入數據
    • client提供一些命令來管理HDFS,比如namenode的格式化
    • client通過一些命令來訪問HDFS,比如對HDFS的增刪查改等

文件塊大小

為什麼要把文件抽象為Block塊存儲?

  1. block的拆分使得單個文件大小可以大於整個磁碟的容量,構成文件的Block可以分佈在整個集群, 理論上,單個文件可以占據集群中所有機器的磁碟。
  2. Block的抽象也簡化了存儲系統,對於Block,無需關註其許可權,所有者等內容(這些內容都在文件級別上進行控制)。
  3. Block作為容錯和高可用機制中的副本單元,即以Block為單位進行複製。

HDFS中的文件在物理記憶體中分塊存儲(Block),塊的大小在Hadoop2.x版本中預設為128M,在老版本中為64M,那麼為什麼為128M呢?

其實,HDFS的塊的大小的設置主要取決於磁碟傳輸速率,如下:

  1. 如果在HDFS中,定址時間為10ms,即查找到目標Block的時間為10ms
  2. 專家說操作的最佳狀態為:定址時間為傳輸時間的1%,因此傳輸時間為1s
  3. 而目前磁碟的傳輸速率普遍為100M/s

為什麼塊大小不能設置太小,也不能設置太大?

  1. HDFS的塊設置太小,會增加定址時間,使得程式可能一直在尋找塊的開始位置
  2. 如果設置的太大,從磁碟傳輸數據的時間會明顯大於定位這個塊所需的定址時間,導致程式處理這塊數據時會非常慢

HDFS的數據流

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步)。

網路拓撲---節點距離計算

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

結論:兩個節點到達最近的共同祖先的距離總和,即為節點距離。

如上圖所示:

  • 同一節點上的進程節點距離為0
  • 同一機架上不同節點的距離為兩個節點到共同機架r1的距離總和,為2
  • 同一數據中心不同機架的節點距離為兩個節點到共同祖先集群d1的距離之和,為4
  • 不同數據中心的節點距離為兩個節點到達共同祖先數據中心的距離之和,為6

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

副本的數量我們可以從配置文件中設置,那麼HDFS是怎麼選擇副本存儲的節點的呢?

如上圖所示,為了提高容錯性,有如下設置,加入現在有3個副本:

  • 第一個副本在Client所在的節點上,如果客戶端在集群外,則隨機選一個
  • 第二個副本和第一個副本位於相同機架,隨機節點
  • 第三個副本位於不同機架,隨機節點

這樣做的目的就是為了提高容錯性。

HDFS讀數據流程

HDFS讀數據流程

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

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

-Advertisement-
Play Games
更多相關文章
  • 1.下載安裝包 鏈接:https://pan.baidu.com/s/1hP3cD9aTv8nvJfNwjXPdrQ 提取碼:xmsu 2.解壓安裝包 選擇.exe 文件然後 安裝 選擇自己要安裝的位置。 3.安裝完成之後 點擊剛纔解壓出來的另一個文件 選擇navicat.exe 打開 4.最後出現 ...
  • -- 今天 SELECT DATE_FORMAT(NOW(),'%Y-%m-%d 00:00:00') AS dayStart;SELECT DATE_FORMAT(NOW(),'%Y-%m-%d 23:59:59') AS dayEnd; -- 昨天SELECT DATE_FORMAT( DATE ...
  • 為什麼不呢?我們有了RPC/RMI和MAP,為什麼不能在windows環境下處理大數據呢?windows是迄今為止最普及的操作系統,據市調公司NetMarketShare最新(2019年5月)統計數據,在桌面操作系統方面,目前Windows 10的市場占有率已達45.73%。而Windows 7的市 ...
  • 1、使用decode判斷字元串是否一樣 decode(value,if1,then1,if2,then2,if3,then3,...,else) 含義為 IF 條件=值1 THEN RETURN(value 1) ELSIF 條件=值2 THEN RETURN(value 2) ...... ELS ...
  • 一、資料庫基本操作 登錄: 開啟資料庫服務,在cmd中輸入指令 mysql -u用戶名 -p密碼 3退出: 在cmd中輸入exit/quit;啟動服務: net start 服務名 停止服務:net stop 服務名 mysql基本函數 select version(); 顯示mysql版本 sel ...
  • 以下操作基於redis3.X版本:Redis集群存儲原理:Redis 集群使用數據分片(sharding),而非一致性哈希(consistency hashing)來實現,一個 Redis 集群包含 16384 個哈希槽,資料庫中的每個鍵都屬於這 16384 個哈希槽的其中一個,集群使用公式 CRC ...
  • 1.因為系統重裝 又雙叒叕開始了裝myql資料庫 下載安裝包 https://dev.mysql.com/downloads/mysql/ 2.解壓到你想安裝的地方 3.解壓完是沒有圖紅色框中的文件的 需要你配置my.ini文件 data文件夾是等會兒自動生成的 4.配置環境變數 右鍵我的電腦 屬性 ...
  • 各種都可以參照: 鏈接:https://wenku.baidu.com/view/778f794bfe4733687e21aa90.html 怎樣把SQL Server里的某個表的數據導出成XML文件,要用SQL語言,而且要自動實現,怎麼做?最佳答案 select * from 表名 for xml ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...