hdfs大規模數據存儲底層原理詳解(第31天)

系列文章目錄

一、HDFS設計原理
二、HDFS系統架構
三、HDFS關鍵技術
四、HDFS應用實例
五、解決HDFS不能處理小文件詳解問題


文章目錄

  • 系列文章目錄
  • 前言
  • 一、設計原理
  • 二、系統架構
  • 三、關鍵技術
  • 四、應用實例
  • 五、解決HDFS不能處理小文件詳解問題
    • 1. 合并小文件
    • 2. 優化Hive配置
    • 3. 使用壓縮和存儲格式優化
    • 4. 定時合并任務
    • 5. 重建表
    • 6. 垃圾回收
  • 補充面試題
    • 1. hdfs寫入數據原理[面試]
    • 2. 讀取數據原理[面試]
    • 3. 元數據存儲的原理[面試]
    • 4. hdfs如何保證數據安全:三大機制
      • 4.1 副本機制:
      • 4.2 負載均衡機制:
      • 4.3 心跳機制:


前言

HDFS(Hadoop Distributed File System,Hadoop分布式文件系統)是專為大規模數據集設計的分布式文件存儲解決方案,它通過一系列的技術和設計理念,實現了高效、可靠、可擴展的大數據存儲。以下是對HDFS如何做到大規模數據存儲的詳細說明,包括其設計原理、架構、關鍵技術以及應用實例,


一、設計原理

HDFS的設計原理主要基于“分而治之”的策略,即將大文件分割成固定大小的數據塊(Block),并將這些數據塊分布存儲在多個計算節點(DataNode)上,以實現數據的并行處理和冗余存儲。這種設計使得HDFS能夠處理PB級別的數據存儲,并支持高吞吐量的數據訪問。

二、系統架構

HDFS采用主從架構(Master-Slave Architecture),主要由以下幾個組件組成:

  • NameNode:HDFS的主節點,負責維護文件系統的命名空間,管理文件系統樹及整棵樹內所有的文件和目錄。NameNode還負責維護文件系統樹中各個文件和目錄的元數據信息,包括權限信息、文件屬性等。這些信息被保存在NameNode的內存中,以便快速查詢。
  • DataNode:HDFS的從節點,負責處理文件系統客戶端的讀寫請求,在文件系統中實際存儲數據。DataNode會定期向NameNode發送心跳信號和塊報告,告知NameNode自己的狀態以及存儲的塊信息。
  • Secondary NameNode:并非NameNode的熱備,其主要作用是定期合并NameNode的編輯日志(Edit Log)和文件系統鏡像(FSImage),以減少NameNode啟動時間。此外,Secondary NameNode還可以在NameNode發生故障時,用于恢復NameNode。
  • Client:HDFS的客戶端,是用戶與HDFS交互的主要途徑。客戶端提供的API使得應用程序可以方便地讀取、寫入和管理分布式文件系統中的文件。

三、關鍵技術

  • 數據塊(Block):HDFS將大文件分割成固定大小的數據塊(默認大小為128MB,Hadoop 2.x版本以后可配置),每個數據塊會存儲在多個DataNode上,實現數據的分布式存儲。這種設計有利于數據的并行處理和負載均衡。
  • 副本機制:為了保證數據的可靠性,HDFS采用副本機制,默認情況下,每個數據塊會有三個副本。這些副本會被分布在不同的DataNode上,甚至可能位于不同的機架上,以避免單點故障導致的數據丟失。
  • 元數據管理:NameNode負責維護文件系統的元數據信息,包括文件名、路徑、副本數量、數據塊ID以及存儲的DataNode節點等信息。這些信息被保存在NameNode的內存中,并通過編輯日志和文件系統鏡像進行持久化存儲。
  • 容錯性設計:HDFS通過多種機制來保障系統的高可用性,包括數據塊的冗余存儲、DataNode的心跳檢測、NameNode的故障恢復等。當DataNode出現故障時,HDFS會自動從其他DataNode上讀取副本數據,以保證數據的可用性。
  • 擴展性:HDFS支持動態添加DataNode,以實現存儲容量的擴展。這種設計使得HDFS能夠輕松應對數據量的快速增長。

四、應用實例

以互聯網公司使用HDFS存儲用戶行為數據為例,HDFS作為大數據離線分析的基礎存儲平臺,可以支撐PB級別數據的存儲和分析。具體流程如下:

