1. 程式人生 > >Hadoop HDFS 基礎使用

Hadoop HDFS 基礎使用

進程 管理 計算公式 process 最重要的 lists 大數據 空間 art

目錄

1、HDFS 前言 ................................................................................................................................... 1

2、HDFS 相關概念和特性 ............................................................................................................... 2

2.1、HDFS 設計思路 ................................................................................................................ 2

2.2、HDFS 架構 ........................................................................................................................ 2

2.3、概念和特性 ...................................................................................................................... 3

3、HDFS 優缺點 ............................................................................................................................... 3

3.1、HDFS 優點 ........................................................................................................................ 3

3.2、HDFS 缺點 ........................................................................................................................ 4

4、HDFS 的 shell(命令行客戶端)操作 ............................................................................................ 4

5、HDFS 的 Java API 操作 ................................................................................................................ 7

5.1、利用 eclipse 查看 hdfs 集群的文件信息 ........................................................................ 7

5.2、搭建開發環境 ................................................................................................................ 10

5.3、FileSystem 實例獲取講解(重點) .............................................................................. 14

5.4、DistributedFileSystem 實例所具備的方法介紹............................................................ 14

5.5、HDFS 常用 Java API 代碼演示 ....................................................................................... 15

5.6、HDFS 流式數據訪問 ...................................................................................................... 16

5.7、經典案例 ........................................................................................................................ 17

6、HDFS 核心設計 ......................................................................................................................... 18

6.1、HADOOP 心跳機制(heartbeat) ................................................................................ 18

6.2、HDFS 安全模式 .............................................................................................................. 19

6.3、HDFS 副本存放策略 ...................................................................................................... 20

6.4、負載均衡 ........................................................................................................................ 22

1 、HDFS 前言

  HDFS:Hadoop Distributed File System Hadoop 分布式文件系統,主要用來解決海量數據的存

  儲問題

  1、 設計思想

    分而治之:將大文件,大批量文件,分布式的存放於大量服務器上。以便於采取分而治

    之的方式對海量數據進行運算分析

  2、 在大數據系統架構中的應用

    為各類分布式運算框架(MapReduce,Spark,Tez,Flink,…)提供數據存儲服務

  3、 重點概念:

    數據塊/副本,負載均衡,心跳機制,副本存放策略,元數據/元數據管理,

    安全模式,機架感知…

2 、HDFS 相關概念和特性

2.1 、HDFS 設計思路

  HDFS 被設計成用來使用低廉的服務器來進行海量數據的存儲,那是怎麽做到的呢?
  1 、 大文件被切割成小文件,使用分而治之的思想讓很多服務器對同一個文件進行聯合管理
  2 、 每個小文件做冗余備份,並且分散存到不同的服務器,做到高可靠不丟失

  技術分享圖片

2.2 、HDFS 架構

  主節點 Namenode : 集群老大,掌管文件系統目錄樹,處理客戶端讀且請求

  SecondaryNamenode: : 嚴格 說並不是 namenode 備份節點,主要給 namenode 分擔壓力之用

  從節點 Datanode : 存儲整個集群所有數據塊,處理真正數據讀寫

2.3 、概念和特性

  首先,它是一個文件系統,用於存儲文件,通過統一的命名空間——目錄樹來定位文件其次,它是分布式的,由很多服務器聯合起來

  實現其功能,集群中的服務器都有各自清晰的

  角色定位

  重要特性如下:

  1、HDFS 中的文件在物理上是分塊存儲(block),塊的大小可以通過配置參數

  來規定

  默認大小在 hadoop2.x 版本中是

  分散均勻存儲(dfs.blocksize)=128M,老版本中是 64M

  備份冗余存儲 dfs.replication = 3

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

  如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data

    hdfs://hadoop02:9000/soft/hadoop-2.6.5-centos-6.7.tar.gz

  3、目錄結構及文件分塊位置信息(元數據)的管理由 namenode 節點承擔

  namenode 是 HDFS 集群主節點,負責維護整個 hdfs 文件系統的目錄樹,以及每一個路徑(文

  件)所對應的 block 塊信息(block 的 id,及所在的 datanode 服務器)

  4、文件的各個 block 的存儲管理由 datanode 節點承擔

  datanode 是 HDFS 集群從節點,每一個 block 都可以在多個 datanode 上存儲多個副本(副本

  數量也可以通過參數設置 dfs.replication,默認是 3)

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

  (PS:適合用來做數據分析,並不適合用來做網盤應用,因為,不便修改,延遲大,網絡開

  銷大,成本太高)

