溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Hadoop 之 HDFS

發(fā)布時(shí)間:2020-06-05 05:54:21 來(lái)源:網(wǎng)絡(luò) 閱讀:16772 作者:灰白世界 欄目:大數(shù)據(jù)

1 HDFS 概述

1.1 HDFS 產(chǎn)出背景及定義

隨著數(shù)據(jù)量越來(lái)越大,在一個(gè)操作系統(tǒng)存不下所有的數(shù)據(jù),那么就分配到更多的操作系統(tǒng)管理的磁盤(pán)中,但是不方便管理和維護(hù),迫切需要一種系統(tǒng)來(lái)管理多臺(tái)機(jī)器上的文件,這就是分布式文件管理系統(tǒng)。HDFS只是分布式文件管理系統(tǒng)中的一種。

HDFS(Hadoop Distributed File System),它是一個(gè)文件系統(tǒng),用于存儲(chǔ)文件,通過(guò)目錄樹(shù)來(lái)定位文件;其次,它是分布式的,由很多服務(wù)器聯(lián)合起來(lái)實(shí)現(xiàn)其功能,集群中的服務(wù)器有各自的角色。

HDFS的使用場(chǎng)景:適合一次寫(xiě)入,多次讀出的場(chǎng)景,且不支持文件的修改。適合用來(lái)做數(shù)據(jù)分析,并不適合用來(lái)做網(wǎng)盤(pán)應(yīng)用。

1.2 HDFS優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

  • 高容錯(cuò)性
    • 數(shù)據(jù)自動(dòng)保存多個(gè)副本。它通過(guò)增加副本的形式,提高容錯(cuò)性
    • 某一個(gè)副本丟失以后,它可以自動(dòng)恢復(fù)
  • 適合處理大數(shù)據(jù)
  • 可構(gòu)建在廉價(jià)機(jī)器上,通過(guò)多副本機(jī)制,提高可靠性

缺點(diǎn):

  • 不適合低延時(shí)數(shù)據(jù)訪問(wèn),比如毫秒級(jí)的存儲(chǔ)數(shù)據(jù)
  • 無(wú)法高效的對(duì)大量小文件進(jìn)行存儲(chǔ)
  • 不支持并發(fā)寫(xiě)入、文件隨機(jī)修改

1.3 HDFS組成架構(gòu)

Hadoop 之 HDFS

Hadoop 之 HDFS

1.4 HDFS文件塊大小

HDFS 中的文件在物理上是分塊存儲(chǔ)(Block),塊的大小可以通過(guò)配置參數(shù)(dfs.blocksize)來(lái)規(guī)定,默認(rèn)大小在Hadoop2.x 版本中是 128M,老版本中是 64M。

如果尋址時(shí)間為 100ms,即查找目標(biāo) Block 的時(shí)間是 100ms。

尋址時(shí)間與傳輸時(shí)間的比例為 100 : 1為最佳狀態(tài),因此傳輸時(shí)間為 1ms。

目前磁盤(pán)的傳輸速率大概在 100MB/s,取個(gè)整大概就是 128MB。

2 HDFS 的 Shell 操作

(1)-help:輸出這個(gè)命令參數(shù)

(2)-ls:顯示目錄信息

(3)-mkdir:在 HDFS 上創(chuàng)建目錄

(4)-moveFromLocal:從本地剪切粘貼到 HDFS

(5)-appendToFile:追加一個(gè)文件到已經(jīng)存在的文件末尾

(6)-cat:顯示文件內(nèi)容

(7)-chgrp 、-chmod、-chown:Linux 文件系統(tǒng)中的用法一樣,修改文件所屬權(quán)限

(8)-copyFromLocal:從本地文件系統(tǒng)中拷貝文件到 HDFS 路徑去

(9)-copyToLocal:從 HDFS 拷貝到本地

(10)-cp :從 HDFS 的一個(gè)路徑拷貝到 HDFS 的另一個(gè)路徑

(11)-mv:在 HDFS 目錄中移動(dòng)文件

(12)-get:等同于 copyToLocal,就是從 HDFS 下載文件到本地

(13)-getmerge:合并下載多個(gè)文件,比如 HDFS 的目錄 /user/djm/test 下有多個(gè)文件:log.1, log.2,log.3,...