數據收集:通過日志收集系統(如Flume)將用戶行為數據實時收集并寫入HDFS。
數據存儲:HDFS將收集到的數據按照一定的規則進行分割和存儲,每個數據塊會被復制到多個DataNode上,以實現數據的冗余存儲。
數據分析:數據挖掘工程師可以使用MapReduce、Spark等計算框架對存儲在HDFS中的數據進行處理和分析,以發現有價值的信息。
結果展示:分析得到的結果可以通過數據可視化工具進行展示,為企業的決策提供有力支持。

五、解決HDFS不能處理小文件詳解問題

HDFS通過其獨特的設計原理和架構,實現了大規模數據的高效、可靠、可擴展存儲。它采用數據塊分割、副本機制、元數據管理等多種技術,保障了數據的可靠性和可用性。同時,HDFS還支持動態擴展,能夠輕松應對數據量的快速增長。在實際應用中,HDFS已經成為大數據處理和分析的重要工具之一,為企業提供了強有力的數據支持。
然而,需要注意的是,HDFS并非完美無缺。由于其針對大規模數據集進行優化,因此在處理小文件時可能會存在性能瓶頸。此外,HDFS的寫入操作相對較慢,且不支持并發寫入和隨機讀寫操作。因此,在選擇存儲解決方案時,需要根據具體的應用場景和需求進行綜合考慮。在數據倉庫中,小文件問題是一個常見的挑戰,特別是在使用Hadoop HDFS(Hadoop Distributed File System)等分布式存儲系統時。小文件會導致大量的元數據開銷、NameNode性能下降以及HDFS讀寫效率的降低。為了有效地處理小文件問題,可以采取以下幾種策略:

1. 合并小文件

  • 手動合并:通過編寫腳本或程序,將多個小文件合并成一個大文件。這種方法適用于周期性或批處理場景。
  • Hadoop MapReduce作業:利用MapReduce框架編寫作業來合并小文件。MapReduce作業可以并行處理大量數據,提高合并效率。
  • Hadoop Archive (HAR):HAR是一種用于存儲和管理小文件的技術,它將多個小文件打包成一個單獨的歸檔文件,類似于zip格式。這樣可以減少存儲空間的占用和元數據的開銷。
  • Spark動態分區合并:Spark SQL支持通過動態分區寫入和AQE(Adaptive Query Execution,自適應查詢執行)特性來自動合并較小的分區,從而減少小文件的數量。

2. 優化Hive配置

  • 設置輸入輸出合并:在Hive中,可以通過設置hive.merge.mapredfiles、hive.merge.mapfiles等參數來在Map或Reduce任務結束時合并小文件。
    控制Map和Reduce的數量:減少Map和Reduce的數量可以減少小文件的生成。例如,通過set mapred.reduce.tasks來設置Reduce的數量,或者通過distribute by rand()來盡量使每個Reduce處理的數據量均衡。
  • 使用CombineHiveInputFormat:將hive.input.format設置為org.apache.hadoop.hive.ql.io.CombineHiveInputFormat,可以在執行Map前進行小文件合并。

3. 使用壓縮和存儲格式優化

  • 文件壓縮:使用gzip、bzip2、snappy等壓縮算法對小文件進行壓縮,可以減少磁盤空間和網絡帶寬的使用,并減少小文件損壞的可能性。
  • 存儲格式優化:Hive支持多種存儲格式,如ORC、Parquet等。這些格式允許將多個小文件壓縮并序列化成一個大文件,從而提高存儲效率和查詢性能。

4. 定時合并任務

  • 定時調度:設置定時任務(如每天或每周)來合并小文件。這可以通過編寫腳本或利用大數據平臺的調度工具(如Airflow、Apache Oozie等)來實現。
  • 數據清洗任務:在數據傳輸或處理任務后,增加一個清洗任務來合并小文件。這可以確保從數據源開始,小文件就不會向下游流去。

5. 重建表

  • 無分區表重建:對于無分區的表,可以考慮直接將表刪掉然后重建,使用新的配置或處理邏輯來避免小文件的產生。
  • 分區表優化:對于分區表,可以優化分區策略以減少小文件的產生。同時,也可以利用Hive的ALTER TABLE CONCATENATE等命令來合并分區中的小文件。