3 、HDFS 優缺點

  3.1 、HDFS 優點

可構建在廉價機器上

通過多副本提高可靠性,提供了容錯和恢復機制

高容錯性

數據自動

保存多個副本,副本丟失後,自動恢復

適合批處理

移動計算而非數據,數據位置暴露給計算框架

適合大數據處理

GB、TB、甚至 PB 級數據,百萬規模以上的文件數量,10K+節點規模

流式文件訪問

一次性寫入,多次讀取,保證數據一致性

  3.2 、HDFS 缺點

    不適合於以下操作

低延遲數據訪問

  比如毫秒級

  低延遲與高吞吐率

小文件存取

  占用 NameNode 大量內存 150b* 1000W = 15E,1.5G

  尋道時間超過讀取時間

並發寫入、文件隨機修改

  一個文件只能有一個寫者

  僅支持 append

    HDFS不適合存儲小文件

元信息存儲在 NameNode 內存中

  一個節點的內存是有限的

存取大量小文件消耗大量的尋道時間

  類比拷貝大量小文件與拷貝同等大小的一個大文件

NameNode 存儲 block 數目是有限的

  一個 block 元信息消耗大約 150 byte 內存

  存儲 1 億個 block,大約需要 20GB 內存

  如果一個文件大小為 10K,則 1 億個文件大小僅為 1TB(但要消耗掉 NameNode 20GB內存)


4 、HDFS 的 的 shell( 命令行客戶端) 操作

  HDFS 提供 shell 命令行客戶端,使用方法如下:

  技術分享圖片

  HDFS 支持的其他命令行參數如下:

  [hadoop@hadoop02 ~]$ hadoop fs

