溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

二、hdfs體系架構

發(fā)布時間:2020-06-07 13:43:05 來源:網絡 閱讀:216 作者:隔壁小白 欄目:大數據

[TOC]

一、HDFS體系組成概述

這是一個分布式文件系統(tǒng),適用于于一次寫入多次讀取的場景。包含以下角色:

NameNode(nn):
存儲文件的元數據,如文件名、文件目錄結構,文件屬性等,以及每個文件的塊列表和塊所在的DataNode等。以及響應客戶端對hdfs的讀寫操作,如創(chuàng)建目錄、上傳文件等。還有保存讀寫日志。

DataNode(dn):
在本地文件系統(tǒng)中存儲文件塊數據,以及塊數據的校驗和

SecondaryNameNode(snn):
用來監(jiān)控HDFS狀態(tài)的輔助后臺程序,每隔一段時間獲取HDFS元數據的快照,相當于對NameNode進行備份。

二、HDFS-NameNode

主要職責是管理hdfs的所有節(jié)點。
1、響應客戶端對hdfs的請求,如增刪改查。
2、管理和維護hdfs 的元數據信息以及日志(非log日志)

NameNode會在 core-site.xml中指定的hadoop.tmp.dir 的目錄中 創(chuàng)建目錄:dfs/name/ 。下面我們看看這個目錄的結構。

[root@bigdata121 tmp]# tree dfs/name
dfs/name
├── current
│?? ├── edits_0000000000000000001-0000000000000000002
│?? ├── edits_0000000000000000003-0000000000000000004
│?? ├── edits_0000000000000000005-0000000000000000006
│?? ├── edits_0000000000000000007-0000000000000000008
│?? ├── edits_0000000000000000009-0000000000000000009
│?? ├── edits_0000000000000000010-0000000000000000011
│?? ├── edits_0000000000000000012-0000000000000000013
│?? ├── edits_0000000000000000014-0000000000000000015
│?? ├── edits_0000000000000000016-0000000000000000017
│?? ├── edits_0000000000000000018-0000000000000000019
│?? ├── edits_0000000000000000020-0000000000000000021
│?? ├── edits_0000000000000000022-0000000000000000024
│?? ├── edits_0000000000000000025-0000000000000000026
│?? ├── edits_inprogress_0000000000000000027
│?? ├── fsimage_0000000000000000024
│?? ├── fsimage_0000000000000000024.md5
│?? ├── fsimage_0000000000000000026
│?? ├── fsimage_0000000000000000026.md5
│?? ├── seen_txid
│?? └── VERSION
└── in_use.lock

各個文件目錄的作用如下:

1、current

主要存放hdfs的存儲的數據的元信息和日志。

(1)edits文件

是一個二進制文件,主要記錄對hdfs的增刪改操作的信息,類似于MySQL的二進制日志。其中 edits_inprogress_xxxxx 表示是最新的edits日志,是目前正在使用的。
可以使用命令查看 edits文件的內容:

//格式:hdfs oev -i 輸入文件 -o 輸出文件(xml格式)
[root@bigdata121 current]# hdfs oev -i edits_inprogress_0000000000000000038 -o /tmp/edits_inprogess.xml

[root@bigdata121 current]# cat /tmp/edits_inprogess.xml
<?xml version="1.0" encoding="UTF-8"?>
<EDITS>
  <EDITS_VERSION>-63</EDITS_VERSION>
  <RECORD>
    <OPCODE>OP_START_LOG_SEGMENT</OPCODE>   表示操作的類別,這里是表示日志開始記錄
    <DATA>
      <TXID>38</TXID>  類似于操作的ID,是唯一的
    </DATA>
  </RECORD>
</EDITS>

<RECORD>
    <OPCODE>OP_ADD_BLOCK</OPCODE>     //像這個就表示上傳文件的操作
    <DATA>
      <TXID>34</TXID>
      <PATH>/jdk-8u144-linux-x64.tar.gz._COPYING_</PATH>
      <BLOCK>
        <BLOCK_ID>1073741825</BLOCK_ID>
        <NUM_BYTES>134217728</NUM_BYTES>
        <GENSTAMP>1001</GENSTAMP>
      </BLOCK>
      <BLOCK>
        <BLOCK_ID>1073741826</BLOCK_ID>
        <NUM_BYTES>0</NUM_BYTES>
        <GENSTAMP>1002</GENSTAMP>
      </BLOCK>
      <RPC_CLIENTID></RPC_CLIENTID>
      <RPC_CALLID>-2</RPC_CALLID>
    </DATA>
  </RECORD>

(2)fsimage文件

hdfs中的數據的元數據文件。記錄hdfs文件系統(tǒng)中各個數據塊的信息,但并不是最新的。需要定時將edits文件合并到這里,才是最新的。可以使用命令查看 fsimage 文件的內容:

//格式 : hdfs oiv -p 輸出格式 -i 輸入文件 -o 輸出文件
[root@bigdata121 current]# hdfs oiv -p XML -i fsimage_0000000000000000037 -o /tmp/fsimage37.xml

