hadoop集中式緩存管理

簡介

hdfs中的集中式緩存管理是一種顯式緩存機制,允許用戶指定hdfs要緩存的路徑。namenode將與磁盤上具有所需塊的數據節點通信,並指示它們將塊緩存在堆外緩存中。

hdfs中的集中式緩存管理具有許多顯著的優點。

  • 顯式固定可防止經常使用的數據從內存中逐出。當工作集的大小超過主內存的大小時,這一點尤其重要,這在許多hdfs工作負載中是常見的。
  • 由於datanode緩存由namenode管理,因此應用程序可以在做出任務放置決策時查詢緩存塊位置集。將任務與緩存塊副本一起定位可以提高讀取性能。
  • 當數據節點緩存了塊時,客戶機可以使用新的、更高效的、零拷貝讀取api。由於緩存數據的校驗和驗證由datanode完成一次,因此在使用這個新api時,客戶機實際上可以產生零開銷。
  • 集中緩存可以提高集羣內存的總體利用率。當依賴於每個數據節點上的操作系統緩衝緩存時,重複讀取一個塊將導致該塊的所有n個副本被拉入緩衝緩存。通過集中的緩存管理,用戶只能顯式地固定n個副本中的m個副本,從而節省n-m內存。

適用場景

  • 集中式緩存管理對於重複訪問的文件很有用。例如,hive中經常用於連接的小事實表是緩存的一個很好的候選者。另一方面,緩存一年報表查詢的輸入可能不太有用,因爲歷史數據可能只讀取一次。
  • 集中式緩存管理對於具有性能sla的混合工作負載也很有用。緩存高優先級工作負載的工作集可確保它不會與低優先級工作負載爭用磁盤I/O。

架構

在這裏插入圖片描述
在這個架構中,namenode負責協調集羣中所有堆外緩存的datanode。namenode定期從每個datanode接收一個緩存報告,該報告描述給定dn上緩存的所有塊。namenode通過在datanode 心跳上搭載cache和uncache命令來管理datanode緩存。
namenode查詢其緩存指令集,以確定應緩存哪些路徑。緩存指令持久存儲在fsimage和編輯日誌中,可以通過java和命令行api添加、刪除和修改。namenode還存儲一組緩存池,這些緩存池是用於將緩存指令組合在一起以進行資源管理和強制執行權限的管理實體。
namenode定期重新掃描命名空間和活動緩存指令,以確定哪些塊需要緩存或取消緩存,並將緩存工作分配給datanodes。重新掃描也可以由用戶操作觸發,如添加或刪除緩存指令或刪除緩存池。

注:
我們目前不緩存正在構造、損壞或不完整的塊。如果cache指令覆蓋symlink,則不緩存symlink目標。
緩存當前在文件或目錄級別完成。塊和子塊緩存是未來工作的一項。

概念

緩存指令

cache指令定義了應該緩存的路徑。路徑可以是目錄或文件。目錄是非遞歸緩存的,這意味着只有目錄的第一級列表中的文件。

指令還指定其他參數,如緩存複製因子和過期時間。
複製因子指定要緩存的塊副本數。如果多個緩存指令指向同一個文件,則應用最大緩存複製因子。

到期時間在命令行中指定爲生存時間(TTL),即未來的相對到期時間。緩存指令過期後,namenode在做出緩存決策時不再考慮它(不會刪除到期的數據?)。

緩存池

緩存池是用於管理緩存指令組的管理實體。緩存池具有類似unix的權限,這些權限限制哪些用戶和組可以訪問該池。寫入權限允許用戶向池中添加和刪除緩存指令。讀取權限允許用戶列出池中的緩存指令以及其他元數據。執行權限未使用。

緩存池也用於資源管理。池可以執行最大限制,這限制了池中的指令可以在集合中緩存的字節數。通常,池限制的總和將大致等於爲集羣上的HDFS緩存保留的聚合內存量。緩存池還跟蹤許多統計信息,以幫助羣集用戶確定緩存的內容和應該緩存的內容。

緩存池也可以強制使用最大的時間。這限制了被添加到池中的指令的最大到期時間。

cacheadmin命令行界面
在命令行中,管理員和用戶可以通過hdfs cacheadmin子命令與緩存池和指令交互。

緩存指令由唯一的、不重複的64位整數ID標識。即使稍後刪除緩存指令,也不會重用ID。

緩存池由唯一的字符串名稱標識。

cache指令命令

addDirective
添加緩存指令。

Usage: hdfs cacheadmin -addDirective -path <path> -pool <pool-name> [-force] [-replication <replication>] [-ttl <time-to-live>]
參數 解釋
path 需要緩存的路徑。可以是目錄或文件
pool-name 將向其中添加指令的池。要添加新指令,必須對緩存池具有寫權限。
-force 跳過對緩存池資源限制的檢查。
replication 要使用的緩存複製因子。默認爲1。
time-to-live 指令有效的時間。可以指定分鐘、小時和天,例如30m、4h、2d。有效單位爲[smhd]。“never”表示永不過期的指令。如果未指定,則指令永不過期。

removeDirective
刪除緩存指令。

Usage: hdfs cacheadmin -removeDirective <id>

< id>:要刪除的緩存指令的ID。必須對指令池具有寫權限才能將其刪除。要查看cachedirective id的列表,請使用-listdirectories命令。

listDirectives
列出緩存指令.