[-appendToFile <localsrc> ... <dst>]
[-cat [-ignoreCrc] <src> ...]
[-checksum <src> ...]
[-chgrp [-R] GROUP PATH...]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
Stay hungry Stay foolish -- http://blog.csdn.net/zhongqi2513
[-copyFromLocal [-f] [-p] <localsrc> ... <dst>]
[-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-count [-q] <path> ...]
[-cp [-f] [-p] <src> ... <dst>]
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-df [-h] [<path> ...]]
[-du [-s] [-h] <path> ...]
[-expunge]
[-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-getfacl [-R] <path>]
[-getmerge [-nl] <src> <localdst>]
[-help [cmd ...]]
[-ls [-d] [-h] [-R] [<path> ...]]
[-mkdir [-p] <path> ...]
[-moveFromLocal <localsrc> ... <dst>]
[-moveToLocal <src> <localdst>]
[-mv <src> ... <dst>]
[-put [-f] [-p] <localsrc> ... <dst>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]
[-rm [-f] [-r|-R] [-skipTrash] <src> ...]
[-rmdir [--ignore-fail-on-non-empty] <dir> ...]
[-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
[-setrep [-R] [-w] <rep> <path> ...]
[-stat [format] <path> ...]
[-tail [-f] <file>]
[-test -[defsz] <path>]
[-text [-ignoreCrc] <src> ...]
[-touchz <path> ...]
[-usage [cmd ...]]


  常用命令參數介紹:

-help
功能:輸出這個命令參數手冊
[hadoop@hadoop02 ~]$ hadoop -help
[hadoop@hadoop02 ~]$ hadoop fs -help
[hadoop@hadoop02 ~]$ hadoop fs -help ls

-ls
功能:顯示目錄信息
示例: hadoop fs -ls hdfs://hadoop02:9000/
備註:這些參數中,所有的 hdfs 路徑都可以簡寫成 hadoop fs -ls / 等同上條命令的效果

-mkdir
功能:在 hdfs 上創建目錄
示例:hadoop fs -mkdir -p /aa/bb/cc/dd

-put

功能:等同於 copyFromLocal ,進行文件上傳

示例:hadoop fs -put /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2

-get

功能:等同於 copyToLocal ,就是從 hdfs 下載文件到本地

示例:hadoop fs -get /aaa/jdk.tar.gz

-getmerge

功能:合並下載多個文件

示例:比 getmerge hdfs 的目錄 /aaa/下有多個文件:log.1, log.2,log.3,...

hadoop fs -getmerge /aaa/log.* ./log.sum

-cp

功能:從 hdfs 的一個路徑拷貝 hdfs 的另一個路徑

示例: hadoop fs -cp /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2

-mv

功能:在 hdfs 目錄中移動文件

示例: hadoop fs -mv /aaa/jdk.tar.gz /

-rm

功能:刪除文件或文件夾

示例:hadoop fs -rm -r /aaa/bbb/

-rmdir

功能:刪除空目錄

示例:hadoop fs -rmdir /aaa/bbb/ccc

-moveFromLocal

功能:從本地剪切到 到 hdfs

示例:hadoop fs - moveFromLocal /home/hadoop/a.txt /aa/bb/cc/dd

-moveToLocal

功能:從 hdfs 剪切 到本地

示例:hadoop fs - moveToLocal /aa/bb/cc/dd /home/hadoop/a.txt

-copyFromLocal

功能:從本地文件系統中拷貝文件到 hdfs 文件系統 去

示例:hadoop fs -copyFromLocal ./jdk.tar.gz /aaa/

-copyToLocal

功能:從 hdfs 拷貝到本地

示例:hadoop fs -copyToLocal /aaa/jdk.tar.gz

-appendToFile

功能:追加一個文件到已經存在的文件末尾

示例:hadoop fs -appendToFile ./hello.txt hdfs://hadoop-server01:9000/hello.txt

可以簡寫為:

hadoop fs -appendToFile ./hello.txt /hello.txt

-cat

功能:顯示文件內容

hadoop fs -cat /hello.txt

-tail

功能:顯示一個文件的末尾

示例:hadoop fs -tail /weblog/access_log.1

-text

功能:以字符形式打印一個文件的內容

示例:hadoop fs -text /weblog/access_log.1

-chgrp

-chmod

-chown

功能:linux 文件系統中的用法一樣,對文件所屬權限

示例:

hadoop fs -chmod 666 /hello.txt

hadoop fs -chown someuser:somegrp /hello.txt

-df

功能:統計文件系統的可用空間信息

示例:hadoop fs -df -h /

-du

功能:統計文件夾的大小信息

示例:hadoop fs -du -s -h /aaa/*

-count

功能:統計一個指定目錄下的文件節點數量

示例:hadoop fs -count /aaa/

-setrep

功能:設置 hdfs 中文件的副本數量

示例:hadoop fs -setrep 3 /aaa/jdk.tar.gz

補充:查看 dfs 集群工作狀態的命令

hdfs dfsadmin -report


5 、HDFS 的 的 Java API 操作

  hdfs 在生產應用中主要是客戶端的開發,其核心步驟是從 hdfs 提供的 api 中構造一個 HDFS

  的訪問客戶端對象,然後通過該客戶端對象操作(增刪改查)HDFS 上的文件

  5.1 、用 利用 eclipse 查看 hdfs 集群的文件信息

  1、 下載一個 eclipse 開發工具 eclipse-jee-luna-SR1-win32-x86_64.zip

  2、 解壓到一個文件夾 C:\myProgram\eclipse

  3、 把 hadoop-eclipse-plugin-2.6.5.jar 放入到 eclipse/plugins 文件夾下

  4、 雙擊啟動 eclipse

  技術分享圖片

  5、 將” windows 平臺編譯 hadoop-2.6.1.zip”解壓到 windows 系統下一個文件夾下,文件夾的

    路徑最好不要帶中文。我的目錄是:C:\myProgram\hadoop-2.6.1

  6、 打開了 eclipse 之後,點擊 windows –> prefrences -> 會出現一個對話框。找到如圖所示

    Hadoop MapReduce 選項:然後把你安裝的hadoop 路徑配置上,就是上一步你解壓的那

    個文件夾:C:\myProgram\hadoop-2.6.1

    技術分享圖片

    然後保存
  7、 然後點擊 windows ? show view ? other 在列表中找到圖中這個東西:

    技術分享圖片

    然後雙擊

  8、 會出現這麽一個顯示框,如下圖

    技術分享圖片

  9、 咱們點擊紅框中這個東西,會出現相應的這麽一個對話框,修改相應的信息,

    技術分享圖片

  10、填完以上信息之後,點擊 finish 會出現:

    技術分享圖片

  11、最重要的時候在左上角的這個地方會出現:

    技術分享圖片

    至此,我們便完成了,利用 hadoop 的 eclipse 插件鏈接 hdfs 集群實現查看 hdfs 集群文件的

    功能,大功告成。!!!!恭喜各位

5.2 、 搭建開發環境

  可以有兩種方式:

  第一種:建立普通 java 工程,加入操作 hdfs 的 jar 包

  1、 按鍵 ctrl + N 搜索 java project 建立普通 java 工程,如圖所示:

    技術分享圖片

  2、 輸入項目名字,點擊確定,生成一個普通 java 工程

    技術分享圖片

    註意:建議大家使用jdk的版本和linux服務上的jdk版本一致。在這兒我選擇的都是jdk1.7

    的大版本

  3、 加入依賴 jar,有兩種方式

    A、 先在項目中建立一個文件夾 lib,然後添加 hadoop 安裝包下 share/hadoop/common

      和 share/hadoop/hdfs 下的 jar 和它所依賴的 lib 目錄下的 jar 包,然後把加入的所有

      的 jar 包都 add classpath

    B、 添加自己的依賴庫,具體操作請按圖所示操作進行:

      1、在項目名字上鼠標右鍵選擇 Build Path ,然後點擊右邊出現的 Configure Build Path,

      出現:
      技術分享圖片

      技術分享圖片

      技術分享圖片

      技術分享圖片

      技術分享圖片

      技術分享圖片

      技術分享圖片

      技術分享圖片

      都添加好了,點擊 OK ,再點擊 Finish,再點擊 OK,項目會變成這樣:

      技術分享圖片

      到此表示,我們利用 HDFS 的 api 編寫業務代碼所依賴的 jar 包都添加完成,接下來便可

      以愉快的玩耍代碼了。

  5.3 、FileSystem 實例獲取講解 (重點)

    在 java 中操作 hdfs,首先要獲得一個客戶端實例:

    Configuration conf = new Configuration()

    FileSystem fs = FileSystem.get(conf)

    而我們的操作目標是 HDFS,所以獲取到的 fs 對象應該是 DistributedFileSystem 的實例;

    get 方法是從何處判斷具體實例化那種客戶端類呢?

    --從 conf 中的一個參數 fs.defaultFS 的配置值判斷;

    如果我們的代碼中沒有指定 fs.defaultFS,並且工程 classpath 下也沒有給定相應的配置,conf

    中的默認值就來自於 hadoop 的 jar 包中的 core-default.xml,默認值為: file:///,則獲取的

    將不是一個 DistributedFileSystem 的實例,而是一個本地文件系統的客戶端對象

    技術分享圖片

  5.4 、DistributedFileSystem 實例所具備的方法介紹

    技術分享圖片

  5.5 、HDFS 常用 Java API 代碼演示

    1、 建立文件夾

      技術分享圖片

    2、 上傳文件

      技術分享圖片

    3、 下載文件

      技術分享圖片

    4、 刪除文件或者文件夾

      技術分享圖片

    5、 重命名文件或者文件夾

      技術分享圖片

    6、 查看目錄信息,只顯示該文件夾下的文件信息

      技術分享圖片

    7、 查看文件及文件夾信息

      技術分享圖片

  5.6 、HDFS 流式數據訪問

      

/**

* 相對那些封裝好的方法而言的更底層一些的操作方式 上層那些 mapreduce spark 等運算

框架,去 hdfs 中獲取數據的時候,就是調的這種底層的 api

*/

public class StreamAccess {

FileSystem fs = null;

@Before

public void init() throws Exception {

Configuration conf = new Configuration();

System.setProperty("HADOOP_USER_NAME", "root");

conf.set("fs.defaultFS", "hdfs:// hadoop01:9000");

fs = FileSystem.get(conf);

// fs = FileSystem.get(new URI("hdfs://hadoop01:9000"), conf, "hadoop");

}

@Test

public void testDownLoadFileToLocal() throws IllegalArgumentException,IOException {

// 先獲取一個文件的輸入流----針對 hdfs 上的

FSDataInputStream in = fs.open(new Path("/jdk-7u65-linux-i586.tar.gz"));

// 再構造一個文件的輸出流----針對本地的

FileOutputStream out = new FileOutputStream(new File("c:/jdk.tar.gz"));

// 再將輸入流中數據傳輸到輸出流

IOUtils.copyBytes(in, out, 4096);

}

@Test

public void testUploadByStream() throws Exception {

// hdfs 文件的輸出流

FSDataOutputStream fsout = fs.create(new Path("/aaa.txt"));

// 本地文件的輸入流

FileInputStream fsin = new FileInputStream("c:/111.txt");

IOUtils.copyBytes(fsin, fsout, 4096);

}

/**

* hdfs 支持隨機定位進行文件讀取,而且可以方便地讀取指定長度 用於上層分布式運

算框架並發處理數據

*/

@Test

public void testRandomAccess() throws IllegalArgumentException, IOException {

// 先獲取一個文件的輸入流----針對 hdfs 上的

FSDataInputStream in = fs.open(new Path("/iloveyou.txt"));

// 可以將流的起始偏移量進行自定義

in.seek(22);

// 再構造一個文件的輸出流----針對本地的

FileOutputStream out = new FileOutputStream(new File("d:/iloveyou.line.2.txt"));

IOUtils.copyBytes(in, out, 19L, true);

}

}

  5.7 、 經典案例

    在 mapreduce 、spark 等運算框架中,有一個核心思想就是將運算移往數據,或者說,就是

    要在並發計算中盡可能讓運算本地化,這就需要獲取數據所在位置的信息並進行相應範圍讀

    取。以下模擬實現:獲取一個文件的所有 block 位置信息,然後讀取指定 block 中的內容

    

@Test

public void testCat() throws IllegalArgumentException, IOException {

FSDataInputStream in = fs.open(new Path("/weblog/input/access.log.10"));

// 拿到文件信息

FileStatus[] listStatus = fs.listStatus(new Path("/weblog/input/access.log.10"));

// 獲取這個文件的所有 block 的信息

BlockLocation[] fileBlockLocations = fs.getFileBlockLocations(

listStatus[0], 0L, listStatus[0].getLen());

// 第一個 block 的長度

long length = fileBlockLocations[0].getLength();

// 第一個 block 的起始偏移量

long offset = fileBlockLocations[0].getOffset();

System.out.println(length);

System.out.println(offset);

// 獲取第一個 block 寫入輸出流

// IOUtils.copyBytes(in, System.out, (int)length);

byte[] b = new byte[4096];

FileOutputStream os = new FileOutputStream(new File("d:/block0"));

while (in.read(offset, b, 0, 4096) != -1) {

os.write(b);

offset += 4096;

if (offset > length)

return;

}

os.flush();

os.close();

in.close();

}

6 、HDFS 核心設計

  6.1 、HADOOP 心跳機制(heartbeat )

    1、 Hadoop 是 Master/Slave 結構,Master 中有 NameNode 和 ResourceManager,Slave 中有

      Datanode 和 NodeManager

    2、 Master 啟動的時候會啟動一個 IPC(Inter-Process Comunication,進程間通信)server 服

      務,等待 slave 的鏈接

    3、 Slave 啟動時,會主動鏈接 master 的 ipc server 服務,並且每隔 3 秒鏈接一次 master,這

      個間隔時間是可以調整的,參數為 dfs.heartbeat.interval,這個每隔一段時間去連接一次

      的機制,我們形象的稱為心跳。Slave 通過心跳匯報自己的信息給 master,master 也通

      過心跳給 slave 下達命令

    4、 NameNode 通過心跳得知 Datanode 的狀態

      ResourceManager 通過心跳得知 NodeManager 的狀態

    5、 如果 master 長時間都沒有收到 slave 的心跳,就認為該 slave 掛掉了。!!!!!

      Namenode 感知到 Datanode 掉線死亡的時長計算:

HDFS 默認的超時時間為 10 分鐘+30 秒。

這裏暫且定義超時時間為 timeout

計算公式為:

timeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval

而默認的 heartbeat.recheck.interval 大小為 5 分鐘,dfs.heartbeat.interval 默認的大小為 3 秒。

需要註意的是 hdfs-site.xml 配置文件中的 heartbeat.recheck.interval 的單位為毫秒,

dfs.heartbeat.interval 的單位為秒

所以,舉個例子,如果 heartbeat.recheck.interval 設置為 5000(毫秒),dfs.heartbeat.interval

設置為 3(秒,默認),則總的超時時間為 40

<property>

<name>heartbeat.recheck.interval</name>

<value>5000</value>

</property>

<property>

<name>dfs.heartbeat.interval</name>

<value>3</value>

</property>

  6.2 、HDFS 安全模式

    問題引出:集群啟動後,可以查看目錄,但是上傳文件時報錯,打開web頁面可看到namenode

    正處於 safemode 狀態,怎麽處理?

    解釋:safemode 是 namenode 的一種狀態(active/standby/safemode 安全模式)

  

    namenode 進入安全模式的原理:

      a、 namenode 發現集群中的 block 丟失率達到一定比例時(0.1%),namenode 就會進入

      安全模式,在安全模式下,客戶端不能對任何數據進行操作,只能查看元數據信息(比如 ls/mkdir)

      這個丟失率是可以手動配置的,默認是 dfs.safemode.threshold.pct=0.999f

      b、如何退出安全模式?

        1、找到問題所在,進行修復(比如修復宕機的 datanode)

        2、或者可以手動強行退出安全模式(但是並沒有真正解決問題)

    在 hdfs 集群正常冷啟動時,namenode 也會在 safemode 狀態下維持相當長的一段時間,此

    時你不需要去理會,等待它自動退出安全模式即可

    正常啟動的時候進入安全的原理:

    (原理:namenode 的內存元數據中,包含文件路徑、副本數、blockid,及每一個 block 所在

    datanode 的信息,而 fsimage 中,不包含 block 所在的 datanode 信息,那麽,當 namenode

    冷啟動時,此時內存中的元數據只能從 fsimage 中加載而來,從而就沒有 block 所在的

    datanode 信息——>就會導致 namenode 認為所有的 block 都已經丟失——>進入安全模式—

    —>datanode 啟動後,會定期向 namenode 匯報自身所持有的 blockid 信息,——>隨著

    datanode 陸續啟動,從而陸續匯報 block 信息,namenode 就會將內存元數據中的 block 所

    在 datanode 信息補全更新——>找到了所有 block 的位置,從而自動退出安全模式)

    安全模式常用操作命令:

    hdfs dfsadmin -safemode leave //強制 NameNode 退出安全模式

    hdfs dfsadmin -safemode enter //進入安全模式

    hdfs dfsadmin -safemode get //查看安全模式狀態

    hdfs dfsadmin -safemode wait //等待,一直到安全模式結束

    如果你使用的版本是 2.X 之前的版本,那麽這個 hdfs 命令可以替換成 hadoop,它們都在 bin

    目錄下

  6.3 、HDFS 副本存放策略

    1、 作用:

      數據分塊存儲和副本的存放,是保證可靠性和高性能的關鍵

    2、 方法:

      將每個文件的數據進行分塊存儲,每一個數據塊又保存有多個副本,這些數據塊副本分

      布在不同的機器節點上

      技術分享圖片

    3、 存放說明:

    在多數情況下,HDFS 默認的副本系數是 3

    Hadoop 默認對 3 個副本的存放策略如下圖:其中 Block1,Block2,Block3 分別表示 Block

    的三個副本:

    技術分享圖片

    第一個block副本放在和client所在的node裏(如果client不在集群範圍內,則這第一個node

    是隨機選取的,系統會嘗試不選擇哪些太滿或者太忙的 node)。

    第二個副本放置在與第一個節點不同的機架中的 node 中(近乎隨機選擇,系統會嘗試不選

    擇哪些太滿或者太忙的 node)。

    第三個副本和第二個在同一個機架,隨機放在不同的 node 中。

  4、 修改副本數:

    第一種方式:修改集群文件 hdfs-site.xml

<property>
<name>dfs.replication</name>
<value>1</value>
</property>

    第二種方式:命令設置

    bin/hadoop fs -setrep -R 1 /

  6.4 、 負載均衡

    機器與機器之間磁盤利用率不平衡是 HDFS 集群非常容易出現的情況

    尤其是在 DataNode 節點出現故障或在現有的集群上增添新的 DataNode 的時候分析數據塊

    分布和重新均衡 DataNode 上的數據分布的工具

    命令:sbin/start-balancer.sh

       sbin/start-balancer.sh -threshold 5

    自動進行均衡非常慢,一天能移動的數據量在 10G-10T 的級別,很難滿足超大集群的需求

    原因:HDFS 集群默認不允許 balance 操作占用很大的網絡帶寬,這個帶寬是可以調整的

    hdfs dfsadmin -setBalanacerBandwidth newbandwidth

    hdfs dfsadmin -setBalanacerBandwidth 10485760

    該數值的單位是字節,上面的配置是 10M/s,默認是 1M/s

    另外,也可以在 hdfs-site.xml 配置文件中進行設置:

<property>
<name>dfs.balance.bandwidthPerSec</name>
<value>10485760</value>
<description> Specifies the maximum bandwidth that each datanode can utilize for the
balancing purpose in term of the number of bytes per second. </description>
</property>


    sbin/start-balancer.sh -t 10%

    機器容量最高的那個值 和 最低的那個值得差距 不能超過 10%

  

Hadoop HDFS 基礎使用