
💜🧡💛制作不易,各位友友們,大佬們給點鼓勵!
🧡💛💚點贊👍 ? 收藏? ? 關注?
💛💚💙歡迎各位大佬指教,一鍵三連走起!
往期好文推薦:
🔶🔷Redis從青銅到王者,從環境搭建到熟練使用,看這一篇就夠了,超全整理詳細決議,趕緊收藏吧!!!
🔶🔷Redis主從復制 以及 集群搭建 詳細步驟決議,趕快收藏練手吧!
🔶🔷硬核整理四萬字,學會資料庫只要一篇就夠了,盤它!MySQL基本操作以及常用的內置函式匯總整理
🔶🔷SQL進階-深入理解MySQL,JDBC連接MySQL實作增刪改查,趕快收藏吧!
🔶🔷初識鴻蒙OS,你好,HarmonyOS!
🔶🔷【小白學Java】D25 》》》Java中的各種集合大匯總,學習整理
🔶🔷hadoop入門簡介
我們知道目前Hadoop主要包括有三大組件,分別是:分布存盤框架(HDFS)、分布式計算框架(MapReduce)、以及負責計算資源調度管理的平臺(Yarn),那么今天我們就來決議式的深入學習了解這三大組件,
Hadoop啟動腳本詳細介紹
一、HDFS框架
1、HDFS概述
2、Hadoop檔案系統
3、HDFS的體系結構
(1)、RPC遠程程序呼叫協議
(2)、HDFS的相關概念
1)、Block(塊)
2)、Packet
3)、Chunk
4)、NameNode
5)、DataNode
(3)、secondary namenode
4、HDFS 的Trash回收站
5、HDFS的shell操作命令
6、HDFS的讀寫流程
(1)讀檔案流程
(2)寫檔案流程
7、HDFS常見問題
二、MapReduce原理深入理解
1、MapReduce概述及原理
2、MR的執行程序
3、InputSplit
4、RecordReader類
5、MapReduce默認輸入處理類
6、序列化
7、MapReduce優化總結
三、Yarn核心組件功能
Hadoop啟動腳本詳細介紹
點我回傳目錄
第一種:全部啟動集群所有行程
啟動:sbin/start-all.sh
停止:sbin/stop-all.sh
第二種:單獨啟動hdfs【web埠50070】和yarn【web埠8088】的相關行程
啟動:sbin/start-dfs.sh sbin/start-yarn.sh
停止:sbin/stop-dfs.sh sbin/stop-yarn.sh
每次重新啟動集群的時候使用
第三種:單獨啟動某一個行程
啟動hdfs:sbin/hadoop-daemon.sh start (namenode | datanode)
停止hdfs:sbin/hadoop-daemon.sh stop (namenode | datanode)
啟動yarn:sbin/yarn-daemon.sh start (resourcemanager | nodemanager)
停止yarn:sbin/yarn-daemon.sh stop(resourcemanager | nodemanager)
用于當某個行程啟動失敗或者例外down掉的時候,重啟行程
一、HDFS框架
1、HDFS概述
點我回傳目錄
HDFS(Hadooop Distributed File System)是Hadoop專案的核心子專案,是Hadoop主要應用的一個分布式檔案管理系統;其實,在Hadoop中有一個綜合性的檔案系統抽象,而該抽象中提供了檔案系統實作的各種介面,而,HDFS只是這個抽象檔案系統的一個實體,HDFS是一種允許檔案通過網路在多臺主機上分享的檔案系統,可讓多機器上的多用戶分享檔案和存盤空間,具有很好的通透性和容錯性,注意:分布式檔案管理系統很多,HDFS只是其中一種,HDFS不合適小檔案,
總結HDFS的特點如下:
- 可以處理超大檔案
- 可以流式地訪問資料(一次寫入,多次讀取)
- 可以運行于廉價的商品機器集群上
- 不適合低延遲資料的訪問
- 無法高效存盤大量小檔案
- 不支持多用戶寫入及任意修改檔案
那么,我們可以先看一下hadoop的檔案系統…
2、Hadoop檔案系統
點我回傳目錄
在Hadoop中整合了很多的檔案系統,這些眾多的檔案系統中,Hadoop提供了一個高層的檔案系統的抽象類org.apache.hadoop.fs.FileSystem,這個抽象類向我們展示了一個分布式檔案系統,并且有一些具體的實作,在Hadoop提供的許多檔案系統的介面中,用戶可以使用URI方案來選取合適的檔案系統來進行互動;而Hadoop中檔案系統的介面是使用Java來撰寫的,不同檔案系統之間的互動實際上是通過Java API來進行調節的,例如我們可以使用 hadoop fs -ls file:///shell命令來查看本地檔案系統目錄,該shell命令其實就是一個Java應用,
3、HDFS的體系結構
點我回傳目錄
如圖,HDFS是采用主從式架構對檔案系統進行管理,一個HDFS集群是由一個NameNode和若干個DataNode組成的,NameNode是一個中心服務器,負責管理檔案系統的名字空間(Namespace)以及客戶端對檔案的訪問,集群中的DataNode一般是一個節點運行一個DataNode行程,負責管理它所在節點上的存盤,