6. 垃圾回收

  • 定期刪除過期數據:使用HDFS的TTL(Time-To-Live)機制或定期執行刪除命令來刪除過期或不再需要的數據,以減少HDFS的存儲壓力和元數據開銷。
    綜上所述,處理數據倉庫中的小文件問題需要從多個方面入手,包括合并小文件、優化Hive配置、使用壓縮和存儲格式優化、設置定時合并任務、重建表以及垃圾回收等。在實際應用中,可以根據具體情況選擇最合適的策略或組合多種策略來解決問題。

補充面試題

1. hdfs寫入數據原理[面試]

在這里插入圖片描述
1.客戶端發起寫入數據的請求給namenode
2.namenode接收到客戶端請求,開始校驗(是否有權限,路徑是否存在,文件是否存在等),如果校驗沒問題,就告知客戶端可以寫入
3.客戶端收到消息,開始把文件數據分割成默認的128m大小的的block塊,并且把block塊數據拆分成64kb的packet數據包,放入傳輸序列

4.客戶端攜帶block塊信息再次向namenode發送請求,獲取能夠存儲block塊數據的datanode列表
5.namenode查看當前距離上傳位置較近且不忙的datanode,放入列表中返回給客戶端
6.客戶端連接datanode,開始發送packet數據包,第一個datanode接收完后就給客戶端ack應答(客戶端就可以傳入下一個packet數據包),同時第一個datanode開始復制剛才接收到的數據包給node2,node2接收到數據包也復制給node3(復制成功也需要返回ack應答),最終建立了pipeline傳輸通道以及ack應答通道
7.其他packet數據根據第一個packet數據包經過的傳輸通道和應答通道,循環傳入packet,直到當前block塊數據傳輸完成(存儲了block信息的datanode需要把已經存儲的塊信息定期的同步給namenode)

8.其他block塊數據存儲,循環執行上述4-7步,直到所有block塊傳輸完成,意味著文件數據被寫入成功(namenode把該文件的元數據保存上)
9.最后客戶端和namenode互相確認文件數據已經保存完成(也會匯報不能使用的datanode)

2. 讀取數據原理[面試]

在這里插入圖片描述
1.客戶端發送讀取文件請求給namenode

2.namdnode接收到請求,然后進行一系列校驗(路徑是否存在,文件是否存在,是否有權限等),如果沒有問題,就告知可以讀取
3.客戶端需要再次和namenode確認當前文件在哪些datanode中存儲
4.namenode查看當前距離下載位置較近且不忙的datanode,放入列表中返回給客戶端

5.客戶端找到最近的datanode開始讀取文件對應的block塊信息(每次傳輸是以64kb的packet數據包),放到內存緩沖區中
6.接著讀取其他block塊信息,循環上述3-5步,直到所有block塊讀取完畢(根據塊編號拼接成完整數據)
7.最后從內存緩沖區把數據通過流寫入到目標文件中

8.最后客戶端和namenode互相確認文件數據已經讀取完成(也會匯報不能使用的datanode)

3. 元數據存儲的原理[面試]

在這里插入圖片描述
1.namenode第一次啟動的時候先把最新的fsimage文件中內容加載到內存中,同時把edits文件中內容也加載到內存中
2.客戶端發起指令(增刪改查等操作),namenode接收到客戶端指令把每次產生的新的指令操作先放到內存中
3.然后把剛才內存中新的指令操作寫入到edits_inprogress文件中
4.edits_inprogress文件中數據到了一定閾值的時候,把文件中歷史操作記錄寫入到序列化的edits備份文件中
5.namenode就在上述2-4步中循環操作…

6.當secondarynamenode檢測到自己距離上一次檢查點(checkpoint)已經1小時或者事務數達到100w,就觸發secondarynamenode詢問namenode是否對edits文件和fsimage文件進行合并操作
7.namenode告知可以進行合并
8.secondarynamenode將namenode上積累的所有edits和一個最新的fsimage下載到本地,并加載到內存進行合并(這個過程稱checkpoint)
9.secondarynamenode把剛才合并后的fsimage.checkpoint文件拷貝給namenode

10.namenode把拷貝過來的最新的fsimage.checkpoint文件,重命名為fsimage,覆蓋原來的文件

