---
# System prepended metadata

title: 【Data Engineering】Part 2. Hadoop Basics
tags: [Hadoop, Data Engineering]

---

{%hackmd HJaSkBnegl %}

Hadoop 基本架構
![image](https://hackmd.io/_uploads/Bk9_er3ell.png =38%x)
===

### Hadoop 簡介
> Hadoop 是以 Java 為基礎的開放原始碼架構，用於管理應用程式的大量資料儲存和處理作業。Hadoop 使用<mark class='green'>分散式儲存空間</mark>和<mark class='green'>平行處理功能</mark>來處理大數據和分析工作，將工作負載細分為可同時執行的小型工作負載。
> [[From Google Cloud Platform]](https://cloud.google.com/learn/what-is-hadoop?hl=zh-TW)

<!-- 補跟一般檔案系統的區別 -->


## Hadoop 分散式檔案系統<br><font color='#00AEAE'>HDFS</font> (<font color='#00AEAE'>H</font>adoop <font color='#00AEAE'>D</font>istributed <font color='#00AEAE'>F</font>ile <font color='#00AEAE'>S</font>ystem)

### 簡介
- **Fault tolerant**：在儲存資料時將資料分成數個小區塊（block），每個小區塊又經過複製儲存於不同節點。這樣就算硬體設備出錯導致某個節點內資料毀損或遺失，也可以確保在其他節點還保有資料。因此<mark class='green'>對硬體設備的要求不高</mark>。
- **Scalable**：可以用增加節點的方式擴展儲存能力，不需要修改程式邏輯。
- **Streaming Data Access**: 傳統關聯式資料庫中，數據之間通常不存在順序性，在操作時需要將所有數據都讀進去；HDFS 主張使用順序性的方式寫入資料，這樣只需要寫進去一次，在讀取時依照所需的順序找到資料就可以了，可以減少檔案讀取時間，適合大量數據的操作。

### 架構
![image](https://hackmd.io/_uploads/BJ331VJ-eg.png)

- <mark class='pink'>**NameNode**</mark>
     &emsp;&emsp;主從架構中的 master，用來儲存檔案系統裡面的檔案目錄。內含 <mark class='green'>FS Image</mark> 和 <mark class='green'>Edit Logs</mark> 兩個文件
    - FS Image (File System Image)：檔案目錄
    - Edit Logs：儲存一段時間內檔案目錄中的修改、增刪紀錄
    
     &emsp;&emsp;因為 FS Image 檔案很大，如果每次有資料變動就去更新它或太浪費時間，所以會先在記錄存在 Edit Logs 裡面，等一定的時間過去或修改到達一定的量再往回更新
     &emsp;&emsp;如果 NameNode 出問題，整個 HDFS 的系統都會沒有辦法運作，而且也沒有辦法透過 DataNode 來還原資料。因為 DataNode 的位址都存在 HDFS 裡面，所以根本無從找起。
- <mark class='pink'>**Secondary NameNode**</mark>
    &emsp;&emsp;用來輔助 NameNode 把 FS Image 跟 Edit Log 合併。運作方式是從 NameNode 讀取 FS Image 跟 Edit Log 之後在節點內完成合併工作再把新的 FS Image 傳回去給 NameNode。
     &emsp;&emsp;只會在要更新 NameNode 的時候讀取裡面的資料過來進行合併，不是隨時都會去備份紀錄，所以沒有辦法在 NameNode 出問題時代替它。
- <mark class='pink'>**DataNode**</mark>
     &emsp;&emsp;主從架構中的 worker，是資料真正的儲存地點，通常不會只有一個。資料匯進系統時會被分成一個一個的 <mark class='green'>**block**</mark>（block 的預設容量是 128MB）。每個 block 複製幾遍之後會存進不同的 DataNode 裡面，這樣如果某一個 DataNode 出問題，就可以去其他節點裡面重新還原這些 block。

>[!Note] 主從架構（master-workers / slaves pattern）
> 分散式系統常用的結構類型之一，像是團隊當中會有組長跟成員一樣，雖然同一個專案底下的不同任務會交友組員分工進行，但組長會掌握所有專案相關的重要資訊。
> 主從架構中，master 被用來儲存資料的 meta data，而 workers 則負責將資料分成不同的小部份保存。
> [來源 & 更完整介紹：分布式系统架构（一）—— Master-Workers 架构](https://www.qtmuniao.com/2021/07/03/distributed-system-1-master-workers/)



## <font color='#00AEAE'>YARN</font> (<font color='#00AEAE'>Y</font>et <font color='#00AEAE'>A</font>nother <font color='#00AEAE'>R</font>esource <font color='#00AEAE'>N</font>egotiater)

### 簡介

- Hadoop 的資源管理系統，用來管理各種分散式運算應用程式所使用的資源
- 因為在大數據處理的架構中，可能會依據不同的資料型態跟特性使用不一樣的計算跟處理方式，並且這些計算會是並行處理的，所以會需要一個能夠<mark class='green'>管理計算資源如何分配</mark>的系統。YARN 就是因應這樣的趨勢跟需求而產生。
- 跟 HDFS 一樣是主從架構。

### 架構
![image](https://hackmd.io/_uploads/Sy0UU5yblx.png)

- <mark class='pink'>**Resource Manager**</mark>
    主從結構中的 master，主要工作為「啟動應用程序」、「管理作業的調度跟執行」、「分配資源給不同 Node Manager」
    - Resource Manager: 分配各個執行中 container 的資源
    - Application Manager: 負責啟動應用程序與監控他們的運作
- <mark class='pink'>**Node Manager**</mark>
    每個計算節點上的代理程式，負責執行和監控 container
    - 負責啟動、停止 container
    - 監控資源使用情況（CPU、內存、磁碟）
    - 定期向 ResourceManager 發送 heartbeat，報告 Container 狀態
- <mark class='pink'>**Application Master**</mark>
    每個應用程序對應一個 ApplicationMaster，負責管理該應用程序的整體生命周期
    - 會向 Resource Manager 請求資源
    - 跟 Node Manager 交互以啟動 container
    - 追蹤 container 的任務執行狀態並進行故障恢復
    - 將應用程序的最終狀態（成功/失敗）匯報給 Resource Manager
- <mark class='pink'>**Container**</mark>
    YARN 中的基本執行單元，是計算任務執行的虛擬化資源包，包括 CPU、內存、磁碟等資源。
    - 每個 container 都由 NodeManager 啟動
    - container 根據 Application Master 的分配執行任務（如 Map、Reduce）
    - 當任務完成後 Node Manager 會回收 container 內的資源

> [!Tip] 觀念釐清
> - 有 application master 才有 container
> - 一個 application master 可以同時有多個對應的 container 運行
> - **application master 不需要跟對應的 container 存在同一個節點**
> - 一個 container 只會有一個對應的 Application Master

### 工作流程
1. client 向 Resource Manager 傳遞應用程序 JAR 文件跟配置文件
2. Applicaion Manager 指示 Node Manager 啟動一個對應該應用程序的新 Application Master
3. Application Master 針對任務進行拆分，辨別需要將任務拆分成哪些 task
4. Application Master 向 Application Manager 申請開 container 給這些 task
5. Resource Scheduler 決定要將 container 分配到哪幾個 node 裡面
6. Application Master 聯絡各 task 被分配到的 Node Manager 開啟 container
7. Node Manager 創建並啟動 container
8. 任務完成後，Application Master 會把任務結果回傳給 client，如果有設定 Job History Server 的話，也會把相關資訊跟工作日誌傳到上面
9. 所有事情結束後，Application Master 會回報給 Resource Manager 然後把自己刪掉
10. Resource Manager 把回收送出去的計算資源

> [!Important] 沒在休息的人
> - <mark class='green'>Node Manager</mark> 監控 container 的運行狀態並回報 heartbeat 給 Resource Manager
> - <mark class='green'>Resource Manager</mark> 管理 Application Master 的狀態並在發生故障時將其重新啟動

## <font color='#00AEAE'>MapReduce</font>

### 簡介

&emsp;&emsp;Google 在 2004 提出的一種拿來做資料工程中大量資料處理跟資料庫建立的框架。通常被視為大數據相關技術的起點。
&emsp;&emsp;包含 <code class='package'>Map</code>、<code class='package'>Shuffle</code>、<code class='package'>Reduce</code> 三個階段，重點在於將大量資料切分成小份量後平行處理這些資料以加速資料處理。因為是在平行的節點進行運作，<mark class='green'>可擴展性強</mark>，<mark class='green'>容錯率也高</mark>。在需要加快運算速度或是加大運算亮的時候可以簡單增加新節點，在單一節點發生問題，產生故障的時候也可以直接從一個新節點重來。

### 架構

![image](https://hackmd.io/_uploads/HJmAapYbgl.png)


- <mark class='pink'>**Map**</mark>
    - 把資料轉換成 <mark class='green'>key/value</mark> 的形式
- <mark class='pink'>**Shuffle**</mark> 
    - 整理不同節點 mapping 的結果，把 key 值相同的資料分在一組
- <mark class='pink'>**Reduce**</mark>
    - 針對被分在一組的鍵值對將其進行整合

> [!Tip]Hadoop 1.0 → Hadoop 2.0
> 原本 MapReduce 在運作的時候還要自行分配運算資源，為了減少他的工作量，讓他專注在特定任務上，Hadoop 在 2.0 推出了 YARN 將分工變得更精細有效率一點

### 可應用任務

1. 計算 occuurance
2. 尋找特定字串 pattern
3. 計算連結點擊來源

## 總結－整體 pipeline
![image](https://hackmd.io/_uploads/BkT4wRFblx.png)



## 參考資料 Resource

1. [Hadoop 介紹](https://ithelp.ithome.com.tw/articles/10323008)
2. [Hadoop Ecosystem 之 Hadoop 介紹](https://ithelp.ithome.com.tw/articles/10190756)
3. [Apache Hadoop Documentation](https://apache.github.io/hadoop/)（Hadoop 官方介紹文件）
4. [Hadoop: The Definitive Guide 4th Edition](https://piazza-resources.s3.amazonaws.com/ist3pwd6k8p5t/iu5gqbsh8re6mj/OReilly.Hadoop.The.Definitive.Guide.4th.Edition.2015.pdf)（更詳盡版的 Hadoop 全介紹）
5. [What is meant by "streaming data access" in HDFS?](https://serverfault.com/questions/40370/what-is-meant-by-streaming-data-access-in-hdfs)（流式數據訪問的簡單解釋）
6. [Hadoop Yarn 一文搞懂 Yarn架构原理和工作机制](https://www.cnblogs.com/liangzilx/p/14837562.html)
7. [YARN(Hadoop操作系统)的架构](https://www.cnblogs.com/yinzhengjie/p/13216785.html)
8. [Hadoop基础原理](https://www.cnblogs.com/yinzhengjie/p/9048825.html)
9. [Hadoop Yarn的架构](https://waltyou.github.io/Hadoop-Yarn/)（針對 Resource Manager 的超詳盡介紹）
10. [MapReduce: Simplified Data Processing on Large Clusters](chrome-extension://efaidnbmnnnibpcajpcglclefindmkaj/https://static.googleusercontent.com/media/research.google.com/zh-TW//archive/mapreduce-osdi04.pdf)（Google 發表 MapReduce 的 paper）
11. [Hadoop MadReduce deep diving and tuning](https://www.todaysoftmag.com/article/1358/hadoop-mapreduce-deep-diving-and-tuning)

---
>[!Caution]著作權聲明 Copy Right
>文章採用 [姓名標示─非商業性─相同方式分享 4.0 國際](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.en)許可協議，轉載請註明出處
>Rights protected by the [Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.en) license.