(1)、RPC遠程程序呼叫協議
點我回傳目錄
RPC(遠程程序呼叫協議),它是一種通過網路從遠程計算機程式上請求服務,而不需要了解底層網路技術的協議, RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通信程式之間攜帶資訊資料,在OSI網路通信模型中,RPC跨越了傳輸層和應用層,RPC使得開發包括網路分布式多程式在內的應用程式更加容易,
RPC采用客戶機(client)/服務器(server)模式,請求程式就是一個客戶機,而服務提供程式就是一個服務器,首先,客戶機呼叫行程發送一個有行程引數的呼叫資訊到服務行程,然后等待應答資訊,在服務器端,行程保持睡眠狀態直到呼叫資訊的到達為止,當一個呼叫資訊到達,服務器獲得行程引數,計算結果,發送答復資訊,然后等待下一個呼叫資訊,最后,客戶端呼叫行程接收答復資訊,獲得行程結果,然后呼叫執行繼續進行,
Hadoop的整個體系結構就是構建在RPC之上的(見org.apache.hadoop.ipc)
(2)、HDFS的相關概念
點我回傳目錄
1)、Block(塊)
點我回傳目錄
在HDFS中的塊是一個抽象的概念,它比作業系統中的檔案塊要大得多,Hadoop 1.x版本默認的block塊的大小為64MB,而在Hadoop 2.x版本中默認塊大小為128MB, 在HDFS分布式檔案系統中的檔案也被分成塊進行存盤,它是檔案存盤處理的邏輯單元,在分布式檔案系統中使用,抽象塊有很多好處,例如,①:可以存盤任意大的檔案而又不會受到網路中任一單個節點磁盤大小的限制, ②:使用抽象塊作為操作的單元可以簡化存盤子系統, 對于故障出現頻繁,種類繁多的分布式系統來說,簡化是非常重要的,如,HDFS分布式存盤系統中的塊的大小固定,這樣就是簡化了存盤系統的管理,尤其是元資料資訊可以和檔案快內容分開存盤, ③:塊更有利于分布式檔案系統中復制容錯的實作, HDFS中,為了處理節點故障,默認將檔案塊副本數設定為3份,分別存盤在集群中的不同節點上,如果有一個塊損壞時,系統就會通過NameNode獲取元資料資訊,并在另外一個節點上讀取一個副本且進行存盤,對于用戶來說這個程序都是透明的,而這里的檔案塊的副本冗余量是可以通過檔案進行配置的,我們可以通過shell命令hadoop fsck / -files -blocks來獲取檔案和塊的資訊,Block塊的大小可以自己指定,但是,塊太小:尋址時間占比過高,塊太大:Map任務數太少,作業執行速度變慢,它是最大的一個單位,
2)、Packet
點我回傳目錄
packet是第二大的單位,它是client端向DataNode,或DataNode的PipLine之間傳資料的基本單位,默認大小為64KB,
3)、Chunk
點我回傳目錄
chunk是最小的單位,它是client向DataNode,或DataNode的PipLine之間進行資料校驗的基本單位,默認大小為512Byte,因為用作校驗,故每個chunk需要帶有4Byte的校驗位,所以實際每個chunk寫入packet的大小為516Byte,由此可見真實資料與校驗值資料的比值約為128 : 1,(即64*1024 / 512)
在client端向DataNode傳資料的時候,HDFSOutputStream會有一個chunk buff,在寫滿一個chunk后,會計算校驗和并寫入當前的chunk,之后再把帶有校驗和的chunk寫入packet,當一個packet寫滿后,packet會進入dataQueue佇列,其他的DataNode就是從這個dataQueue獲取client端上傳的資料并存盤的,同時一個DataNode成功存盤一個packet后之后會回傳一個ack packet,放入ack Queue中,
4)、NameNode
點我回傳目錄
在HDFS體系結構中主要有兩類節點NameNode和DataNode,它們分別承擔Master和Worker的任務,
NameNode是整個檔案系統的管理節點,NameNode管理檔案系統的命名空間,它維護著整個檔案系統的檔案目錄樹以及這些檔案的索引目錄,檔案/目錄的元資訊和每個檔案對應的資料塊串列, 這些資訊是以兩種形式存盤在本地檔案系統中,一種是命名空間鏡像(Namespace images),一種是編輯日志(Edit log),NameNode用于接收用戶的操作請求,可以獲取每個檔案的每個塊所在的DataNode,注意:這些資訊并不是永久保存的,NameNode會在每次系統啟動時動態的重建這些資訊, 運行任務時,客戶端會通過NameNode獲取元資料資訊與DataNode進行互動以訪問整個檔案系統,
NameNode檔案包括(小北設定的檔案是在/usr/local/soft/hadoop/hadoop-2.7.6/tmp/dfs/name/current 路徑下的):
(元資料就是指描述資料的資料)
- fsimage:元資料鏡像檔案,存盤某一時段NameNode記憶體元資料資訊,
- edits:操作日志檔案,namenode啟動后一些新增元資訊日志,
- fstime:保存最近一次checkpoint的時間
(上面檔案的保存路徑是在hadoop的組態檔中的hdfs-site.xml的dfs.namenode.name.dir屬性設定的)
5)、DataNode
點我回傳目錄
DataNode是檔案系統Worker中的節點,用來執行具體的任務,主要是存盤檔案塊,被客戶端和NameNode呼叫,同時它也會通過心跳(Heartbeat),定時的向NameNode發送所存盤的檔案塊資訊,檔案塊的大小是可以自指定的,在hdfs-site.xml組態檔中的dfs.blocksize屬性指定block塊的大小,Hadoop 1.x默認64MB,2.x默認128MB;
(3)、secondary namenode
點我回傳目錄
checkpoint操作:該操作就相當于拍快照,其中的屬性:
- fs.checkpoint.period 用于指定兩次checkpoint的最大時間間隔,默認3600秒(即一個小時)
- fs.checkpoint.size 用于規定edits檔案的最大值,一旦超過這個值就強制checkpoint,不管是否到達最大時間間隔,默認的大小為64MB,
secondary namenode的作業流程:
- secondary通知namenode切換edits檔案
- secondary通過http從namenode獲得fsimage檔案和edits檔案
- secondary將fsimage檔案載入記憶體,然后開始合并edits檔案
- secondary將新的fsimage檔案發回給namenode
- namenode用新的fsimage檔案替換舊的fsimage檔案
4、HDFS 的Trash回收站
點我回傳目錄
HDFS 的Trash回收站和Linux系統(桌面環境)的回收站設計一樣的,HDFS會為每一個用戶創建一個回收站目錄:/user/用戶名/.Trash/,每一個被用戶通過Shell洗掉的檔案或者目錄,(fs.trash.interval是在指在這個回收周期之內),檔案實際上是被移動到trash的這個目錄下面,而不是馬上把資料洗掉掉,等到回收周期真正到了以后,HDFS才會將資料真正的洗掉,默認的單位是分鐘,1440分鐘=60*24,正好是一天,
詳細配置:在每個節點(不僅僅是主節點)上添加配置 core-site.xml,增加如下內容
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
注意:如果洗掉的檔案過大,超過了回收站的大小的話,會提示洗掉失敗,此時,需要指定引數 -skipTrash才能繼續洗掉
5、HDFS的shell操作命令
點我回傳目錄
呼叫檔案系統(FS)Shell命令應使用 bin/hdfs dfs -xxx 的形式,
hadoop fs 與 hdfs dfs 是等價使用的
常用的命令如下:
-ls
查看hdfs上目錄,如 hdfs dfs -ls /
-put
將本地檔案上傳到hdfs,如hdfs dfs -put 本地檔案路徑 hdfs路徑
-get
將hdfs檔案下載到本地,如 hdfs dfs -get hdfs檔案路徑 本地檔案路徑
-mkdir
在hdfs 上創建檔案夾,如hdfs dfs -mkdir /test
-cp
將hdfs檔案或目錄復制 如 hdfs dfs -cp /test.txt /a/
-cat
查看hdfs上檔案內容 如hdfs dfs -cat /test.txt
詳細的shell命令介紹使用
1. cat : 將路徑指定檔案的內容輸出到stdout ,
使用方法格式:hadoop fs -cat URI [URI …]
回傳值:成功回傳0,失敗回傳-1,
使用示例:
hadoop fs -cat hdfs://host1:port1/file1 hdfs://host2:port2/file2
hadoop fs -cat file:///file3 /user/hadoop/file4
2. chgrp :改變檔案所屬的組,
使用方法:hadoop fs -chgrp [-R] GROUP URI [URI …]
使用-R 將使改變在目錄結構下遞回進行,
命令的使用者必須是,檔案的所有者或者超級用戶,
3.chmod :改變檔案的權限,
使用方法:hadoop fs -chmod [-R] <MODE[,MODE]... | OCTALMODE> URI [URI …]
使用-R 將使改變在目錄結構下遞回進行,
命令的使用者必須是檔案的所有者或者超級用戶,
4.chown :改變檔案的擁有者,
使用方法:hadoop fs -chown [-R] [OWNER][:[GROUP]] URI [URI ]
使用-R 將使改變在目錄結構下遞回進行,
命令的使用者必須是 超級用戶,
5.copyFromLocal
使用方法:hadoop fs -copyFromLocal <localsrc> URI
除了限定源路徑是一個本地檔案外,其它和put 命令相似,
6.copyToLocal
使用方法:hadoop fs -copyToLocal [-ignorecrc] [-crc] URI <localdst>
除了限定目標路徑是一個本地檔案外,其它和get 命令類似,
7.cp:將檔案從源路徑復制到目標路徑
使用方法:hadoop fs -cp URI [URI …] <dest>
這個命令允許有多個源路徑,此時目標路徑必須是一個目錄,
回傳值:成功回傳0,失敗回傳-1,
使用示例:
hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2
hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2 /user/hadoop/dir
8. du
使用方法:hadoop fs -du URI [URI …]
回傳值:成功回傳0,失敗回傳-1,
顯示目錄中所有檔案的大小,或者當只指定一個檔案時,顯示此檔案的大小,
使用示例:
hadoop fs -du /user/hadoop/dir1 /user/hadoop/file1 hdfs://host:port/user/hadoop/dir1
9.dus
使用方法:hadoop fs -dus <args>
顯示檔案的大小,
10.expunge :清慷訓收站,
使用方法:hadoop fs -expunge
11.get
使用方法:hadoop fs -get [-ignorecrc] [-crc] <src> <localdst>
復制檔案到本地檔案系統,
可用-ignorecrc 選項復制CRC校驗失敗的檔案,
使用-crc 選項復制檔案以及CRC資訊,
回傳值:成功回傳0,失敗回傳-1,
使用示例:
hadoop fs -get /user/hadoop/file localfile
hadoop fs -get hdfs://host:port/user/hadoop/file localfile
12.getmerge
使用方法:hadoop fs -getmerge <src> <localdst> [addnl]
接受一個源目錄和一個目標檔案作為輸入,并且將源目錄中所有的檔案連接成本地目標檔案,
addnl 是可選的,用于指定在每個檔案結尾添加一個換行符,
13. ls
使用方法:hadoop fs -ls <args>
回傳值:成功回傳0,失敗回傳-1,
如果是檔案,則按照如下格式回傳檔案資訊:
檔案名 <副本數> 檔案大小 修改日期 修改時間 權限 用戶ID 組ID
如果是目錄,則回傳它直接子檔案的一個串列,就像在Unix中一樣,
目錄回傳串列的資訊如下:
目錄名 <dir> 修改日期 修改時間 權限 用戶ID 組ID
使用示例:
hadoop fs -ls /user/hadoop/file1 /user/hadoop/file2 hdfs://host:port/user/hadoop/dir1 /nonexistentfile
14. lsr
使用方法:hadoop fs -lsr <args>
ls 命令的遞回版本,類似于Unix中的ls -R ,
15. mkdir
使用方法:hadoop fs -mkdir <paths>
回傳值: 成功回傳0,失敗回傳-1,
接受路徑指定的uri作為引數,創建這些目錄,
其行為類似于Unix的mkdir -p,它會創建路徑中的各級父目錄,
使用示例:
hadoop fs -mkdir /user/hadoop/dir1 /user/hadoop/dir2
hadoop fs -mkdir hdfs://host1:port1/user/hadoop/dir hdfs://host2:port2/user/hadoop/dir
16. movefromLocal
使用方法:dfs -moveFromLocal <src> <dst>
輸出一個”not implemented“資訊,
17. mv :將檔案從源路徑移動到目標路徑,
使用方法:hadoop fs -mv URI [URI …] <dest>
這個命令允許有多個源路徑,此時目標路徑必須是一個目錄,
不允許在不同的檔案系統間移動檔案,
回傳值:成功回傳0,失敗回傳-1,
使用示例:
hadoop fs -mv /user/hadoop/file1 /user/hadoop/file2
hadoop fs -mv hdfs://host:port/file1 hdfs://host:port/file2 hdfs://host:port/file3 hdfs://host:port/dir1
18. put
使用方法:hadoop fs -put <localsrc> ... <dst>
從本地檔案系統中復制單個或多個源路徑到目標檔案系統,
也支持從標準輸入中讀取輸入寫入目標檔案系統,
回傳值:成功回傳0,失敗回傳-1,
使用示例:
hadoop fs -put localfile /user/hadoop/hadoopfile
hadoop fs -put localfile1 localfile2 /user/hadoop/hadoopdir
hadoop fs -put localfile hdfs://host:port/hadoop/hadoopfile
hadoop fs -put - hdfs://host:port/hadoop/hadoopfile
從標準輸入中讀取輸入,
19. rm
使用方法:hadoop fs -rm URI [URI …]
洗掉指定的檔案,只洗掉非空目錄和檔案,
回傳值:成功回傳0,失敗回傳-1,
使用示例:
hadoop fs -rm hdfs://host:port/file /user/hadoop/emptydir
20.rmr
使用方法:hadoop fs -rmr URI [URI …]
delete的遞回版本,
回傳值:成功回傳0,失敗回傳-1,
使用示例:
hadoop fs -rmr /user/hadoop/dir
hadoop fs -rmr hdfs://host:port/user/hadoop/dir
21.setrep
使用方法:hadoop fs -setrep [-R] <path>
回傳值:成功回傳0,失敗回傳-1,
改變一個檔案的副本系數,
-R選項用于遞回改變目錄下所有檔案的副本系數,
使用示例:
hadoop fs -setrep -w 3 -R /user/hadoop/dir1
22.stat
使用方法:hadoop fs -stat URI [URI …]
回傳指定路徑的統計資訊,
回傳值:成功回傳0,失敗回傳-1,
使用示例:
hadoop fs -stat path
23. tail
使用方法:hadoop fs -tail [-f] URI
回傳值:成功回傳0,失敗回傳-1,
將檔案尾部1K位元組的內容輸出到stdout,
支持-f選項,行為和Unix中一致,
使用示例:
hadoop fs -tail pathname
24.test
使用方法:hadoop fs -test -[ezd] URI
選項:
-e 檢查檔案是否存在,如果存在則回傳0,
-z 檢查檔案是否是0位元組,如果是則回傳0,
-d 如果路徑是個目錄,則回傳1,否則回傳0,
使用示例:
hadoop fs -test -e filename
25.text
使用方法:hadoop fs -text <src>
將源檔案輸出為文本格式,
允許的格式是zip和TextRecordInputStream,
26. touchz
使用方法:hadoop fs -touchz URI [URI …]
創建一個0位元組的空檔案,
使用示例:
hadoop -touchz pathname
6、HDFS的讀寫流程
(1)讀檔案流程
點我回傳目錄
首先,client訪問NameNode,查詢元資料資訊,獲得這個檔案的資料塊位置串列,回傳輸入流物件,然后client會就近挑選一臺datanode服務器,請求建立輸入流 ,再然后,DataNode向輸入流中中寫資料,以packet為單位來校驗(用來保證資料傳輸的完整性),最后,關閉輸入流,
那么,我們可以詳細的決議下讀檔案的流程:
- 1.首先呼叫FileSystem物件的open方法,其實是一個DistributedFileSystem的實體
- 2.DistributedFileSystem通過rpc獲得檔案的第一個block的locations,同一block按照副本數會回傳多個locations,這些locations按照hadoop拓撲結構排序,距離客戶端近的排在前面.
- 3.前兩步會回傳一個FSDataInputStream物件,該物件會被封裝成DFSInputStream物件,DFSInputStream可以方便的管理datanode和namenode資料流,客戶端呼叫read方法,DFSInputStream最會找出離客戶端最近的datanode并連接,
- 4.資料從datanode源源不斷的流向客戶端,(通過packet形式)
- 5.如果第一塊的資料讀完了,就會關閉指向第一塊的datanode連接,接著讀取下一塊,這些操作對客戶端來說是透明的,客戶端的角度看來只是讀一個持續不斷的流,
- 6.如果第一批block都讀完了,DFSInputStream就會去namenode拿下一批blocks的location,然后繼續讀,如果所有的塊都讀完,這時就會關閉掉所有的流,
- 7.如果在讀資料的時候,DFSInputStream和datanode的通訊發生例外,就會嘗試正在讀的block的排第二近的datanode,并且會記錄哪個datanode發生錯誤,剩余的blocks讀的時候就會直接跳過該datanode,DFSInputStream也會檢查block資料校驗和,如果發現一個壞的block,就會先報告到namenode節點,然后DFSInputStream在其他的datanode上讀該block的鏡像
- 8.該設計的方向就是客戶端直接連接datanode來檢索資料并且namenode來負責為每一個block提供最優的datanode,namenode僅僅處理block location的請求,這些資訊都加載在namenode的記憶體中,hdfs通過datanode集群可以承受大量客戶端的并發訪問,
(2)寫檔案流程
點我回傳目錄
- 客戶端向NameNode發出寫檔案請求,
- 檢查是否已存在檔案、檢查權限,若通過檢查,直接先將操作寫入EditLog,并回傳輸出流物件,
- client端按128MB的塊切分檔案,
- client將NameNode回傳的分配的可寫的DataNode串列和Data資料一同發送給最近的第一個DataNode節點,此后client端和NameNode分配的多個DataNode構成pipeline管道,client端向輸出流物件中寫資料,client每向第一個DataNode寫入一個packet,這個packet便會直接在pipeline里傳給第二個、第三個…DataNode,
- 每個DataNode寫完一個塊后,會回傳確認資訊,
- 寫完資料,關閉輸輸出流,
- 發送完成信號給NameNode,注意:發送完成信號的時機取決于集群是強一致性還是最終一致性,強一致性則需要所有DataNode寫完后才向NameNode匯報,最終一致性則其中任意一個DataNode寫完后就能單獨向NameNode匯報,HDFS一般情況下都是強調強一致性
同樣的,我們可以詳細的決議下寫檔案的流程:
- 1.客戶端通過呼叫DistributedFileSystem的create方法創建新檔案
- 2.DistributedFileSystem通過RPC呼叫namenode去創建一個沒有blocks關聯的新檔案,創建前,namenode會做各種校驗,比如檔案是否存在,客戶端有無權限去創建等,如果校驗通過,namenode就會記錄下新檔案,否則就會拋出IO例外.
- 3.前兩步結束后會回傳FSDataOutputStream的物件,與讀檔案的時候相似,FSDataOutputStream被封裝成DFSOutputStream.DFSOutputStream可以協調namenode和datanode,客戶端開始寫資料到DFSOutputStream,DFSOutputStream會把資料切成一個個小packet,然后排成佇列data quene,
- 4.DataStreamer會去處理接受data queue,他先問詢namenode這個新的block最適合存盤的在哪幾個datanode里,比如副本數是3,那么就找到3個最適合的datanode,把他們排成一個pipeline.DataStreamer把packet按佇列輸出到管道的第一個datanode中,第一個datanode又把packet輸出到第二個datanode中,以此類推,
- 5.DFSOutputStream還有一個對列叫ack queue,也是由packet組成,等待datanode的收到回應,當pipeline中的所有datanode都表示已經收到的時候,這時akc queue才會把對應的packet包移除掉,
如果在寫的程序中某個datanode發生錯誤,會采取以下幾步:1) pipeline被關閉掉;2)為了防止丟包 ack queue里的packet會同步到data queue里;3)把產生錯誤的datanode上當前在寫但未完成的block刪掉;4)block剩下的部分被寫到剩下的兩個正常的datanode中;5)namenode找到另外的datanode去創建這個塊的復制,當然,這些操作對客戶端來說是無感知的, - 6.客戶端完成寫資料后呼叫close方法關閉寫入流
- 7.DataStreamer把剩余得包都刷到pipeline里然后等待ack資訊,收到最后一個ack后,通知datanode把檔案標示為已完成,
7、HDFS常見問題
點我回傳目錄
(1)hdfs檔案無法操作: 一般是因為處于安全模式下
離開安全模式:hdfs dfsadmin -safemode leave
進入安全模式:hdfs dfsadmin -safemode enter
查看安全模式:hdfs dfsadmin -safemode get
二、MapReduce原理深入理解
1、MapReduce概述及原理
點我回傳目錄
MapReduce是一種分布式計算模型,由Google提出,主要用于搜索領域,解決海量資料的計算問題. MapReduce是分布式運行的,由兩個階段組成:Map和Reduce,Map階段是一個獨立的程式,有很多個節點同時運行,每個節點處理一部分資料,Reduce階段是一個獨立的程式,有很多個節點同時運行,每個節點處理一部分資料(在這先把reduce理解為一個單獨的聚合程式即可),MapReduce框架都有默認實作,用戶只需要覆寫map()和reduce()兩個函式,即可實作分布式計算,非常簡單,這兩個函式的形參和回傳值都是<key、value>,使用的時候一定要注意構造<k,v>,
2、MR的執行程序
點我回傳目錄
MapReduce程序分為map階段和reduce階段(主要是對map任務發送來的資料進行處理),其實,還有一個shuffle階段,maprudece程序中流通的資料格式都是key-value鍵值對格式的,

