寫在前面
今天學習hadoop部分的知識。
Hadoop 概述
Hadoop 是一個適合海量資料的分散式儲存和分散式計算的平臺。Hadoop 的處理思想是“分而治之”。它起源於 Google 的三篇文章:Google FS(GFS),MapReduce,BigTable。Hadoop 主要包含三個核心元件:
- HDFS(Hadoop Distributed File System):一個分散式儲存框架,適合海量資料儲存。
- MapReduce:一個分散式計算框架,適合海量資料計算。
- YARN(Yet Another Resource Negotiator):一個資源排程平臺,負責給計算框架分配計算資源。
Hadoop 分散式搭建
- 關閉防火牆並設定所有節點名稱和相關對映。
- 設定免金鑰。
- 上傳 Hadoop 安裝包並解壓。
- 配置環境變數。
- 修改配置檔案。
- 同步檔案。
- 格式化並啟動(僅第一次需要格式化)。
分散式儲存
HDFS 主從結構
HDFS 具有主從架構。HDFS 叢集由單個名稱節點(NameNode)和許多資料節點(DataNode)組成:
- NameNode:主節點,管理檔案系統名稱空間並控制客戶端對檔案的訪問。
- DataNode:從節點,管理實際的資料儲存。
介紹
在分散式儲存系統中,分散在不同節點中的資料可能屬於同一個檔案。為了組織眾多的檔案,可以將檔案放到不同的資料夾中,資料夾可以一級一級地包含。這種組織形式稱為名稱空間(namespace)。名稱空間管理整個伺服器叢集中的所有檔案。
主從結構
- 主節點(NameNode):負責名稱空間和檔案的後設資料管理。
- 從節點(DataNode):負責儲存實際的資料,資料以塊(block)的形式進行儲存。
使用者操作時,客戶端首先與主節點互動,查詢資料儲存位置,然後從相應的從節點讀取資料。主節點將整個名稱空間資訊儲存在記憶體中,因此需要更多記憶體來處理更多的檔案。
塊(Block)
- 塊(Block):為了管理不同大小的檔案,HDFS 將檔案分成塊(預設大小為128MB),每個塊儲存在不同的 DataNode 上。
- 副本(Replication):為了資料的安全性,HDFS 會將資料塊備份到多個節點上,減少資料丟失或訪問失敗的機率。
分散式計算
YARN(Yet Another Resource Negotiator)
YARN 負責資源排程和管理,採用主從結構:
- 主節點(ResourceManager):負責叢集資源的分配與排程。
- 從節點(NodeManager):負責單節點資源的管理(CPU 和記憶體)。
資源管理
- ResourceManager:負責全域性資源排程和管理。
- NodeManager:管理節點資源,並執行容器中的任務。
Container
- 定義:Container 是 YARN 中資源的抽象,封裝了某個節點上一定量的資源(CPU 和記憶體)。
- 作用:由 ApplicationMaster 向 ResourceManager 申請,並在 NodeManager 上執行。
MR(MapReduce)
MapReduce 是一個依賴磁碟 I/O 的批處理計算模型,也具有主從結構:
- 主節點(MRAppMaster):負責接收客戶端提交的計算任務,並將任務分配給 NodeManager 的 Container 中執行。
- 從節點(Task):具體的計算任務。
Hadoop 命令
叢集管理
- 啟動所有程序:
start-all.sh
- 停止所有程序:
stop-all.sh
- 啟動 HDFS 和 YARN 相關程序:
start-dfs.sh start-yarn.sh
- 停止 HDFS 和 YARN 相關程序:
stop-dfs.sh stop-yarn.sh
單獨啟動和停止程序
- 啟動 HDFS:
hadoop-daemon.sh start (namenode | datanode)
- 停止 HDFS:
hadoop-daemon.sh stop (namenode | datanode)
- 啟動 YARN:
yarn-daemon.sh start (resourcemanager | nodemanager)
- 停止 YARN:
yarn-daemon.sh stop (resourcemanager | nodemanager)
檔案操作
- 上傳檔案:
hdfs dfs -put 本地路徑 HDFS路徑 hdfs dfs -copyFromLocal 本地路徑 HDFS路徑
- 下載檔案:
hdfs dfs -get HDFS路徑 本地路徑 hdfs dfs -copyToLocal HDFS路徑 本地路徑
- 建立目錄:
hdfs dfs -mkdir HDFS路徑
- 檢視檔案內容:
hdfs dfs -cat HDFS路徑 hdfs dfs -tail HDFS路徑 hdfs dfs -tail -f HDFS路徑 # 監聽 HDFS 中的檔案內容 hdfs dfs -text HDFS路徑
檔案管理
- 追加內容:
hdfs dfs -appendToFile 本地路徑 HDFS路徑
- 刪除檔案:
hdfs dfs -rm -r -f HDFS路徑
- 複製檔案:
hdfs dfs -cp 源路徑 目標路徑
- 重新命名檔案:
hdfs dfs -mv 源路徑 目標路徑
- 修改檔案許可權:
hdfs dfs -chmod 735 目標路徑 hdfs dfs -chmod -R 735 目標路徑
- 檢視儲存空間:
hdfs dfs -df hdfs dfs -du -h /
HDFS 相關概念
HDFS 架構 - 後設資料
- fsimage:後設資料映象檔案,儲存 NameNode 記憶體中的後設資料資訊。
- edits:操作日誌檔案,記錄新增的後設資料日誌。
- fstime:儲存最近一次 checkpoint 的時間。
這些檔案儲存在 Linux 檔案系統中,路徑由 hdfs-site.xml
的 dfs.namenode.name.dir
屬性指定。
SecondaryNameNode 的作用
- 功能:幫助 NameNode 完成後設資料資訊的合併。
- 工作流程:
- SecondaryNameNode 向 NameNode 發起 Checkpoint 請求。
- 從 NameNode 獲取 fsimage 和 edits。
- 合併 edits。
- 將新的 fsimage 發回給 NameNode。
- NameNode 用新的 fsimage 替換舊的 fsimage。
Checkpoint 發起時機
fs.checkpoint.period
:指定兩次 checkpoint 的最大時間間隔,預設 3600 秒。fs.checkpoint.size
:規定 edits 檔案的最大值,一旦超過此值則強制 checkpoint,預設大小為 64MB。
HDFS 架構 - Block 儲存
- Block 大小:HDFS 1.0 版本的預設塊大小為 64MB,2.0 版本及以後為 128MB。可以在
hdfs-site.xml
中透過dfs.blocksize
屬性配置塊大小。
HDFS API 使用
-
檔案操作:
create
:寫檔案open
:讀取檔案delete
:刪除檔案
-
目錄操作:
mkdirs
:建立目錄delete
:刪除檔案或目錄listStatus
:列出目錄的內容getFileStatus
:顯示檔案系統的目錄和檔案的後設資料資訊getFileBlockLocations
:顯示檔案儲存位置
RPC 協議
- 定義:RPC(Remote Procedure Call)是一種透過網路從遠端計算機程式上請求服務的協議,無需瞭解底層網路技術。RPC 採用客戶端/伺服器模式,客戶端傳送請求,伺服器處理請求並返回結果。
Hadoop是什麼,有哪些元件,分別介紹一下?
Hadoop 是一個處理海量資料的分散式儲存和分散式計算平臺,主要包括三個核心元件:HDFS、YARN 和 MapReduce。它們起源於谷歌釋出的三篇文章:GFS 對應 HDFS,BigTable 對應 HBase,MapReduce 對應 Hadoop 中的 MapReduce。
HDFS架構?HDFS原理?
HDFS(Hadoop Distributed File System)
HDFS 是 Hadoop 中的分散式檔案儲存系統,它會將每個檔案以“分而治之”的思想來放到不同的資料節點中。HDFS 採用主從結構:
- 主節點(NameNode):負責儲存資料的後設資料資訊,例如檔案的大小、檔案的路徑、檔案的名字和時間等。
- 從節點(DataNode):負責真實資料的儲存,這個儲存是基於塊(Block)來進行的。在 Hadoop 2.0 版本之後,一個塊的預設大小是 128MB,這樣也就意味著一個檔案可能會被拆成多個塊,分別放到不同的從節點上,實現分散式儲存。
如果需要讀取這些資料,需要透過主節點來獲取這些塊的具體位置,組裝好檔案才能完整地讀到 HDFS 中的檔案。主節點也是使用者進行讀寫資料請求的橋樑。當客戶端有讀寫請求的時候,客戶端會首先透過 RPC 協調來遠端呼叫 NameNode 來獲取一個資料列表,這個列表中儲存了每個 DataNode 中每個塊的具體資訊。
DataNode 的資訊由 NameNode 管理,NameNode 也可以存在多個。如果 HDFS 中的 NameNode 掉線,只有一個主節點會使整個資料都不能用。建立第二個 NameNode 可以減少資料不能用的可能。Hadoop 中的機制會在 NameNode 掉線之後,找一個空閒的 DataNode 來充當 NameNode 繼續運作,當然,這樣做如果沒有多副本,這個空閒的 DataNode 中的資料就無法讀取了。
HDFS 初始化命令?
hdfs namenode -format
Yarn啟動後有什麼程序?Yarn的架構?
YARN(Yet Another Resource Negotiator)
YARN 是用來進行資源的管理和任務排程的一個框架,主要用於協調每個元件之間的資源排程,使每個程序都可以順利運作。YARN 啟動後,主節點會有一個 ResourceManager,從節點上會有 NodeManager。
YARN 架構
- 主節點(ResourceManager):負責整個 Hadoop 叢集中的資源分配和任務的排程。
- 從節點(NodeManager):負責自己節點上的資源任務排程。
Container是什麼?
YARN 中的 Container 是資源的抽象,它封裝了某個節點上一定量的資源(CPU 和記憶體)。Container 由 ApplicationMaster 向 ResourceManager 申請,由 ResourceManager 中的資源排程器非同步分配給 ApplicationMaster。Container 的執行是由 ApplicationMaster 向資源所在的 NodeManager 發起的。
Block大小為什麼是128M?
Block 大小
塊的預設大小為 128MB。這樣做是為了最佳化分散式儲存和計算框架的效能,減少後設資料開銷,並提高資料本地性,從而提升整體系統的效率和吞吐量。如果塊的大小設定為 1MB,會存在多個塊,計算時讀寫效率會降低。如果塊的大小設定為 1GB,但有多個 100MB 的檔案,會生成多個儲存容量為 1GB 的塊,這樣塊檔案的空間利用率會很低。若塊的大小小於 1MB,一個 1MB 的檔案也會分配一個 1GB 的塊,導致空間浪費。
SecondaryNameNode的作用?
SecondaryNameNode 的作用是幫助 NameNode 完成後設資料資訊合併,從角色上看,屬於 NameNode 的“秘書”。它的工作流程如下:
- SecondaryNameNode 向 NameNode 發起 Checkpoint 請求。
- SecondaryNameNode 從 NameNode 獲得 fsimage 和 edits 檔案。
- SecondaryNameNode 將 fsimage 載入記憶體,然後開始合併 edits。
- SecondaryNameNode 將新的 fsimage 發回給 NameNode。
- NameNode 用新的 fsimage 替換舊的 fsimage。
檔案說明
- fsimage:後設資料映象檔案,儲存某一時段 NameNode 記憶體中的後設資料資訊。
- edits:操作日誌檔案,記錄 NameNode 啟動後新增的元資訊日誌。
- fstime:儲存最近一次 Checkpoint 的時間。
MapReduce的架構?如何提交MR任務?
MapReduce 是一個依賴磁碟 I/O 的批處理計算模型,也具有主從結構:
- 主節點(MRAppMaster):負責接收客戶端提交的計算任務,把計算任務分給 NodeManager 的 Container 中執行,即任務排程,監控 Container 中 Task 的執行情況。
- 從節點(Task):處理資料。這裡的 MRAppMaster 並不在主節點上,因為計算是由 DataNode 來執行的,NameNode 只是管理這些 DataNode。
提交 MR 任務的步驟
- 編寫 MapReduce 程式:編寫 Java、Python 或其他支援的語言的 MapReduce 程式,定義 Mapper 和 Reducer 類。
- 編譯程式:如果使用 Java,編譯你的程式碼生成
.jar
檔案。 - 上傳資料到 HDFS:將輸入資料上傳到 HDFS。
- 提交任務:
這裡的hadoop jar jar包名 主類名 -input /hdfs/input/path -output /hdfs/output/path
your-program.jar
是你的程式的 JAR 檔案,YourMainClass
是包含main
方法的類,-input
和-output
分別是 HDFS 中的輸入和輸出路徑。 - 檢視任務狀態:
yarn application -status <applicationId>
hdfs讀寫過程是怎麼樣的?
讀取資料
- 客戶端建立讀請求給 DFS,DFS 接到該請求後遠端呼叫 NameNode。
- NameNode 會透過後設資料資訊來找到使用者要讀的資料對應的 DataNode 中的塊。
- NameNode 校驗檔案是否存在等情況,只有校驗透過才會讀取塊,否則會丟擲異常。
- 所有準備工作完成後,開始進行資料的讀取。
- 讀取資料是透過一個一個的塊來進行的,只有當一個檔案的所有塊都被讀取到之後才會中斷讀連線。
- 如果在讀取過程中出現了異常,比如某個塊對應的 DataNode 掉線,則會去其他 DataNode 中重新讀該塊的副本,讀取完畢後繼續讀下一個塊。
- DFS 會將 DataNode 掉線的資訊傳遞給 NameNode,以便下次讀取資料時選擇其他的 DataNode,跳過掉線的 DataNode。
- 所有塊都成功讀取後,客戶端會收到寫完的訊息,最後關閉讀連線。
寫入資料
- 客戶端建立寫請求給 DFS,DFS 接到該請求後遠端呼叫 NameNode。
- NameNode 校驗檔案狀態,並建立新的塊來寫資料。
- 寫入的資料首先會被分成塊,每個塊還會分成一個個 packet(實現斷點重連)。一個個 packet 會組成一個 ack 佇列,寫入資料會按照佇列先進先寫。
- 只有當一個完整的塊都寫入到 DataNode 的塊中才會進行各個 DataNode 的資料同步。
- 只有在有多副本的情況下才會同步。如果只有一個副本,資料只會存在一個 DataNode 上。如果在寫入塊的過程中出現錯誤,比如在寫入某個塊時 DataNode 掉線,會跳過該 DataNode 繼續寫入到其他 DataNode 的新塊中,重新寫入塊,只有掉線的 DataNode 重新正常工作後才會進行資料同步恢復正常。未寫入的舊塊會被刪除。
- 所有塊都成功寫入後,客戶端會收到寫完的訊息,最後通知 NameNode 去記錄這些 DataNode 中的塊的資訊。