編輯:李治鵬,來自浪潮信息,對象存儲開發工程師
計算平臺事業部 E-MapReduce團隊探索並開發了JindoFS 框架,用於加速存儲計算分離場景下數據讀寫性能。來自阿里雲智能團隊的姚舜揚老師帶來JindoFS存儲策略和讀寫優化的詳細介紹。本文整理自視頻https://www.slidestalk.com/AliSpark/JindoFS89850?video
本次分享主要分為四部分:
- 介紹數據緩存場景,做數據緩存的背景與動機
- 介紹數據讀寫策略原理與優化
- 緩存數據管理
- 最佳實踐與總結
數據緩存場景
在傳統的大數據分析場中,HDFS應該是一個事實上的存儲標準, HDFS是典型的把計算資源與存儲資源部署在一套集群中,即計算存儲相互融合的架構如下圖左邊所示(帶來集群計算與存儲能力不能不對稱擴展問題)。隨著這幾年數據上雲的趨勢與發展,計算與存儲分離的架構在大數據分析場景中逐漸顯現出來,越來越多的客戶選擇這樣的架構去部署他們的集群。它和與傳統基於HDFS系統架構的區別是它的計算資源與存儲資源是物理隔離的,計算集群與後端的存儲集群通過網絡進行連接,如下圖右邊所示。計算集群的大量數據讀寫操作通過大量網絡請求與存儲集群進行交互。在這種場景下網絡吞吐往往成為整個作業執行過程中的一個性能瓶頸因素。
所以在這種架構下,非常有必要在計算側(計算集群中)對後端存儲集群做一個緩存層,利用緩存層對數據的緩存,減少計算集群對存儲後端的網絡訪問,來非常明顯的消除網絡吞吐帶來的瓶頸。
JindoFS加速緩存
JindoFS就是在計算存儲分離場景中,發揮著在計算端對存儲端數據緩存加速作用,其架構與在系統中的位置如下圖所示:
首先JindoFS由以下三個部分組成:
- JindoFS SDK客戶端:所有上層計算引擎通過JindoFS SDK提供的客戶端訪問JindoFS文件系統,從而實現對後端存儲實現緩存加速
- Namespace Service:JindoFS 元數據管理以及 Storage 服務的管理
- Storage Service:用戶數據的管理包含本地數據的管理和OSS上數據的管理
JindoFS是雲原生的文件系統,可以提供本地存儲的性能以及OSS的超大容量,支持後端多樣存儲:
- 雲上數據湖場景,支持使用對象存儲存儲作為數據湖的後端
- 加速遠端HDFS(comming soon)
- 跨區部署HDFS
- 混合雲場景下線上計算集群訪問線下HDFS集群等。
數據讀寫策略及優化
寫策略
JindoFS數據寫策略分為兩種,如下圖所示:
- 寫的過程中客戶端將數據寫到對應存儲服務的緩存塊中,Storage Service通過多線程併發地把緩存數據塊上傳到後端存儲中。
- 透傳的方式,直接通過JindoFS SDK透傳的方式直接上傳後端存儲中,SDK在裡面做了很多性能相關的優化。這種方式適用數據生產者環境中,只負責產生數據,沒有後繼的計算讀需求。
讀策略
讀策略是JindoFS的重重核心,通過緩存的方式,在本地集群基於 JindoFS 的存儲能力構建了一個分佈式緩存服務,遠端的數據可以保存在本地集群,使遠端數據變成“本地化”,從而加速多次讀取數據請求,用到儘量最快的方式或路徑讀取緩存中的數據數,達到最優的讀取性能。基於這個原則,數據的讀取策略如下:
- 首先優先從本地的節點上讀取緩存數據塊,例如:Block1、Block2。
- 如果本地節點緩存中不存在,客戶端向Namespace服務請求緩存數據塊的位置,例如要讀取的數據Block3在Node2,從Node2上把Block3讀取出來。
- 如果Node中不存在,則從遠端OSS存儲集群中將數據讀取過來,同時將數據加入到本地Storage Service緩存中,加速下一次讀取該數據。
- 在以上基本策略的基礎上,JindoFS提供了支持動態多備份的策略,通過配置相關參數開啟後,達到從其他Node上讀取的數據同時,在緩存中達到備份效果,從而進一步速加高熱度的數據塊的讀取訪問。
Cache Locality
類似於HDFS的data locality,所謂的 Cache Locality就是計算層優先把task推送到數據塊所在的節點上進行執行。基於這樣的策略,task優先讀取本地緩存的數據的方式,是讀取數據效率最高的方式,從而達到最優的數據讀取性能。
由於JindoFS Namespace維護了所有緩存數據塊的位置信息,通過Namespace提供相關的API接口,將數據塊的位置信息提供給計算層,然後計算層就可以把task推送到到緩存數據塊所在的節點上,這樣可以在概率上大部分數據讀取本地緩存數據,小部分數據通過網絡獲取。基於Cache Locality保證大部分數據讀取本地,從而保證計算作業上最優的數據讀取性能,結果如下圖所示:
JindoFS的使用
基本的使用模式:
- Block模式:FindoFS 負責的元數據管理,OSS純粹的作為後端存儲數據塊。
- cache模式,對於用戶是透明無感知的
2.1. 不開啟緩存,集群規模比較小,不需要緩存。
2.2. 開啟緩存,通過本地緩存塊解決OSS帶寬不足的問題。(通過配置項jfs.cache.data-cache.enable來控制是否開啟,0關閉,1開啟)
緩存數據管理
JindoFS作為緩存系統,就是要利用本地有限的緩存資源來緩存幾乎空間無限的OSS後端,所以緩存數據管理的主要功能如下:
- 本地緩存數據塊管理
- 本地數據塊的生命週期維護
在Storage Service中實現了數據訪問信息的管理,即所有的讀寫都會向AccessManager進行註冊,同時提供了storage.watermark.high.ratio、storage.watermark.low.ratio配置項管理緩存數據。當地磁盤中緩存的使用容量達到storage.watermark.high.ratio警戒水位時 AccessManager就會自動觸發清理機制,把本地磁盤中的一些冷數據清理掉,直到storage.watermark.low.ratio水位,騰出磁盤空間給熱數據。
緩存數據塊自動清理
- 目前提供基於 LRU(Least Recently Used) 淘汰策略的自動淘汰清理冷數據塊。
- 異步冷數據清理,不影響讀寫。
如下圖所示:
顯示指定緩存
同時提供了指定緩存(Comming soon)
通過cache/uncache指令,顯式cache後端目錄或文件,或釋放冷數據
最佳實踐
怎樣配置集群
- 儘量使用較長駐的節點來做緩存
- 緩存節點的磁盤
- 緩存節點的網絡帶寬
配置項為
jfs.storage.server.cache-mode:CACHE/NOCACHE
Datalocality 相關配置
- spark.locality.wait.rack3s-> 0
- spark.locality.wait.node3s -> 0
參考文獻