接下來,我們詳細的了解下MapReduce的程序,在map階段,主要任務是處理從HDFS中輸入的檔案,在輸入時會使用InputFormat類的子類(TextInputFormat)把輸入的檔案(夾)劃分為很多切片(InputSplit),默認HDFS的每一個block塊對應著一個切片,每一個切片默認大小為128MB,每一個切片會產生一個map任務,然后當map任務處理完后(就會進入到shuffle(中文譯為“洗牌”)階段,從map端的輸出到reduce端的輸入這一程序稱為shuffle程序,該程序主要是負責map端的資料能夠完整的發送到reduce端進行處理),就會將這些資料刷寫到環形緩沖區(Buffer in mermory)中,環形緩沖區的默認大小位100MB,而當這些資料刷寫到80%的時候,就會開始溢寫到磁盤中去,那么溢寫的程序中,會對資料進行磁區(partition)和排序(sort)處理,然后每個map任務可能會產生多個(小)檔案(這些小檔案都采用了快速排序處理過),我們知道最后reduce任務會從map任務中拉取資料,對這些(小)檔案進行拉取時會需要很多的網路IO以及磁盤IO的資源,那么,為了減少網路IO和磁盤IO的次數,我們會將多個(小)檔案合并為一個(大)檔案,該程序就是merge操作,使用hash partitional磁區原理來磁區,采用歸并排序對磁區中的資料排序,并且會根據map端中輸入的key的不同去計算hash值,再去對指定的reduce的個數進行取余,reduce的個數是指提前設定好的,幾個reduce(個數)就會產生幾個磁區,然而,相同的key的資料會進入到同一個reduce任務中,一個reduce任務中可以處理不同key的資料,因為不同資料key的hash值對reduce個數進行取余,最后得到的結果可能一樣的,所以一個reduce任務中也有可能會有不同的key,最后每一個map任務會生成一個(大)檔案,而這個(大)檔案是經過磁區和排序得到的,之后,會通過HTTP將每一個輸出檔案的特定磁區的資料拉取到reduce任務中,等reduce任務階段處理完后會將最終的結果寫入到磁盤(也就是HDFS)中,
3、InputSplit
點我回傳目錄
在執行mapreduce之前,原始資料被分割成若干split(切片),每個split作為一個map任務的輸入,但是,當Hadoop處理很多小檔案時(檔案大小小于hdfs block大小),此時FileInputFormat不會對小檔案進行劃分,那么每一個小檔案都會被當做一個split并分配一個map任務,這樣就會有大量的map task運行,會導致效率非常底下,例如:一個1G的檔案,會被劃分成8個128MB的split,并分配8個map任務處理,而10000個100kb的檔案會被10000個map任務處理,效率就會很低下,
Map任務的數量:
- 一個InputSplit對應一個Map task
- InputSplit的大小是由Math.max(minSize, Math.min(maxSize,blockSize))決定
- 單節點建議運行10—100個map task
- map task執行時長不建議低于1分鐘,否則導致效率低
4、RecordReader類
點我回傳目錄
每一個InputSplit都有一個RecordReader類,其作用是把InputSplit中的資料決議成Record,即<k1,v1>,在TextInputFormat中的RecordReader是LineRecordReader,它會將每一行決議成一個<k1,v1>,其中,k1表示偏移量,而v1則表示行文本內容
5、MapReduce默認輸入處理類
點我回傳目錄
InputFormat
抽象類,只是定義了兩個方法,
FileInputFormat
FileInputFormat是所有以檔案作為資料源的InputFormat實作的基類,FileInputFormat處理作為job輸入的所有檔案,并實作了對輸入檔案計算splits的方法,至于獲得記錄的方法是有不同的子類——TextInputFormat進行實作的,
TextInputFormat
TextInputFormat是默認的處理類,主要用來處理普通文本檔案,檔案中每一行作為一個記錄,它將每一行在檔案中的起始偏移量作為key,每一行的內容作為value默認以\n或回車鍵作為一行記錄
6、序列化
點我回傳目錄
序列化 (Serialization)指將物件的狀態資訊轉換為可以存盤或傳輸的形式的程序,在序列化期間,物件將其當前狀態寫入到臨時或持久性存盤區,以后,可以通過從存盤區中讀取或反序列化物件的狀態,重新創建該物件,
序列化的目的就是為了跨行程傳遞格式化資料:
當兩個行程在進行遠程通信時,彼此可以發送各種型別的資料,無論是何種型別的資料,都會以二進制序列的形式在網路上傳送,發送方需要把這個物件轉換為位元組序列,才能在網路上傳送;接收方則需要把位元組序列再恢復為物件,
把物件轉換為位元組序列的程序稱為物件的序列化,
把位元組序列恢復為物件的程序稱為物件的反序列化,
7、MapReduce優化總結
點我回傳目錄
- 1,通過修改map的切片大小控制map資料量(盡量和block大小保持一致)注意:并不是map越多越好,根據集群資源,set mapred.max.split.size=256000000
- 2,合并小檔案,因為一個檔案會至少生成一個map
- 3,避免資料傾斜
- 4,combine操作
- 5,mapjoin操作
- 6,適當備份,因為備份多可以本地化生成map任務
三、Yarn核心組件功能
點我回傳目錄
YARN Client
YARN Client提交Application到RM,它會首先創建一個Application背景關系物件,并設定AM必需的資源請求資訊,然后提交到RM,YARN Client也可以與RM通信,獲取到一個已經提交并運行的Application的狀態資訊等,
ResourceManager(RM)
RM是YARN集群的Master,負責管理整個集群的資源和資源分配,RM作為集群資源的管理和調度的角色,如果存在單點故障,則整個集群的資源都無法使用,在2.4.0版本才新增了RM HA的特性,這樣就增加了RM的可用性,
NodeManager(NM)
NM是YARN集群的Slave,是集群中實際擁有實際資源的作業節點,我們提交Job以后,會將組成Job的多個Task調度到對應的NM上進行執行,Hadoop集群中,為了獲得分布式計算中的Locality特性,會將DN和NM在同一個節點上運行,這樣對應的HDFS上的Block可能就在本地,而無需在網路間進行資料的傳輸,
Container
Container是YARN集群中資源的抽象,將NM上的資源進行量化,根據需要組裝成一個個Container,然后服務于已授權資源的計算任務,計算任務在完成計算后,系統會回收資源,以供后續計算任務申請使用,Container包含兩種資源:記憶體和CPU,后續Hadoop版本可能會增加硬碟、網路等資源,
ApplicationMaster(AM)
AM主要管理和監控部署在YARN集群上的Application,以MapReduce為例,MapReduce Application是一個用來處理MapReduce計算的服務框架程式,為用戶撰寫的MapReduce程式提供運行時支持,通常我們在撰寫的一個MapReduce程式可能包含多個Map Task或Reduce Task,而各個Task的運行管理與監控都是由這個MapReduceApplication來負責,比如運行Task的資源申請,由AM向RM申請;啟動/停止NM上某Task的對應的Container,由AM向NM請求來完成,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297794.html
標籤:其他
