不要跳過這部分知識,對瞭解 NodeManager 本地目錄結構,和熟悉 Container 啟動流程有幫助。 一、分散式緩存介紹 主要作用就是將用戶應用程式執行時,所需的外部文件資源下載緩存到各個節點。 YARN 分散式緩存工作流程如下: 客戶端將應用程式所需的文件資源 (外部字典、JAR 包、二 ...
不要跳過這部分知識,對瞭解 NodeManager 本地目錄結構,和熟悉 Container 啟動流程有幫助。
一、分散式緩存介紹
主要作用就是將用戶應用程式執行時,所需的外部文件資源下載緩存到各個節點。
YARN 分散式緩存工作流程如下:
- 客戶端將應用程式所需的文件資源 (外部字典、JAR 包、二進位文件) 提交到 HDFS 上。
- 客戶端將應用程式提交到 RM 上。
- RM 將與某個 NM 進行通信,啟動應用程式 AM,NM 收到命令後,首先從 HDFS 上下載文件 (緩存),然後啟動 AM。
- AM 與 RM 通信,以請求和獲取計算資源。
- AM 收到新分配到的計算資源後,與對應的 NM 通信,以啟動任務。
- 如果應用程式第一次在該節點上啟動任務,NM 首先從 HDFS 上下載文件緩存到本地,然後啟動任務。
- NM 後續收到啟動任務請求後,如果文件已在本地緩存,則直接執行任務,否則等待文件緩存完成後再啟動。
- 各個節點上的緩存文件由對應的 NM 管理和維護。在 Hadoop 中,分散式緩存並不是將文件緩存到集群中各個節點的記憶體中,而是將文件緩存到各個節點的磁碟上,以便執行任務時直接從磁碟上讀取文件。
二、特性介紹
一)資源可見性和分類
分散式緩存機制是由各個 NM 實現的,主要功能是將應用程式所需的文件資源緩存到本地,以便後續任務的使用。
資源緩存是使用時觸發的,也就是第一個用到該資源的任務觸發。後續任務無需再進行緩存,直接使用即可。
根據可見性,NM將資源分為三類:
- Public:節點上所有的用戶都可以共用該資源,只要有一個用戶的應用程式將著這些資源緩存到本地,其他所有用戶的所有應用程式都可以使用;
- Private:節點上同一用戶的所有應用程式共用該資源,只要該用戶其中一個應用程式將資源緩存到本地,該用戶的所有應用程式都可以使用;
- Application:節點上同一應用程式的所有Container共用該資源。
YARN是通過比較 resource、type、timestamp 和 pattern四個欄位是否相同來判斷兩個資源請求是否相同的。如果一個已經被緩存到各個節點上的文件被用戶修改了,則下次使用時會自動觸發一次緩存更新,以重新從HDFS上下載文件。
分散式緩存完成的主要功能是文件下載,涉及大量的磁碟讀寫,因此整個過程採用了非同步併發模型加快文件下載速度,以避免同步模型帶來的性能開銷。
二)分散式緩存實現
NodeManager 採用輪詢的分配策略將這三類資源存放在 yarn.nodemanager.local-dirs
指定的目錄列表中,在每個目錄中,資源按照以下方式存放:
- PUBLIC 資源:存放在
${yarn.nodemanager.local-dirs}/filecache/
目錄下,每個資源將單獨存放在以一個隨機整數命名的目錄中,且目錄的訪問許可權均為 0755。 - PRIVATE 資源:存放在
${yarn.nodemanager.local-dirs}/usercache/${user}/filecache/
目錄下,每個資源將單獨存放在以一個隨機整數命名的目錄中,且目錄的訪問許可權均為 0710。 - APPLICATION 資源:存放在
${yarn.nodemanager.local-dirs}/usercache/${user}/${appcache}/${appid}/filecache/
目錄下,每個資源將單獨存放在以一個隨機整數命名的目錄中,且目錄的訪問許可權均為 0710。
其中 Container 的工作目錄位於 ${yarn.nodemanager.local-dirs}/usercache/${user}/${appcache}/${appid}/${containerid}
目錄下,其主要保存 jar 包文件、字典文件對應的軟鏈接。
目錄結構如下所示:
./nm-local-dir/
|-- filecache // PUBLIC資源
| `-- 10 // 每個資源將單獨存放在以一個隨機整數命名的目錄中
|-- nmPrivate
| |-- application_xxxx_xxx
| | |-- container_xxx_xxx_xxx_xx_xxxx
| | |-- container_xxx_xxx_xxx_xx_xxxx // 私有目錄數據(執行腳本、token文件、pid文件)
| | | |-- container_xxx_xxx_xxx_xx_xxxx.pid
| | | |-- container_xxx_xxx_xxx_xx_xxxx.tokens
| | | `-- launch_container.sh
| |-- application_xxxx_xxx
| `-- application_xxxx_xxx
`-- usercache
|-- userXxx
| |-- appcache // APPLICATION資源
| `-- filecache // PRIVATE資源
|-- userXxx
| |-- appcache
| `-- filecache
三、清理策略
1、Container 運行結束清理
2、清理過期緩存
NodeManager 為了避免緩存的文件過多導致磁碟「撐爆」,其會定期清理過期的緩存文件,具體方法如下:
- 每隔一定時間
yarn.nodemanager.localizer.cache.cleanup.interval-ms
(單位是毫秒,預設值是 10×60×1000,即 10 分鐘)啟動一次清理工作,確保每個緩存目錄中文件容量小於yarn.nodemanager.localizer.cache.target-size-mb
(單位是 MB,預設是 10240,即 10GB) - 如果超過該值,則採用 LRU(Least Recently Used)演算法清除已不再使用的緩存文件,直至文件容量低於設定值。
四、小結
本篇介紹了 NodeManager 分散式緩存,當你需要看 NM 本地目錄,需要瞭解各目錄中存儲內容時,本篇提供了對應的幫助。同時也對 Container 啟動流程做了簡要的講解,對後面瞭解 Container 生命周期提供了一定的前置知識。