天天看點

Hadoop2源碼分析-HDFS核心子產品分析1.概述2.HDFS簡述3.NameNode4.DataNode5.總結6.結束語

來講述,前面我們對mapreduce、序列化、rpc進行了分析和探索,對hadoop

v2的這些子產品都有了大緻的了解,通過對這些子產品的研究,我們明白了mapreduce的運作流程以及内部的實作機制,hadoop的序列化以及它的通信

機制(rpc)。今天我們來研究另一個核心的子產品,那就是hadoop的分布式檔案存儲系統——hdfs,下面是今天分享的内容目錄:

hdfs簡述

namenode

datanode

  接下來,我們開始今天的分享内容。

  hdfs全稱hadoop distributed file

system,在hdfs中有幾個基本的概念,首先是它的資料塊(block),hdfs的設計是用于支援大檔案的。運作在hdfs上的程式也是用于處理

大資料集的。這些程式僅寫一次資料,一次或多次讀資料請求,并且這些讀操作要求滿足流式傳輸速度。hdfs支援檔案的一次寫多次讀操作。hdfs中典型的

塊大小是64mb,一個hdfs檔案可以被被切分成多個64mb大小的塊,如果需要,每一個塊可以分布在不同的資料節點上。hdfs

中,如果一個檔案小于一個資料塊的大小,并不占用整個資料塊存儲空間。

  hdfs提供了一個可操作檔案系統的抽象類org.apache.hadoop.fs.filesystem,該類被劃分在hadoop-

common部分,其源碼位址為:hadoop-2.6.0-src/hadoop-common-project/hadoop-common/src

/main/java/org/apache/hadoop/fs/filesystem.java,如下是filesystem的部分源碼,如下所示:

  我們可以使用着抽象類,去操作hdfs系統上的内容,實作代碼如下所示:

  下面,我們來看另一個概念是中繼資料節點(namenode)和資料節點(datanode),這2個是hdfs的核心子產品,下面我們分别來看看這2個核心子產品。

  nn節點用來管理檔案系統的namespace,将所有的檔案和檔案夾的meta儲存在一個檔案系統中,是hdfs中檔案目錄和檔案配置設定的管理者,儲存的重要資訊如下所示:

Hadoop2源碼分析-HDFS核心子產品分析1.概述2.HDFS簡述3.NameNode4.DataNode5.總結6.結束語

  在hdfs叢集上可能包含成百上千個datanode(簡稱dn)節點,這些dn節點定時和namenode(簡稱nn)節點保持通信,接受

nn節點的一些指令,為了減小nn的壓力,nn上并不永久存儲那個dn上報的資料塊資訊,而是通過dn上報的狀态來更新nn上的映射表資訊。dn和nn建

立連接配接後,會和nn保持心跳,心跳傳回的資訊包含了nn對dn的一些指令資訊,如删除資料,複制資料到其他的dn節點。值得注意的是nn不會主動去請求

dn,這是一個嚴格意義上的c/s架構模型,同時,用戶端在操作hdfs叢集時,dn節點會互相配合,保證資料的一緻性。

  nn節點資訊存儲,部分截圖資訊如下所示:

Hadoop2源碼分析-HDFS核心子產品分析1.概述2.HDFS簡述3.NameNode4.DataNode5.總結6.結束語
Hadoop2源碼分析-HDFS核心子產品分析1.概述2.HDFS簡述3.NameNode4.DataNode5.總結6.結束語

  下面我們來分析一下dn的實作,dn的實作包含以下部分,一部分是對本地block的管理,另一部分就是和其他的entity進行資料互動。首

先,我們先看本地的block管理部分。我們在搭建hadoop叢集時,會指定block的存儲路徑,我們可以找到配置的存儲路徑,在hdfs-

site.xml檔案下,内容路徑如下所示:

  然後,我們進入到dn節點上,找到對應的存儲目錄,如下圖所示:

Hadoop2源碼分析-HDFS核心子產品分析1.概述2.HDFS簡述3.NameNode4.DataNode5.總結6.結束語

  這裡面in_use.lock的作用是做一個排斥操作,在對應的應用上面加鎖。然後current目錄存放的是目前有效的block,進入到current目錄後,出現如下圖所示的目錄:

Hadoop2源碼分析-HDFS核心子產品分析1.概述2.HDFS簡述3.NameNode4.DataNode5.總結6.結束語

  version存放着一些檔案的meta,接着還有一系列的block檔案和meta檔案,block檔案是存儲了hdfs中的資料的。存儲的

block,一個block在多個dn節點上有備份,其備份參數可以調節,在hdfs-site.xml檔案中,屬性設定如下所示:

  首先,我們來看datenode的類,部分代碼如下所示:

main函數入口

  下面給出dn類的main函數入口,代碼片段如下所示:

  在研究hdfs的相關子產品時,這裡需要明白各個子產品的功能及作用,這裡為大家介紹了dn類的部分代碼片段,以及給代碼片段重要部分添加了代碼注釋,若是大家需要了解詳細的相關流程及代碼,可以閱讀hadoop的hdfs部分的源代碼。

  這篇部落格就和大家分享到這裡,如果大家在研究學習的過程當中有什麼問題,可以加群進行讨論或發送郵件給我,我會盡我所能為您解答,與君共勉!

繼續閱讀