HDFS 入門介紹


HDFS簡介

  HDFS(Hadoop Distributed File System,Hadoop分布式文件系統),它是一個高度容錯性的系統,適合部署在廉價的機器上。HDFS能提供高吞吐量的數據訪問,適合那些有着超大數據集(large data set)的應用程序。

HDFS基本概念篇

         設計思想:分而治之:將大文件、大批量文件,分布式存放在大量服務器上,以便於采取分而治之的方式對海量數據進行運算分析;

         在大數據系統中作用:為各類分布式運算框架(如:mapreduce,spark,tez等)提供數據存儲服務。

HDFS的概念和特性

         一個分布式文件系統,用於存儲文件,通過統一的命名空間——目錄樹來定位文件。

Hadoop 3個核心組件:

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

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

    分布式資源調度平台:Yarn——幫用戶調度大量的mapreduce程序,並合理分配運算資源

    MapReduce:通俗說MapReduce是一套從海量源數據提取分析元素最后返回結果集的編程模型,將文件分布式存儲到硬盤是第一步,而從海量數據中提取分析我們需要的內容就是MapReduce做的事了。
    MapReduce的基本原理就是:將大的數據分析分成小塊逐個分析,最后再將提取出來的數據匯總分析,最終獲得我們想要的內容。當然怎么分塊分析,怎么做Reduce操作非常復雜,Hadoop已經提供了數據分析的實現,我們只需要編寫簡單的需求命令即可達成我們想要的數據。

HDFS的設計特點是

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

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

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

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

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

重要特性:

         1.HDFS中的文件在物理上是分塊存儲(block),塊的大小可以通過配置參數( dfs.blocksize)來規定,默認大小在hadoop2.x版本中是128M,老版本中是64M

         2.HDFS文件系統會給客戶端提供一個統一的抽象目錄樹,客戶端通過路徑來訪問文件

         3.目錄結構及文件分塊信息(元數據)的管理由namenode節點承擔——namenode是HDFS集群主節點,負責維護整個hdfs文件系統的目錄樹,以及每一個路徑(文件)所對應的block塊信息(block的id,及所在的datanode服務器)

         4.文件的各個block的存儲管理由datanode節點承擔----datanode是HDFS集群從節點,每一個block都可以在多個datanode上存儲多個副本(副本數量也可以通過參數設置dfs.replication)

         5.HDFS是設計成適應一次寫入,多次讀出的場景,且不支持文件的修改

HDFS的關鍵元素:

         1、Block:將一個文件進行分塊,通過配置參數( dfs.blocksize)來設置,hadoop2.x版本中是128M,老版本中是64M。

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

         3、DataNode:分布在廉價的計算機上,用於存儲Block塊文件。

一、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會產生一個新的edits文件替換掉舊的edits文件,這樣以保證數據不會出現冗余;

3、SecondaryNameNode拿到這兩個文件后,會在內存中進行合並成一個fsImage.ckpt的文件,合並完成后,再通過http的方式將合並后的文件fsImage.ckpt復制到NameNode下,NameNode文件拿到fsImage.ckpt文件后,會將舊的fsimage文件替換掉,並且改名成fsimage文件。

  

三、HDFS寫原理

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

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

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

 

 

四、HDFS讀原理

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

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

 

 

備注:
作者:Shengming Zeng
博客:http://www.cnblogs.com/zengming/ 

本文是原創,歡迎大家轉載;但轉載時必須注明文章來源,且在文章開頭明顯處給明鏈接。
<歡迎有不同想法或見解的同學一起探討,共同進步>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM