來講述,前面我們對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中檔案目錄和檔案配置設定的管理者,儲存的重要資訊如下所示:
在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節點資訊存儲,部分截圖資訊如下所示:
下面我們來分析一下dn的實作,dn的實作包含以下部分,一部分是對本地block的管理,另一部分就是和其他的entity進行資料互動。首
先,我們先看本地的block管理部分。我們在搭建hadoop叢集時,會指定block的存儲路徑,我們可以找到配置的存儲路徑,在hdfs-
site.xml檔案下,内容路徑如下所示:
然後,我們進入到dn節點上,找到對應的存儲目錄,如下圖所示:
這裡面in_use.lock的作用是做一個排斥操作,在對應的應用上面加鎖。然後current目錄存放的是目前有效的block,進入到current目錄後,出現如下圖所示的目錄:
version存放着一些檔案的meta,接着還有一系列的block檔案和meta檔案,block檔案是存儲了hdfs中的資料的。存儲的
block,一個block在多個dn節點上有備份,其備份參數可以調節,在hdfs-site.xml檔案中,屬性設定如下所示:
首先,我們來看datenode的類,部分代碼如下所示:
main函數入口
下面給出dn類的main函數入口,代碼片段如下所示:
在研究hdfs的相關子產品時,這裡需要明白各個子產品的功能及作用,這裡為大家介紹了dn類的部分代碼片段,以及給代碼片段重要部分添加了代碼注釋,若是大家需要了解詳細的相關流程及代碼,可以閱讀hadoop的hdfs部分的源代碼。
這篇部落格就和大家分享到這裡,如果大家在研究學習的過程當中有什麼問題,可以加群進行讨論或發送郵件給我,我會盡我所能為您解答,與君共勉!