主頁 >  其他 > Hadoop深入淺出 ——三大組件HDFS、MapReduce、Yarn框架結構的深入決議式地詳細學習【建議收藏!!!】

Hadoop深入淺出 ——三大組件HDFS、MapReduce、Yarn框架結構的深入決議式地詳細學習【建議收藏!!!】

2021-09-06 07:45:16 其他

在這里插入圖片描述

💜🧡💛制作不易,各位友友們,大佬們給點鼓勵!
🧡💛💚點贊👍 ? 收藏? ? 關注?
💛💚💙歡迎各位大佬指教,一鍵三連走起!


往期好文推薦:
🔶🔷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的作業流程:

  1. secondary通知namenode切換edits檔案
  2. secondary通過http從namenode獲得fsimage檔案和edits檔案
  3. secondary將fsimage檔案載入記憶體,然后開始合并edits檔案
  4. secondary將新的fsimage檔案發回給namenode
  5. 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)寫檔案流程

點我回傳目錄

  1. 客戶端向NameNode發出寫檔案請求,
  2. 檢查是否已存在檔案、檢查權限,若通過檢查,直接先將操作寫入EditLog,并回傳輸出流物件,
  3. client端按128MB的塊切分檔案,
  4. client將NameNode回傳的分配的可寫的DataNode串列和Data資料一同發送給最近的第一個DataNode節點,此后client端和NameNode分配的多個DataNode構成pipeline管道,client端向輸出流物件中寫資料,client每向第一個DataNode寫入一個packet,這個packet便會直接在pipeline里傳給第二個、第三個…DataNode,
  5. 每個DataNode寫完一個塊后,會回傳確認資訊,
  6. 寫完資料,關閉輸輸出流,
  7. 發送完成信號給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

標籤:其他

上一篇:【elasticsearch系列】windows安裝kibana

下一篇:【MySQL從青銅到王者】第四篇:資料庫表的基本查詢增、刪、查、改

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more