注意: 不要死記硬背,要結合自己的理解,轉換為自己的話術,用于面試

4. hdfs如何保證數據安全:三大機制

4.1 副本機制:

為了保證數據安全和效率,block塊信息存儲多個副本,第一副本保存在客戶端所在服務器,第二副本保存在和第一副本不同機架服務器上,第三副本保存在和第二副本相同機架不同服務器

4.2 負載均衡機制:

namenode為了保證不同的datanode中block塊信息大體一樣,分配存儲任務的時候會優先保存在距離近且余量比較大的datanaode上

4.3 心跳機制:

datanode每隔3秒鐘向namenode匯報自己的狀態信息,如果某個時刻,datanode連續10次不匯報了,namenode會認為datanode有可能宕機了,namenode就會每5分鐘(300000毫秒)發送一次確認消息,連續2次沒有收到回復,就認定datanode此時一定宕機了(確認datanode宕機總時間310+52*60=630秒)。觀察地址http://node3:9864/datanode.html

在這里插入圖片描述

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

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

相關文章

DDR3 SO-DIMM 內存條硬件總結(一)

最近在使用fpga讀寫DDR3,板子上的DDR3有兩種形式與fpga相連,一種是直接用ddr3內存顆粒,另一種是通過內存條的形式與fpga相連。這里我們正好記錄下和ddr3相關的知識,先從DDR3 SO-DIMM 內存條開始。 1.先看內存條的版本 從JEDEC下載…

Mysql練習題目【7月10日更新】

七、Mysql練習題目 https://zhuanlan.zhihu.com/p/38354000 1. 創建表 創建學生表 mysql> create table if not exists student(-> student_id varchar(255) not null,-> student_name varchar(255) not null,-> birthday date not null,-> gender varchar(…

前端面試題33(實時消息傳輸)

前端實時傳輸協議主要用于實現實時數據交換,特別是在Web應用中,它們讓開發者能夠構建具有實時功能的應用,如聊天、在線協作、游戲等。以下是幾種常見的前端實時傳輸協議的講解: 1. Short Polling (短輪詢) 原理:客戶…

【1】A-Frame整體介紹

1.A-Frame是什么? A-Frame 是一個用于構建虛擬現實 (VR) 體驗的 Web 框架。 A-Frame 基于 HTML 之上,因此上手簡單。但 A-Frame 不僅僅是 3D 場景圖或標記語言;它還是一種標記語言。其核心是一個強大的實體組件框架,為 Three.js …

Golang | Leetcode Golang題解之第226題翻轉二叉樹

題目: 題解: func invertTree(root *TreeNode) *TreeNode {if root nil {return nil}left : invertTree(root.Left)right : invertTree(root.Right)root.Left rightroot.Right leftreturn root }

AI機器人在未來的應用場景預測:是否會取代人類?華為、百度、特斯拉他們在AI領域都在做什么?

引言 隨著人工智能(AI)技術的飛速發展,AI機器人在各個領域的應用變得越來越普遍。從工業自動化到日常生活,AI機器人已經開始展現出強大的潛力和實際應用價值。本文將深入探討AI機器人在未來的應用場景,并分析它們是否…

uniapp+vue3嵌入Markdown格式

使用的庫是towxml 第一步:下載源文件,那么可以git clone,也可以直接下載壓縮包 git clone https://github.com/sbfkcel/towxml.git 第二步:設置文件夾內的config.js,可以選擇自己需要的格式 第三步:安裝…

大模型/NLP/算法面試題總結3——BERT和T5的區別?

