编辑:李治鹏,来自浪潮信息,对象存储开发工程师
计算平台事业部 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
参考文献