[root@bigdata121 current]# cat /tmp/fsimage37.xml
<?xml version="1.0"?>
<fsimage><version><layoutVersion>-63</layoutVersion><onDiskVersion>1</onDiskVersion><oivRevision>17e75c2a11685af3e043aa5e604dc831e5b14674</oivRevision></version>
<NameSection><namespaceId>1780930535</namespaceId><genstampV1>1000</genstampV1><genstampV2>1002</genstampV2><genstampV1Limit>0</genstampV1Limit><lastAllocatedBlockId>1073741826</lastAllocatedBlockId><txid>37</txid></NameSection>
<INodeSection><lastInodeId>16387</lastInodeId><numInodes>3</numInodes><inode><id>16385</id><type>DIRECTORY</type><name></name><mtime>1558145602785</mtime><permission>root:supergroup:0755</permission><nsquota>9223372036854775807</nsquota><dsquota>-1</dsquota></inode>
<inode><id>16386</id><type>DIRECTORY</type><name>input</name><mtime>1558105166840</mtime><permission>root:supergroup:0755</permission><nsquota>-1</nsquota><dsquota>-1</dsquota></inode>
<inode><id>16387</id><type>FILE</type><name>jdk-8u144-linux-x64.tar.gz</name><replication>2</replication><mtime>1558145602753</mtime><atime>1558145588521</atime><preferredBlockSize>134217728</preferredBlockSize><permission>root:supergroup:0644</permission><blocks><block><id>1073741825</id><genstamp>1001</genstamp><numBytes>134217728</numBytes></block>
<block><id>1073741826</id><genstamp>1002</genstamp><numBytes>51298114</numBytes></block>
</blocks>
<storagePolicyId>0</storagePolicyId></inode>
</INodeSection>
<INodeReferenceSection></INodeReferenceSection><SnapshotSection><snapshotCounter>0</snapshotCounter><numSnapshots>0</numSnapshots></SnapshotSection>
<INodeDirectorySection><directory><parent>16385</parent><child>16386</child><child>16387</child></directory>
</INodeDirectorySection>
<FileUnderConstructionSection></FileUnderConstructionSection>
<SecretManagerSection><currentId>0</currentId><tokenSequenceNumber>0</tokenSequenceNumber><numDelegationKeys>0</numDelegationKeys><numTokens>0</numTokens></SecretManagerSection><CacheManagerSection><nextDirectiveId>1</nextDirectiveId><numDirectives>0</numDirectives><numPools>0</numPools></CacheManagerSection>
</fsimage>

記錄的信息更為詳細。文件的元數據,如文件權限、時間戳等都有記錄。

(3)seen_txid

txid是類似于事件id的概念,指的是每個操作的一個標識。這個文件中記錄的是最新的txid的下一個,即當前最后一個txid是37,那么該文件記錄的就是38.

(4)fsimage和edit文件命名方式的聯系

edits文件:
我們可以看到edits文件都是 edits_00000xxx-000000xxx的方式命名的,其實意思就是表示該edits文件中記錄了txid操作事件的范圍。而 edit_inprogess_00000xxx 則表示當前所記錄到的最新的txid事件。

fsimage文件:
以fsimage_000000xxx 的方式命名,表示的是該fsimage 文件記錄到的最新的txid事件,請注意,因為fsimage是有條件觸發(fā)之后,edits文件才會合并到fsimage的,否則不會合并。所以一般情況下,edits文件后面的txid肯定是比fsimage 大的。

2、in_use.lock

這個文件主要是對當前的node進行鎖操作,避免當前機器同時啟動多個namenode。只能啟動一個namenode

三、HDFS-DataNode

HDFS的數據節(jié)點,主要就是存儲數據的block文件的。會在指定的目錄下創(chuàng)建一個 dfs/data 目錄,看一下目錄結構:

[root@bigdata122 dfs]# tree data
data
├── current
│?? ├── BP-1130553825-192.168.50.121-1557922928723
│?? │?? ├── current
│?? │?? │?? ├── finalized
│?? │?? │?? │?? └── subdir0
│?? │?? │?? │??     └── subdir0
│?? │?? │?? │??         ├── blk_1073741825
│?? │?? │?? │??         ├── blk_1073741825_1001.meta
│?? │?? │?? │??         ├── blk_1073741826
│?? │?? │?? │??         └── blk_1073741826_1002.meta
│?? │?? │?? ├── rbw
│?? │?? │?? └── VERSION
│?? │?? ├── scanner.cursor
│?? │?? └── tmp
│?? └── VERSION
└── in_use.lock

在HDFS中,文件都是被分割成多個等大的數據塊進行存儲的。
hadoop 1.x 中數據塊默認大小是 64M
hadoop 2.x 中數據塊默認大小是 128M
hadoop 3.x 中不再采用多副本的模式存儲,而是采用糾刪碼技術。
請見 https://www.cnblogs.com/basenet855x/p/7889994.html

在上面的目錄中 blk_xxxxx 的文件其實就是blk文件,每個的大小為指定的塊大小。

四、HDFS-SecondaryNameNode

用來監(jiān)控HDFS狀態(tài)的輔助后臺程序,主要就是輔助 NameNode節(jié)點的工作(并非是 NameNode的備節(jié)點),其中主要工作就是 合并edits文件到fsimage文件。
1、根據 checkpoint的 時間間隔(默認3600秒)或者 edits文件到達64M 的觸發(fā)條件,將edits文件合并fsimage。
2、edits合并到fsimage之后,edits文件可以清空了。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI