不要跳過這部分知識,對了解 NodeManager 本地目錄結構,和熟悉 Container 啟動流程有幫助。
主要作用就是將使用者應用程式執行時,所需的外部檔案資源下載快取到各個節點。
YARN 分散式快取工作流程如下:
分散式快取機制是由各個 NM 實現的,主要功能是將應用程式所需的檔案資源快取到本地,以便後續任務的使用。
資源快取是使用時觸發的,也就是第一個用到該資源的任務觸發。後續任務無需再進行快取,直接使用即可。
根據可見性,NM將資源分為三類:
YARN是通過比較 resource、type、timestamp 和 pattern四個欄位是否相同來判斷兩個資源請求是否相同的。如果一個已經被快取到各個節點上的檔案被使用者修改了,則下次使用時會自動觸發一次快取更新,以重新從HDFS上下載檔案。
分散式快取完成的主要功能是檔案下載,涉及大量的磁碟讀寫,因此整個過程採用了非同步並行模型加快檔案下載速度,以避免同步模型帶來的效能開銷。
NodeManager 採用輪詢的分配策略將這三類資源存放在 yarn.nodemanager.local-dirs
指定的目錄列表中,在每個目錄中,資源按照以下方式存放:
${yarn.nodemanager.local-dirs}/filecache/
目錄下,每個資源將單獨存放在以一個隨機整數命名的目錄中,且目錄的存取許可權均為 0755。${yarn.nodemanager.local-dirs}/usercache/${user}/filecache/
目錄下,每個資源將單獨存放在以一個隨機整數命名的目錄中,且目錄的存取許可權均為 0710。${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)本篇介紹了 NodeManager 分散式快取,當你需要看 NM 本地目錄,需要了解各目錄中儲存內容時,本篇提供了對應的幫助。同時也對 Container 啟動流程做了簡要的講解,對後面瞭解 Container 生命週期提供了一定的前置知識。