Usage: hdfs cacheadmin -listDirectives [-stats] [-path <path>] [-pool <pool>]

< path>僅列出具有此路徑的緩存指令。注意,如果在緩存池中有一個路徑的cache指令,而我們沒有該指令的讀取權限,則不會列出該指令。
< pool>僅列出該池中的路徑緩存指令。
-stats列出基於路徑的緩存指令統計信息。

Cache pool命令

addPool
添加一個緩存池

Usage: hdfs cacheadmin -addPool <name> [-owner <owner>] [-group <group>] [-mode <mode>] [-limit <limit>] [-maxTtl <maxTtl>]

< name>新池的名稱。
< owner>池所有者的用戶名。默認爲當前用戶。
< group>池的組。默認爲當前用戶的主組名。
< mode>池的Unix樣式權限。權限以八進制表示,例如0755。默認情況下,設置爲0755。
< limit>可由該池中的指令緩存的最大字節數,總計。默認情況下,不設置限制。
< Max TLL>將被添加到池中的指令的最大允許生存時間。這可以指定爲秒、分、小時和天,例如120s、30m、4h、2d。有效單位爲[smhd]。默認情況下,沒有設置最大值。值“never”指定沒有限制。

modifyPool
修改現有緩存池的元數據。

Usage: hdfs cacheadmin -modifyPool <name> [-owner <owner>] [-group <group>] [-mode <mode>] [-limit <limit>] [-maxTtl <maxTtl>]

< name>要修改的池的名稱。
< owner>池所有者的用戶名。
< group>池組的組名。
< mode>池的Unix風格權限(八進制)。
< limit>可由該池緩存的最大字節數。
< Max TLL>將被添加到池中的指令的最大允許生存時間。

removePool
刪除緩存池。這還會取消與池關聯的路徑的緩存。

Usage: hdfs cacheadmin -removePool <name>

< name>要刪除的緩存池的名稱。

listPools
顯示有關一個或多個緩存池的信息,例如名稱、所有者、組、權限等。

Usage: hdfs cacheadmin -listPools [-stats] [<name>]

-stats顯示其他緩存池統計信息。
< Name >如果指定,只列出指定的緩存池。

help
獲取有關命令的詳細幫助。

Usage: hdfs cacheadmin -help <command-name>

< command name>要獲取詳細幫助的命令。如果未指定命令,請打印所有命令的詳細幫助。

配置

本地庫

爲了將塊文件鎖定到內存中,datanode依賴於在windows上的libhadoop.so或hadoop.dll中找到的本機jni代碼。如果使用hdfs集中式緩存管理,請確保啓用jni。

配置屬性

Required
請確保配置以下各項:

  • dfs.datanode.max.locked.memory內存
    這決定了DATOPEN將用於緩存的最大內存量。在類unix系統中,還需要增加datanode用戶的“鎖定內存大小”ulimit(ulimit-l)以匹配此參數(請參閱下面有關操作系統限制的部分)。設置此值時,請記住,您還需要內存中的空間來存儲其他內容,例如datanode和應用程序jvm堆以及操作系統頁面緩存。
    此設置與延遲持久寫入功能共享。數據節點將確保延遲持久化寫入和集中緩存管理使用的組合內存不超過dfs.data node.max.locked.memory中配置的數量。

Optional

以下屬性不是必需的,但可以指定用於調整:

  • dfs.namenode.path.based.cache.refresh.interval.ms
    namenode將使用此值作爲後續路徑緩存重新掃描之間的毫秒數。這將計算要緩存的塊以及每個包含應緩存該塊的副本的數據節點。
    默認情況下,此參數設置爲30000,即30秒。
  • dfs.datanode.fsdatasetcache.max.threads.per.volume
    datanode將使用此作爲用於緩存新數據的每卷的最大線程數。
    默認情況下,此參數設置爲4。
  • dfs.cachereport.intervalMsec
    datanode將使用此值作爲向namenode發送其緩存狀態的完整報告之間的毫秒數。
    默認情況下,此參數設置爲10000,即10秒。
  • dfs.namenode.path.based.cache.block.map.allocation.percent
    我們將分配給緩存塊映射的Java堆的百分比。緩存塊映射是使用鏈式哈希的哈希映射。如果緩存塊的數量很大,則訪問較小的映射可能會更慢;較大的映射將消耗更多內存。默認值爲0.25%。

操作系統限制

如果出現錯誤: “Cannot start datanode because the configured max locked memory size… is more than the datanode’s available RLIMIT_MEMLOCK ulimit,”這意味着操作系統對您可以鎖定的內存量施加的限制低於您配置的內存量。要解決這個問題,必須調整datanode使用的ulimit-l值。通常,這個值是在/etc/security/limits.conf中配置的,但是,它會根據您使用的操作系統和發行版而有所不同。

當你運行shell命令 ulimit -l,並且返回比dfs.datanode.max.locked.memory配置更高的值或者是字符串“unlimited”時,說明您已正確配置了此值。請注意,ulimit-l通常以KB爲單位輸出內存鎖定限制,但必須以字節爲單位指定dfs.datanode.max.locked.memory。

此信息不適用於Windows上的部署。windows沒有ulimit-l的直接等價物。

參考鏈接:https://hadoop.apache.org/docs/r3.1.2/hadoop-project-dist/hadoop-hdfs/CentralizedCacheManagement.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章