HDFS—>Namenode緩存篇

1、基本概念

2.3添加了集中式緩存管理,由Datanode堆外內存組成,Namenode統一管理node

  • 阻止頻繁使用的數據從內存中刪除
  • 因爲是Namenode統一管理,所以在讀能夠根據狀況調度,提升讀性能
  • 客戶端能夠經過零拷貝技術直接讀取緩存數據
  • 提升集羣內存利用率,讀某個文件的時候會將這個文件對應的副本N都加載到操做系統的buffer中,若是指定緩存M個,可節約N-M的內存

1.背景

  • 第一階段:未區分本地讀和遠程讀
    DFSClient—socket—>Datanode(直接讀取文件內容)
    問題:性能低
  • 第二階段:
    Datanode把文件存放位置告訴DFSClient)緩存

    DFSClient—socket—>Datanode (拿到文件存放地址)
    DFSClient直接去讀取本地文件
    問題:雖然避免一次中轉,但存在權限問題(安全漏洞)

    短路讀安全

    DFSClient經過Unix Domain Socket機制向Datanode獲取文件描述符
    解決了安全的問題
    問題
    ① Namenode並不知道這些Cache,在分配讀的時候會重複建立Cache
    ② Cache對任務調度透明,可能會出現低優先級Cache淘汰高優先級Cache
  • 第三階段:集中式緩存app

    • 用戶能夠指定經常使用數據常駐內存,避免淘汰到磁盤
    • 更合理的調度任務,儘量實現讀取本地內存,減小磁盤浪費
    • 提升讀性能 ,目標數據也在當前節點時可經過zero-copy直接從內存讀取
    • 因爲是Namenode同一管理,所以不受Datanode下線、集羣重啓等影響

2、使用

1. 配置

  1. hdfs-site.xml

第一個值默認是0,表示集中式緩存特性關閉,應該設置爲適當的值打開該特性
須要注意:系統memlock至少與配置值相同(該值依賴於系統memlock)socket

## 單位是byte
<property>
  <name>dfs.datanode.max.locked.memory</name>
  <value>0</value> 
</property>
##################如下配置不是必須################################
<property>
<name>dfs.namenode.path.based.cache.refresh.interval.ms</name>
<value>30000</value>
</property>
<property>
<name>
dfs.namenode.path.based.cache.block.map.allocation.percent
</name>
<value>0.25</value>
</property>
<property>
<name>dfs.cachereport.intervalMsec</name>
<value>10000</value>
</property>
property>
<name>dfs.datanode.fsdatasetcache.max.threads.per.volume</name>
<value>4</value>
</property>

2. 操做指令

$HADOOP_HOME/bin/hdfs cacheadmin -addPool factPool -owner hadoop-user -group hadoop-user -mod 777 -limit 1024000000 -ttl 2d
$HADOOP_HOME/bin/hdfs cacheadmin -addDirective -path /user/hive/warehouse/dw.db/user -pool factPool -force -replication 3 -ttl 1d
  • 首先新建名稱爲factPool的緩存池,並賦予相關的用戶組及權限等信息
    另外限制該緩存池能夠緩存的最大空間及緩存數據的最大TTL等;
  • 將user表數據加入到緩存池factPool進行緩存,並指定緩存時間爲1天,緩存3個副本;以後當有讀user表數據的請求過來後便可調度到緩存節點上從內存直接讀取,從而提高讀性能。其它CLI的用法可類比這裏再也不一一羅列。

3、源碼剖析

1. 流程

image.png

2. 使用場景

內存資源通常比較有限,應更合理的去使用oop

  • 存儲訪問頻繁的表
    數倉中存在一部分表被頻繁訪問/聯表查詢,將訪問頻率較高的部分表進行緩存,能夠提升數據生產的效率
  • 存儲近期的數據
    從數據倉庫應用來看,天天有大量報表統計任務,須要讀取前一天數據作分析,事實上大量表都是按天進行分區,能夠把符合要求的熱點分區數據作緩存處理,過時後清理緩存,也能大幅提高生產和統計效率;

4、問題

  1. 操做系統層面而言,這三種查詢的方式數據的流動是怎樣的(詳細)
  2. 比較讀取磁盤跟cache中10G的數據速度比例
  3. 嘗試把經常使用的小表放到緩存中,看是否能顯著提高聯表查詢速度

5、小結

經過前述分析,能夠看到HDFS集中式緩存優點很是明顯:
一、顯著提高數據讀性能;
二、提高集羣內存利用率;性能

雖然優點明顯,可是HDFS集中式緩存目前還有一些不足:
一、內存置換策略尚不支持,若是內存資源不足,緩存會失敗;(查詢最新官網看看而且作測試)
二、集中式緩存與Balancer之間還不能很好的兼容,大量的Block遷移會形成頻繁內存數據交換;
三、緩存能力僅對讀有效,對寫來講其實存在反作用,尤爲是append;
四、與Federation的兼容很是不友好;測試

總之,從集中式緩存來看,收益很是明顯,可是還存在一些小問題,在實際應用過程當中還須要優化和改進優化

相關文章
相關標籤/搜索