編輯:李治鵬,來自浪潮資訊,對象存儲開發工程師
計算平台事業部 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上讀取的資料同時,在緩存中達到備份效果,進而進一步速加高熱度的資料塊的讀取通路。
JindoFS 存儲政策和讀寫優化
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
參考文獻