Hadoop 集中式的快取管理demo
參考文獻: 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SpringBoot快取管理(一) 預設快取管理Spring Boot快取
- Spring Boot 2.x基礎教程:使用集中式快取RedisSpring Boot快取Redis
- SpringBoot快取管理(二) 整合Redis快取實現Spring Boot快取Redis
- SpringBoot+Redis作為二級快取整合的基本DemoSpring BootRedis快取
- 如何管理需要拼接的快取 Key快取
- 用Java寫一個分散式快取——快取管理Java分散式快取
- 快取原理與微服務快取自動管理快取微服務
- SpringBoot快取管理(三) 自定義Redis快取序列化機制Spring Boot快取Redis
- Redis的快取穿透、快取雪崩、快取擊穿的區別Redis快取穿透
- 如何在SPRING中同時管理本地快取和分散式快取? - techblogSpring快取分散式
- 快取穿透、快取擊穿、快取雪崩、快取預熱快取穿透
- 從CPU快取看快取的套路快取
- 快取穿透、快取擊穿、快取雪崩快取穿透
- 快取穿透、快取雪崩、快取擊穿快取穿透
- 對於前端快取的理解(快取機制和快取型別)前端快取型別
- 瀏覽器的快取機制—強快取與協商快取瀏覽器快取
- Redis快取擊穿、快取穿透、快取雪崩Redis快取穿透
- [Redis]快取穿透/快取擊穿/快取雪崩Redis快取穿透
- HTTP快取——協商快取(快取驗證)HTTP快取
- Redis 的高效能快取機制的三類問題:快取擊穿、快取雪崩 和 快取穿透Redis快取穿透
- 快取穿透 快取雪崩快取穿透
- 快取問題(一) 快取穿透、快取雪崩、快取併發 核心概念快取穿透
- 快取穿透、快取擊穿、快取雪崩的場景以及解決方法快取穿透
- 快取穿透、快取擊穿、快取雪崩區別快取穿透
- Linux下Rsyslog日誌遠端集中式管理Linux
- 快取問題(四) 快取穿透、快取雪崩、快取併發 解決案例快取穿透
- RDD的快取快取
- Mybatis的快取MyBatis快取
- ServiceWorker 快取與 HTTP 快取快取HTTP
- mybatis快取-二級快取MyBatis快取
- MyBatis快取機制(一級快取,二級快取)MyBatis快取
- redis進階之快取管理(1課時)Redis快取
- vuex狀態管理與瀏覽器快取Vue瀏覽器快取
- 快取淘汰、快取穿透、快取擊穿、快取雪崩、資料庫快取雙寫一致性快取穿透資料庫
- 關於快取穿透、快取擊穿、快取雪崩的模擬與解決(Redis)快取穿透Redis
- 什麼是redis的快取雪崩與快取穿透Redis快取穿透
- Mybatis的快取——一級快取和原始碼分析MyBatis快取原始碼
- Redis詳解(十二)------ 快取穿透、快取擊穿、快取雪崩Redis快取穿透