【深入淺出 Yarn 架構與實現】6-3 NodeManager 分散式緩存

来源:https://www.cnblogs.com/shuofxz/archive/2023/05/08/17383011.html
-Advertisement-
Play Games

不要跳過這部分知識,對瞭解 NodeManager 本地目錄結構,和熟悉 Container 啟動流程有幫助。 一、分散式緩存介紹 主要作用就是將用戶應用程式執行時,所需的外部文件資源下載緩存到各個節點。 YARN 分散式緩存工作流程如下: 客戶端將應用程式所需的文件資源 (外部字典、JAR 包、二 ...


不要跳過這部分知識,對瞭解 NodeManager 本地目錄結構,和熟悉 Container 啟動流程有幫助。

一、分散式緩存介紹

主要作用就是將用戶應用程式執行時,所需的外部文件資源下載緩存到各個節點。
YARN 分散式緩存工作流程如下:

  1. 客戶端將應用程式所需的文件資源 (外部字典、JAR 包、二進位文件) 提交到 HDFS 上。
  2. 客戶端將應用程式提交到 RM 上。
  3. RM 將與某個 NM 進行通信,啟動應用程式 AM,NM 收到命令後,首先從 HDFS 上下載文件 (緩存),然後啟動 AM。
  4. AM 與 RM 通信,以請求和獲取計算資源。
  5. AM 收到新分配到的計算資源後,與對應的 NM 通信,以啟動任務。
  6. 如果應用程式第一次在該節點上啟動任務,NM 首先從 HDFS 上下載文件緩存到本地,然後啟動任務。
  7. NM 後續收到啟動任務請求後,如果文件已在本地緩存,則直接執行任務,否則等待文件緩存完成後再啟動。
  8. 各個節點上的緩存文件由對應的 NM 管理和維護。在 Hadoop 中,分散式緩存並不是將文件緩存到集群中各個節點的記憶體中,而是將文件緩存到各個節點的磁碟上,以便執行任務時直接從磁碟上讀取文件。

image.png

二、特性介紹

一)資源可見性和分類

分散式緩存機制是由各個 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

image.png

三、清理策略

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 生命周期提供了一定的前置知識。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 把Socket實例 掛載到全局 為方便梳理,請忽略typescript,一切盡在註釋中 # main.ts import {createApp} from 'vue' import App from './App.vue' import {socket} from "@/xihu/socket" i ...
  • 在JavaScript中,判斷兩個對象是否相等有多種方法,取決於你對 相等 的定義以及對象屬性的類型。以下是幾種常見的方法: 1. 嚴格相等運算符 ( ) 使用 運算符可以比較兩個對象是否引用同一個對象。如果兩個變數引用了同一個對象,則它們是相等的,否則它們是不相等的。例如: const obj1 ...
  • 本文主要講解了京東百億級商品車型適配數據存儲結構設計以及怎樣實現適配介面的高性能查詢。通過京東百億級數據緩存架構設計實踐案例,簡單剖析了jimdb的點陣圖(bitmap)函數和lua腳本應用在高性能場景。希望通過本文,讀者可以對緩存的內部結構知識有一定瞭解,並且能夠以最小的記憶體使用代價將點陣圖(bitm... ...
  • 3)OAuth2 Client 結合GitHub授權案例 本隨筆說明:這僅作為OAuth2 Client初次使用的案例,所以寫得很簡單,有許多的不足之處。 OAuth2 Client(OAuth2客戶端)是指使用OAuth2協議與授權伺服器進行通信並獲取訪問令牌的應用程式或服務。OAuth2客戶端代 ...
  • 大家好,我是3y,今天繼續來聊我的開源項目austin啊,但實際內容更新不多。這文章主是想吹下水,主要聊聊我在更新項目中學到的小技巧。 今天所說的小技巧可能有很多人都會,但肯定也會有跟我一樣之前沒用過的。 消息推送平臺🔥推送下發【郵件】【簡訊】【微信服務號】【微信小程式】【企業微信】【釘釘】等消息 ...
  • 非科班,經歷了無數場秋招,現將面試京東的題目記錄如下: 一面 kafka在應用場景以及 項目 里的實現 bitmap底層 object里有哪些方法 hashmap相關 sychronized和reentrantlock相關問題以及鎖升級 cas和volatile 線程幾種狀態以及轉化 jvm記憶體模型 ...
  • 做業務的時候經常忘記@RequestParam註解參數,記錄一下 首先,我們要清楚@RequestParam是乾什麼的 @RequestParam:將請求參數綁定到你控制器的方法參數上,路徑上有個參數+? @RequestParam註解參數: 語法:@RequestParam(value=”參數名” ...
  • 本文首發於公眾號:Hunter後端 原文鏈接:Django筆記三十八之發送郵件 這一篇筆記介紹如何在 Django 中發送郵件。 在 Python 中,提供了 smtplib 的郵件模塊,而 Django 在這個基礎上對其進行了封裝,我們可以通過 django.core.mail 來調用。 以下是本 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...