(14)-put:等同于 copyFromLocal

(15)-tail:顯示一個(gè)文件的末尾

(16)-rm:刪除文件或文件夾

(17)-rmdir:刪除空目錄

(18)-du:統(tǒng)計(jì)文件夾的大小信息

(19)-setrep:設(shè)置 HDFS 中文件的副本數(shù)量

3 HDFS 客戶端操作

package com.djm.hdfsclient;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.net.URI;

public class HdfsClient {

    FileSystem fileSystem = null;

    @Before
    public void init() {

        try {
            fileSystem = FileSystem.get(URI.create("hdfs://hadoop102:9000"), new Configuration(), "djm");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 上傳文件
     */
    @Test
    public void put() {
        try {
            fileSystem.copyFromLocalFile(new Path("C:\\Users\\Administrator\\Desktop\\Hadoop 入門(mén).md"), new Path("/"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 下載文件
     */
    @Test
    public void download() {
        try {
            // useRawLocalFileSystem表示是否開(kāi)啟文件校驗(yàn)
            fileSystem.copyToLocalFile(false, new Path("/Hadoop 入門(mén).md"), new Path("C:\\Users\\Administrator\\Desktop\\Hadoop 入門(mén)1.md"), true);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 刪除文件
     */
    @Test
    public void delete() {
        try {
            // recursive表示是否遞歸刪除
            fileSystem.delete(new Path("/Hadoop 入門(mén).md"), true);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 文件重命名
     */
    @Test
    public void rename() {
        try {
            fileSystem.rename(new Path("/tmp"), new Path("/temp"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 查看文件信息
     */
    @Test
    public void ls() {
        try {
            RemoteIterator<locatedfilestatus> listFiles = fileSystem.listFiles(new Path("/etc"), true);
            while (listFiles.hasNext()) {
                LocatedFileStatus fileStatus = listFiles.next();
                if (fileStatus.isFile()) {
                    // 僅輸出文件信息
                    System.out.print(fileStatus.getPath().getName() + "   " + fileStatus.getLen() + "   " + fileStatus.getPermission() + "   "  + fileStatus.getGroup() + "   ");
                    // 獲取文件塊信息
                    BlockLocation[] blockLocations = fileStatus.getBlockLocations();
                    for (BlockLocation blockLocation : blockLocations) {
                        // 獲取節(jié)點(diǎn)信息
                        String[] hosts = blockLocation.getHosts();
                        for (String host : hosts) {
                            System.out.print(host + "   ");
                        }
                    }
                    System.out.println();
                }

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @After
    public void exit() {
        try {
            fileSystem.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4 HDFS 的數(shù)據(jù)流

4.1 HDFS寫(xiě)數(shù)據(jù)流程

4.1.1 剖析文件寫(xiě)入

Hadoop 之 HDFS

1、客戶端通過(guò) Distributed FileSystem 模塊向 NameNode 請(qǐng)求上傳文件,NameNode 檢查目標(biāo)文件是否已存在,父目錄是否存在。

2、NameNode 返回是否可以上傳。

3、客戶端請(qǐng)求第一個(gè) Block 上傳到哪幾個(gè) DataNode。

4、NameNode 返回三個(gè)節(jié)點(diǎn),分別是 dn1、dn2、dn3。

5、客戶端通過(guò) FSDataOutputStream 模塊請(qǐng)求 dn1 上傳數(shù)據(jù),dn1 收到請(qǐng)求會(huì)繼續(xù)調(diào)用 dn2,然后 dn2 調(diào)用 dn3,將這個(gè)通信管道建立完成。

6、按倒序逐級(jí)響應(yīng)客戶端。

7、客戶端開(kāi)始往 dn1 上傳第一個(gè) Block(先從磁盤(pán)讀取數(shù)據(jù)放到一個(gè)本地內(nèi)存緩存),以 Packet 為單位,dn1 收到一個(gè)Packet 就會(huì)傳給 dn2,dn2 傳給 dn3;dn1 每傳一個(gè) packet 會(huì)放入一個(gè)應(yīng)答隊(duì)列等待應(yīng)答。

8、當(dāng)一個(gè)Block傳輸完成之后,客戶端再次請(qǐng)求NameNode上傳第二個(gè)Block的服務(wù)器。

4.1.2 網(wǎng)絡(luò)拓?fù)?節(jié)點(diǎn)距離計(jì)算

在HDFS寫(xiě)數(shù)據(jù)的過(guò)程中,NameNode會(huì)選擇距離待上傳數(shù)據(jù)最近距離的DataNode接收數(shù)據(jù)。那么這個(gè)最近距離怎么計(jì)算呢?

Hadoop 之 HDFS

4.1.3 機(jī)架感知

Hadoop 之 HDFS

4.2 HDFS讀數(shù)據(jù)流程

Hadoop 之 HDFS

1、客戶端通過(guò) Distributed FileSystem 向 NameNode 請(qǐng)求下載文件,NameNode通過(guò)查詢?cè)獢?shù)據(jù),找到文件塊所在的DataNode地址。

2、根據(jù)就近原則挑選一臺(tái) DataNode,請(qǐng)求讀取數(shù)據(jù)。

3、DataNode 開(kāi)始傳輸數(shù)據(jù)給客戶端。

4、客戶端以 Packet 為單位接收,先在本地緩存,然后寫(xiě)入目標(biāo)文件。

5 NameNode 和 SecondaryNameNode

5.1 NN 和 2NN 工作機(jī)制

如果存儲(chǔ)在 NameNode 節(jié)點(diǎn)的磁盤(pán)中,因?yàn)榻?jīng)常需要進(jìn)行隨機(jī)訪問(wèn),還有響應(yīng)客戶請(qǐng)求,必然是效率過(guò)低,因此,元數(shù)據(jù)必須存放在內(nèi)存中,周所周知,內(nèi)存的特點(diǎn)是速度快,斷電后丟失數(shù)據(jù),一旦斷電,元數(shù)據(jù)丟失,整個(gè)集群就無(wú)法工作了,因此產(chǎn)生了用于備份元數(shù)據(jù)的 FsImage。

但是這樣又會(huì)引發(fā)一個(gè)問(wèn)題,當(dāng)內(nèi)存中的元數(shù)據(jù)更新時(shí),F(xiàn)sImage 是否要同時(shí)更新,如果要同步更新,就會(huì)導(dǎo)致效率低,如果不同步更新,就會(huì)導(dǎo)致數(shù)據(jù)一致性問(wèn)題,一旦突然斷電,就會(huì)丟失一部分?jǐn)?shù)據(jù),因此,引入了 Edits(只進(jìn)行追加操作,效率很高),每當(dāng)元數(shù)據(jù)進(jìn)行增加或者修改時(shí),先追加到 Edits,在修改內(nèi)存,這樣的話,一旦斷電,可以通過(guò) FsImage 和 Edits 合成元數(shù)據(jù)。

但是,如果長(zhǎng)時(shí)間添加數(shù)據(jù)到 Edits,導(dǎo)致 Edits 過(guò)大,還是會(huì)影響效率,而且一旦斷電,恢復(fù)元數(shù)據(jù)的時(shí)間也會(huì)相應(yīng)增加,因此,需要定期的對(duì) FsImage 和 Edits 進(jìn)行合并,如果這個(gè)操作由 NameNode 去完成,又會(huì)效率低(因?yàn)樵诤喜⒑蟛荒芴幚韺?xiě)請(qǐng)求),所以引入了 SecondaryNameNode,專門(mén)用來(lái)做合并操作。

Hadoop 之 HDFS

NameNode 工作:

1、第一次啟動(dòng) NameNode格式化后,創(chuàng)建 Fsimage 和 Edits 文件,如果不是第一次啟動(dòng),直接加載編輯日志和鏡像文件到內(nèi)存。

2、客戶端對(duì)元數(shù)據(jù)進(jìn)行增刪改操作。

3、NameNode 記錄操作日志,更新滾動(dòng)日志。

4、NameNode 在內(nèi)存中對(duì)元數(shù)據(jù)進(jìn)行增刪改操作。

Secondary NameNode 工作:

1、Secondary NameNode 詢問(wèn) NameNode 是否需要 CheckPoint,直接帶回 NameNode 是否檢查結(jié)果。

2、Secondary NameNode請(qǐng)求執(zhí)行CheckPoint。

3、NameNode 滾動(dòng)正在寫(xiě)的 Edits 日志。

4、將滾動(dòng)前的編輯日志和鏡像文件拷貝到 Secondary NameNode。

5、Secondary NameNode 加載編輯日志和鏡像文件到內(nèi)存合并。

6、生成新的鏡像文件 fsimage.chkpoint。

7、拷貝 fsimage.chkpoint 到 NameNode。

8、NameNode 將 fsimage.chkpoint 重命名為 fsimage。

5.2 Fsimage 和 Edits 解析

Hadoop 之 HDFS

oiv 查看Fsimage 文件

  • hdfs oiv -p 文件類型 -i鏡像文件 -o 轉(zhuǎn)換后文件輸出路徑

oev 查看 Edits 文件

  • hdfs oev -p 文件類型 -i編輯日志 -o 轉(zhuǎn)換后文件輸出路徑

5.3 CheckPoint 時(shí)間設(shè)置

滿足以下兩個(gè)條件都會(huì)觸發(fā)合并操作:

通常情況下,SecondaryNameNode 每隔一小時(shí)執(zhí)行一次。

  • [hdfs-default.xml]

    <property>
    <name>dfs.namenode.checkpoint.period</name>
    <value>3600</value>
    </property>

一分鐘檢查一次操作次數(shù),當(dāng)次數(shù)到達(dá) 100 萬(wàn)次就會(huì)觸發(fā)操作。

  • [hdfs-default.xml]

    <property>
      <name>dfs.namenode.checkpoint.txns</name>
      <value>1000000</value>
      <description>操作動(dòng)作次數(shù)</description>
    </property>
    
    <property>
      <name>dfs.namenode.checkpoint.check.period</name>
      <value>60</value>
      <description> 1分鐘檢查一次操作次數(shù)</description>
    </property>

5.4 NameNode 故障處理

NameNode 故障后,可以采用如下兩種方法恢復(fù)數(shù)據(jù):

將 2NN 中的數(shù)據(jù)拷貝到 NN 存儲(chǔ)數(shù)據(jù)的目錄。

使用 -importCheckpoint 選項(xiàng)啟動(dòng) NN 守護(hù)進(jìn)程,從而將 2NN 中數(shù)據(jù)拷貝到 NN 目錄中。

  • hdfs namenode -importCheckpoint

5.5 集群安全模式

Hadoop 之 HDFS

基本命令:

hdfs dfsadmin -safemode get:查看安全模式狀態(tài)

hdfs dfsadmin -safemode enter:進(jìn)入安全模式狀態(tài)

hdfs dfsadmin -safemode leave:離開(kāi)安全模式狀態(tài)

hdfs dfsadmin -safemode wait:等待安全模式狀態(tài)

6 DataNode

6.1 DataNode工作機(jī)制

Hadoop 之 HDFS

1、一個(gè)數(shù)據(jù)塊在 DataNode 上以文件形式存儲(chǔ)在磁盤(pán)上,包括兩個(gè)文件,一個(gè)是數(shù)據(jù)本身,一個(gè)是元數(shù)據(jù)包括數(shù)據(jù)塊的長(zhǎng)度,塊數(shù)據(jù)的校驗(yàn)和,以及時(shí)間戳。

2、DataNode 啟動(dòng)后向 NameNode 注冊(cè),通過(guò)后,周期性(1小時(shí))的向 NameNode 上報(bào)所有的塊信息。

3、心跳是每 3 秒一次,心跳返回結(jié)果帶有 NameNode 給該 DataNode 的命令如復(fù)制塊數(shù)據(jù)到另一臺(tái)機(jī)器,或刪除某個(gè)數(shù)據(jù)塊,如果超過(guò) 10 分鐘沒(méi)有收到某個(gè) DataNode 的心跳,則認(rèn)為該節(jié)點(diǎn)不可用。

4、集群運(yùn)行中可以安全加入和退出一些機(jī)器。

6.2 數(shù)據(jù)完整性

Hadoop 之 HDFS

1、當(dāng) DataNode 讀取 Block 的時(shí)候,它會(huì)計(jì)算 CheckSum。

2、如果計(jì)算后的 CheckSum,與 Block 創(chuàng)建時(shí)值不一樣,說(shuō)明 Block 已經(jīng)損壞。

3、Client 讀取其他 DataNode 上的 Block。

4、在其文件創(chuàng)建后周期驗(yàn)證。

6.3 掉線時(shí)限參數(shù)設(shè)置

Hadoop 之 HDFS

[hdfs-site.xml]

<property>
    <name>dfs.namenode.heartbeat.recheck-interval</name>
    <value>300000</value>
    <description>毫秒</description>
</property>
<property>
    <name>dfs.heartbeat.interval</name>
    <value>3</value>
    <description>秒</description>
</property>

6.4 服役新數(shù)據(jù)節(jié)點(diǎn)

將 hadoop102 上的 java、hadoop、profile 發(fā)送到新主機(jī),source 一下 profile,直接啟動(dòng)即可加入集群。

6.5 退役舊數(shù)據(jù)節(jié)點(diǎn)

6.5.1 黑名單設(shè)置

創(chuàng)建黑名單

[djm@hadoop101 hadoop]$ touch blacklist 

配置加入黑名單的主機(jī)

hadoop102

配置 hdfs-site.xml

<property>
    <name>dfs.hosts.exclude</name>
    <value>/opt/module/hadoop-2.7.2/etc/hadoop/blacklist</value>
</property>

刷新 namenodes

[djm@hadoop102 hadoop-2.7.2]$ hdfs dfsadmin -refreshNodes

更新 ResourceManager 節(jié)點(diǎn)

[djm@hadoop102 hadoop-2.7.2]$ yarn rmadmin -refreshNodes

如果數(shù)據(jù)不均衡,可以用命令實(shí)現(xiàn)集群的再平衡

[djm@hadoop102 hadoop-2.7.2]$ start-balancer.sh
6.5.2 白名單設(shè)置

創(chuàng)建白名單

[djm@hadoop101 hadoop]$ touch whitelist 

配置加入黑名單的主機(jī)

hadoop102
hadoop103
hadoop104

配置 hdfs-site.xml

<property>
    <name>dfs.hosts</name>
    <value>/opt/module/hadoop-2.7.2/etc/hadoop/whitelist</value>
</property>

刷新 namenodes

[djm@hadoop102 hadoop-2.7.2]$ hdfs dfsadmin -refreshNodes

更新 ResourceManager 節(jié)點(diǎn)

[djm@hadoop102 hadoop-2.7.2]$ yarn rmadmin -refreshNodes

如果數(shù)據(jù)不均衡,可以用命令實(shí)現(xiàn)集群的再平衡

[djm@hadoop102 hadoop-2.7.2]$ start-balancer.sh

黑白名單的區(qū)別:

白名單比較嚴(yán)格,黑名單比較平緩,處于黑名單中的主機(jī)會(huì)同步數(shù)據(jù)結(jié)束后繼續(xù)處于集群,只是不在處理請(qǐng)求而已,而不處于白名單中的主機(jī)會(huì)直接被干掉。

6.6 Datanode多目錄配置

DataNode也可以配置成多個(gè)目錄,每個(gè)目錄存儲(chǔ)的數(shù)據(jù)不一樣,即:數(shù)據(jù)不是副本。

hdfs-site.xml

<property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///${hadoop.tmp.dir}/dfs/data1,file:///${hadoop.tmp.dir}/dfs/data2</value>
</property>

7 HDFS 2.X新特性

7.1 集群間數(shù)據(jù)拷貝

采用 distcp 命令實(shí)現(xiàn)兩個(gè) Hadoop 集群之間的遞歸數(shù)據(jù)復(fù)制

[djm@hadoop102 hadoop-2.7.2]$  hadoop distcp hdfs://haoop102:9000/user/djm/hello.txt hdfs://hadoop103:9000/user/djm/hello.txt

7.2 小文件存檔

Hadoop 之 HDFS

歸檔文件

[djm@hadoop102 hadoop-2.7.2]$ hadoop archive -archiveName input.har –p  /user/djm/input   /user/djm/output

查看歸檔

[djm@hadoop102 hadoop-2.7.2]$ hadoop fs -lsr har:///user/djm/output/input.har

解歸檔文件

[atguigu@djm hadoop-2.7.2]$ hadoop fs -cp har:/// user/djm/output/input.har/*    /user/djm

</locatedfilestatus>

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI