0x01 前言
??如果您覺得本文對您有幫助哪亿,請贊賞重荠,謝謝备闲。
??Hadoop 分布式文件系統(tǒng)(HDFS)被設計成適合運行在通用硬件(commodity hardware)上的分布式文件系統(tǒng)。它和現(xiàn)有的分布式文件系統(tǒng)有很多共同點挡篓。但同時父款,它和其他的分布式文件系統(tǒng)的區(qū)別也是很明顯的。HDFS 是一個高度容錯性的系統(tǒng)瞻凤,適合部署在廉價的機器上憨攒。HDFS 能提供高吞吐量的數(shù)據(jù)訪問,非常適合大規(guī)模數(shù)據(jù)集上的應用阀参。HDFS 放寬了一部分 POSIX 約束肝集,來實現(xiàn)流式讀取文件系統(tǒng)數(shù)據(jù)的目的。HDFS 在最開始是作為 Apache Nutch 搜索引擎項目的基礎架構而開發(fā)的蛛壳。HDFS 是 Apache Hadoop Core 項目的一部分杏瞻。
0x02 HDFS 概述
0x01 HDFS 的優(yōu)缺點
HDFS 優(yōu)點
高容錯性:數(shù)據(jù)自動保存多個副本,副本丟失后衙荐,自動恢復捞挥。
適合批處理:移動計算而飛數(shù)據(jù)。數(shù)據(jù)位置暴露給計算框架忧吟。
適合大數(shù)據(jù)處理:GB砌函,TB,設置PB級數(shù)據(jù)溜族。百萬規(guī)模以上文件數(shù)量讹俊。10K+ 節(jié)點規(guī)模。
流式文件訪問:一次性寫入煌抒,多次讀取仍劈。保證數(shù)據(jù)一致性。
可構建在廉價機器上:通過多副本提高可靠性寡壮。提供容錯和恢復機制贩疙。
HDFS 缺點
不適合低延遲數(shù)據(jù)訪問場景:比如毫秒級讹弯,低延遲與高吞吐率。
不適合小文件存取場景:占用 NameNode 大量內(nèi)存这溅。尋道時間超過讀取時間闸婴。
不適合并發(fā)寫入,文件隨機修改場景:一個文件只能有一個寫者芍躏。僅支持 append邪乍。
0x02 HDFS 的組成
??HDFS 采用 Master/Slave 的架構來存儲數(shù)據(jù),這種架構主要由四個部分組成对竣,分別為 HDFS Client庇楞、NameNode、DataNode 和 Secondary NameNode否纬。下面我們分別介紹這四個組成部分吕晌。
Client:就是客戶端
??文件切分。文件上傳 HDFS 的時候临燃,Client 將文件切分成 一個一個的Block睛驳,然后進行存儲。
??與 NameNode 交互膜廊,獲取文件的位置信息乏沸。
??與 DataNode 交互,讀取或者寫入數(shù)據(jù)爪瓜。
??Client 提供一些命令來管理 HDFS蹬跃,比如啟動或者關閉 HDFS。
??Client 可以通過一些命令來訪問 HDFS铆铆。
NameNode:就是 master蝶缀,它是一個主管、管理者
??管理 HDFS 的名稱空間薄货。
??配置副本策略翁都。當副本數(shù)低于規(guī)定數(shù)之后,就會自動增加副本數(shù)谅猾。
??處理客戶端讀寫請求柄慰。
??管理數(shù)據(jù)塊(Block)映射信息。NaseNode 保存 metadate 信息包括:文件 owership 和 permissions赊瞬、文件包含哪些塊先煎、Block 保存在哪個 DataNode(由 DataNode 啟動時上報)。
??NameNode 的 metadata 信息在啟動后會加載到內(nèi)存巧涧,metadata存儲到磁盤文件名為“fsimage”,Block 的位置信息不會保存到 fsimage遥倦,edits 記錄對 metadata 的操作日志谤绳。
DataNode:就是Slave占锯。NameNode 下達命令,DataNode 執(zhí)行實際的操作
??存儲實際的數(shù)據(jù)塊缩筛。文件被切分成固定大小的數(shù)據(jù)塊消略。默認數(shù)據(jù)塊大小為 64MB,可配置瞎抛。若文件大小不到 64MB艺演,則單獨存成一個 block。
??執(zhí)行數(shù)據(jù)塊的讀/寫操作桐臊。一個文件存儲方式胎撤。按大小被切分成若干個 block,存儲到不同節(jié)點上断凶,默認情況下每個 block 有三個副本伤提。
??啟動 DataNode 線程的時候向 NameNode 匯報 block 信息,通過向 NameNode 發(fā)送心跳保持與其聯(lián)系 3 秒一次认烁,如果 NameNode 10 分鐘沒有收到 DataNode 的心跳肿男,則認為其已經(jīng) lost,并拷貝到其他 DataNode却嗡。
Secondary NameNode:并非 NameNode 的熱備舶沛。
??當 NameNode 掛掉的時候,它并不能馬上替換 NameNode 并提供服務窗价。
??輔助 NameNode冠王,分擔其工作量。
??定期合并 fsimage 和 fsedits舌镶,并推送給 NameNode柱彻。SNN 執(zhí)行合并的時機:根據(jù)配置文件設置的時間間隔 fs.checkpoint.period 默認 3600 秒、根據(jù)配置文件設置 edits log 大小 fs.checkpoint.size 規(guī)定 edits 文件的最大值默認是 64MB餐胀。合并交給 Secondary Name Node 主要是因為 Name Node 主要為客戶端交互哟楷,而合并的工作主要交給 Secondary Name Node。
??在緊急情況下否灾,可輔助恢復 NameNode卖擅。
0x03 HDFS 讀寫流程
HDFS 讀流程
HDFS 的文件讀取原理,主要包括以下幾個步驟:
??首先調(diào)用 FileSystem 對象的 open 方法墨技,其實獲取的是一個 DistributedFileSystem 的實例惩阶。
??DistributedFileSystem 通過 RPC(遠程過程調(diào)用)獲得文件的第一批 block 的 locations,同一 block 按照重復數(shù)會返回多個 locations扣汪,這些 locations 按照 hadoop 拓撲結構排序断楷,距離客戶端近的排在前面。
??前兩步會返回一個 FSDataInputStream 對象崭别,該對象會被封裝成DFSInputStream 對象冬筒,DFSInputStream 可以方便的管理 DataNode 和 NameNode 數(shù)據(jù)流恐锣。客戶端調(diào)用 read 方法舞痰,DFSInputStream 就會找出離客戶端最近的 DataNode 并連接 DataNode土榴。
??數(shù)據(jù)從 DataNode 源源不斷的流向客戶端。
??如果第一個 block 塊的數(shù)據(jù)讀完了响牛,就會關閉指向第一個 block 塊的 DataNode 連接玷禽,接著讀取下一個 block 塊。這些操作對客戶端來說是透明的呀打,從客戶端的角度來看只是讀一個持續(xù)不斷的流矢赁。
??如果第一批 block 都讀完了,DFSInputStream 就會去 NameNode 拿下一批 blocks 的 location聚磺,然后繼續(xù)讀坯台,如果所有的 block 塊都讀完,這時就會關閉掉所有的流瘫寝。
HDFS 寫流程
HDFS 的文件寫入原理蜒蕾,主要包括以下幾個步驟:
??客戶端通過調(diào)用 DistributedFileSystem 的 create 方法,創(chuàng)建一個新的文件焕阿。
??DistributedFileSystem 通過 RPC(遠程過程調(diào)用)調(diào)用 NameNode咪啡,去創(chuàng)建一個沒有 blocks 關聯(lián)的新文件。創(chuàng)建前暮屡,NameNode 會做各種校驗撤摸,比如文件是否存在,客戶端有無權限去創(chuàng)建等褒纲。如果校驗通過准夷,NameNode 就會記錄下新文件,否則就會拋出 IO 異常莺掠。
??前兩步結束后會返回 FSDataOutputStream 的對象衫嵌,和讀文件的時候相似,F(xiàn)SDataOutputStream 被封裝成 DFSOutputStream彻秆,DFSOutputStream 可以協(xié)調(diào) NameNode 和 DataNode楔绞。客戶端開始寫數(shù)據(jù)到 DFSOutputStream唇兑,DFSOutputStream 會把數(shù)據(jù)切成一個個小 packet酒朵,然后排成隊列 data queue。
??DataStreamer 會去處理接受 data queue扎附,它先問詢 NameNode 這個新的 block 最適合存儲的在哪幾個 DataNode 里蔫耽,比如重復數(shù)是3,那么就找到 3 個最適合的 DataNode帕棉,把它們排成一個 pipeline针肥。DataStreamer 把 packet 按隊列輸出到管道的第一個 DataNode 中饼记,第一個 DataNode 又把 packet 輸出到第二個 DataNode 中香伴,以此類推慰枕。
??DFSOutputStream 還有一個隊列叫 ack queue,也是由 packet 組成即纲,等待 DataNode 的收到響應具帮,當 pipeline 中的所有 DataNode 都表示已經(jīng)收到的時候,這時 akc queue 才會把對應的 packet 包移除掉低斋。
??客戶端完成寫數(shù)據(jù)后蜂厅,調(diào)用 close 方法關閉寫入流。
??DataStreamer 把剩余的包都刷到 pipeline 里膊畴,然后等待 ack 信息掘猿,收到最后一個 ack 后,通知 DataNode 把文件標示為已完成唇跨。
0x05 HDFS 的安全模式
??安全模式(詳細介紹)是 HDFS 所處的一種特殊狀態(tài)稠通,在這種狀態(tài)下,文件系統(tǒng)只接受讀數(shù)據(jù)請求买猖,而不接受刪除改橘、修改等變更請求。在 NameNode 主節(jié)點啟動時玉控,HDFS 首先進入安全模式飞主,DataNode 在啟動的時候會向 NameNode 匯報可用的 block 等狀態(tài),當整個系統(tǒng)達到安全標準時高诺,HDFS 自動離開安全模式碌识。如果 HDFS 出于安全模式下,則文件 block 不能進行任何的副本復制操作虱而,因此達到最小的副本數(shù)量要求是基于 DataNode 啟動時的狀態(tài)來判定的筏餐,啟動時不會再做任何復制(從而達到最小副本數(shù)量要求)。
0x06 具體實現(xiàn)
0x01 Linux環(huán)境搭建
??安裝 HDFS 大致可以分為以下幾個步驟:下載薛窥、解壓胖烛、檢查 Java 和 SSH 免密碼登陸,修改 core-site.xml诅迷、HDFS-site.xml 文件佩番,修改 masters 和 slaves 文件,格式化 NameNode罢杉,運行 start-HDFS.sh 文件趟畏。
??安裝 jdk。下載 Jdk rpm 版:jdk-8u181-linux-x64.rpm滩租。下載后上傳到目標系統(tǒng)赋秀。安裝 jdk 命令:# rpm -ivh jdk-8u181-linux-x64.rpm
利朵,安裝完后使用命令:# java
、# javac
來測試 Java 環(huán)境是否安裝成功猎莲。
??修改 hosts 文件绍弟,添加主機名映射:centos01 - 192.168.198.128、centos02 - 192.168.198.129著洼、centos02 - 192.168.198.130樟遣。對主機形成映射。
??下載 Hadoop v1.2.1身笤,下載 hadoop-1.2.1.tar.gz
包到 linux 上豹悬,利用 xftp 存放在 root 目錄下,利用命令:# tar -xvzf hadoop-1.2.1.tar.gz
進行解壓液荸。解壓后瞻佛,我們將參考官方文檔進行安裝。
0x02 詳細安裝
??我們將 centos01 作為 NameNode娇钱,將 centos02 作為 Secondary NameNode伤柄、DataNode,centos03 作為 DataNode忍弛。所以我們將配置如下:
??在 centos01 上修改 conf/core-site.xml
文件响迂,添加如下:
<configuration>
<!-- HDFS rpc調(diào)用端口 -->
<property>
<name>fs.default.name</name>
<value>HDFS://centos01:9000</value>
</property>
<!-- HDFS存儲目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop</value>
</property>
</configuration>
??默認的存儲目錄是 linux 下的 tmp 目錄,服務器重啟之后臨時文件將會被刪除细疚,因此我們修改目錄為 /opt/hadoop
蔗彤。
??如果因為頻繁格式化,格式化命令為 bin 目錄下:./hadoop namenode -format
疯兼,格式化后 DataNode 啟動不了然遏,那么將 hadoop.tmp.dir
目錄清空,再格式化后就可以解決問題了(詳細情況)吧彪。
??在文件 conf/HDFS-site.xml
上添加如下待侵,這個是配置你的 DataNode 數(shù)。
<configuration>
<!-- HDFS節(jié)點數(shù) -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
</configuration>
??修改 conf/masters
文件姨裸,添加 centos02
秧倾,修改 conf/slaves
文件,添加 centos02
傀缩、centos03
那先。
??為了更容易進行操作,我們對解壓后的文件夾形成軟鏈接簡化操作赡艰。命令如下:# ln -sf /root/hadoop-1.2.1 /home/hadoop
形成軟鏈接售淡。
??進入 centos01 conf 文件夾,利用命令 scp -r ./* root@centos02:/home/hadoop/conf/
拷貝文件到 centos02,centos03 的 conf 文件下揖闸。
??完成后進入 centos01 bin 目錄揍堕,先用命令 ./hadoop namenode -format
進行格式化,然后利用命令 # ./start-dfs
打開 HDFS 汤纸。訪問網(wǎng)址 localhost:50070
便能進入 HDFS 監(jiān)控中心衩茸。