1、BERT和T5的區別? BERT和T5是兩種著名的自然語言處理(NLP)模型,它們在架構、訓練方法和應用場景上有一些顯著的區別。以下是對這兩種模型的詳細比較: 架構 BERT(Bidirectional Encoder Representation…

【Web前端】JWT(JSON Web Tokens)概述

1、簡介 JWT(JSON Web Tokens)是一種用于雙方之間安全傳輸信息的簡潔的、URL安全的令牌標準。 它基于JSON對象,并通過數字簽名確保其完整性和真實性。 JWT因其小巧、自包含以及易于在客戶端和服務器之間傳輸的特性而被廣泛使用于身份驗證和…

python字符串驗證從基礎到進階的總結

引言 在數據處理和文本挖掘中,對字符串的驗證是確保數據符合特定要求的關鍵步驟之一。其中一個常見的驗證需求是確認字符串是否只包含字母。Python為此提供了多種實現的方法,我們將逐一討論它們。 方法1:使用 isalpha() 方法 def is_all_l…

UML 2.5圖的分類

新書速覽|《UML 2.5基礎、建模與設計實踐》新書速覽|《UML 2.5基礎、建模與設計實踐 UML 2.5在UML 2.4.1的基礎上進行了結構性的調整,簡化和重新組織了 UML規范文檔。UML規范被重新編寫,使其“更易于閱讀”,并且“盡可能減少前向引用”。 U…

php簡單實現利用飛書群里機器人推送消息的方法

這是一篇利用的飛書的自定義機器人,將系統中的錯誤信息推送給技術群的功能代碼示例。 飛書文檔地址:開發文檔 - 飛書開放平臺 自定義機器人只能在群聊中使用的機器人,在當前的群聊中通過調用webhook地址來實現消息的推送。 配置群邏輯可以看…

LLM應用構建前的非結構化數據處理(三)文檔表格的提取

1.學習內容 本節次學習內容來自于吳恩達老師的Preprocessing Unstructured Data for LLM Applications課程,因涉及到非結構化數據的相關處理,遂做學習整理。 本節主要學習pdf中的表格數據處理 2.環境準備 和之前一樣,可以參考LLM應用構建前…

金蝶部署常見問題解決

金蝶部署常見問題解決 金蝶版本: Apusic Application Server Enterprise Edition 9.0 SP8 kbc build 202312041121 報錯信息: 與金蝶官方人員溝通,發現lib包版本太低,升級后可正常使用。替換lib包后重啟服務。 下載lib: 鏈接: …

西瓜杯CTF(1)

#下班之前寫了兩個題&#xff0c;后面繼續發 Codeinject <?php#Author: h1xaerror_reporting(0); show_source(__FILE__);eval("var_dump((Object)$_POST[1]);"); payload 閉合后面的括號來拼接 POST / HTTP/1.1 Host: 1dc86f1a-cccc-4298-955d-e9179f026d54…

公司內部配置GitLab,通過SSH密鑰來實現免密clone、push等操作

公司內部配置GitLab&#xff0c;通過SSH密鑰來實現免密clone、push等操作。以下是配置SSH密鑰以實現免密更新的步驟&#xff1a; 1.生成SSH密鑰 在本地計算機上打開終端或命令提示符。輸入以下命令以生成一個新的SSH密鑰&#xff1a;ssh-keygen -t rsa -b 4096 -C "your…

VBA實現Excel數據排序功能

前言 本節會介紹使用VBA如何實現Excel工作表中數據的排序功能。 本節會通過下表數據內容為例進行實操&#xff1a; 1. Sort 單列排序 語法&#xff1a;Sort key1,Order1 說明&#xff1a; Key1&#xff1a;表示需要按照哪列進行排序 Order1&#xff1a;用來指定是升序xlAsce…

D2D用戶的功率優化算法研究

D2D通信技術是指兩個對等的用戶節點之間直接進行通信的一種通信方式。在由D2D通信用戶組成的分布式網絡中&#xff0c;每個用戶節點都能發送和接收信號&#xff0c;并具有自動路由(轉發消息)的功能。網絡的參與者共享它們所擁有的一部分硬件資源&#xff0c;包括信息處理、存儲…

短視頻矩陣搭建,用云微客獲客更方便

你的同行都爆單了&#xff0c;你還在問什么是矩陣&#xff1f;讓我來告訴你。短視頻矩陣是短視頻獲客的一種全新玩法&#xff0c;是以品牌宣傳、產品推廣為核心的一個高端布局手段&#xff0c;也是非常省錢的一種方式。 1.0時代&#xff0c;一部手機一個賬號&#xff1b;2.0時代…

demon drone 200無人機標定流程

demon drone 200無人機標定流程 一、飛控固件更新1.1 固件更新1.2 參數更新 二、imu標定2.1 安裝imu標定工具&#xff08;在你自己的電腦上&#xff09;2.2 錄制rosbag(在對應飛機上)2.3 運行標定程序&#xff08;在你自己的電腦上&#xff09; 三、雙目及imu聯合標定3.1 安裝標…