不要跳過這部分知識,對了解 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 生命周期提供了一定的前置知識,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/551901.html
標籤:其他
下一篇:返回列表
