Hadoop HDFS 基礎使用
目錄
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 ...]] |
常用命令參數介紹:
|
|
|
|
-mkdir |
|
-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 基礎使用