Hadoop 集中式的快取管理demo

welchang發表於2021-09-09

參考文獻: https://blog.csdn.net/javastart/article/details/50586743

從Hadoop 2.3.0 開始,加入了集中式快取管理(HDFS centralized cache management)。

特點:

由namenode管理。那麼HDFS client(例如MapReduce、Impala)就可以根據block被cache的分佈情況去排程任務,做到memory-locality。

HDFS原來單純靠DataNode的OS buffer cache,這樣不但沒有把block被cache的分佈情況對外暴露給上層應用最佳化任務排程,也有可能會造成cache浪費。例如一個block的三個replica分別儲存在三個DataNote 上,有可能這個block同時被這三臺DataNode的OS buffer cache,那麼從HDFS的全域性看就有同一個block在cache中存了三份,造成了資源浪費。

加快HDFS client讀速度。過去NameNode處理讀請求時只根據拓撲遠近決定去哪個DataNode讀,現在還要加入speed的因素。當HDFS client和要讀取的block被cache在同一臺DataNode的時候,可以透過zero-copy read直接從記憶體讀,略過磁碟I/O、checksum校驗等環節。

即使資料被cache的DataNode節點當機,block移動,叢集重啟,cache都不會受到影響。因為cache被NameNode統一管理並被被持久化到FSImage和EditLog,如果cache的某個block的DataNode當機,NameNode會排程其他儲存了這個replica的DataNode,把它cache到記憶體。

我為什麼會用到

在做一個工業資料量級別的專案,包括全量資料與部分增量資料,使用parquet格式儲存在HDFS中,查詢使用Hive與SparkSQL,原本計劃重寫MapReduce的InputFormat與Spark DataSource API,在計算分片時把增量資料讀入JVM然後分發給每個分片。而Hive比較坑的一點是,當Hive使用MapReduce查詢(如count、where、join等操作),將不會使用自定義InputFormat的getSplits方法進行分片而是用自帶的CombineHiveInputFormat分片。導致無法在分片時讀入增量資料。遂考慮在每個分片內獨自讀取增量資料。但是多個程式同時讀勢必會影響速度,於是打算將增量資料儲存於集中式快取。

使用示例

命令

  • addDirective:新增指令

hdfs cacheadmin -addDirective -path path -pool pool-name [-force] [-replication replication] [-ttl time-to-live]

-path 新增的路徑 -pool 加入的緩衝池名稱 -force 不檢查快取池的資源限制 -replication 要使用的副本數,預設為1 -ttl 快取指令可以保持多長時間。可以按照分鐘,小時,天來指定,如30m,4h,2d。有效單位為[smhd]。“never”表示永不過期的指令。如果未指定該值,那麼,快取指令就不會過期。

  • removeDirective:透過id刪除指令

hdfs cacheadmin -removeDirective

  • removeDirectives:刪除執行path下所有快取命令

hdfs cacheadmin -removeDirective

  • listDirectives:顯示某一路徑下的快取資訊

hdfs cacheadmin -listDirectives [-stats] [-path path] [-pool pool]

  • -stats 顯示 列出基於path的快取指令統計資訊。

  • 新增/修改快取池:addPool/modifyPool

hdfs cacheadmin -addPool name [-owner owner] [-group group] [-mode mode] [-limit limit] [-maxTtl maxTtl] hdfs cacheadmin -modifyPool name [-owner owner] [-group group] [-mode mode] [-limit limit] [-maxTtl maxTtl]

其中, -owner/group是該pool的屬主/組,預設為當前使用者 -mode是POSIX風格許可權,預設為0755 -limit為該pool中可以快取的最大位元組數,預設沒有限制 -maxTtl 最大的生存期,可以是120s, 30m, 4h, 2d等。

  • 移除緩衝池:removePool

hdfs cacheadmin -removePool name

  • 列出緩衝池:listPools

hdfs cacheadmin -listPools [-stats] [name]

  • -stats為顯示統計資訊

實戰

hdfs cacheadmin -addPool cache_data -mode 0777
18/05/12 13:48:08 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Successfully added cache pool cache_data.

hdfs cacheadmin -addDirective -path /data -pool cache_data
18/05/12 13:50:21 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Added cache directive 1

hdfs cacheadmin -listPools -stats cache_data
18/05/12 13:50:39 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 1 result.
NAME        OWNER      GROUP  MODE            LIMIT  MAXTTL  BYTES_NEEDED  BYTES_CACHED  BYTES_OVERLIMIT  FILES_NEEDED  FILES_CACHED
cache_data  hadoop  staff  rwxrwxrwx   unlimited   never             0             0                0             0             0

hdfs cacheadmin -listDirectives -path /data
18/05/12 13:50:58 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 1 entry
 ID POOL         REPL EXPIRY  PATH      
  1 cache_data      1 never   /data



作者:orisonchan
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4830/viewspace-2811959/,如需轉載,請註明出處,否則將追究法律責任。

相關文章