MemArtsStore
MemArtsStore基本原理
MemArtsStore是一款自研的高可用写缓存服务,关键应用场景是作为大数据应用的Remote Shuffle Service。大数据应用执行过程中会产生大量的中间临时数据即Shuffle Data,如果把Shuffle Data直接写入远端的存储服务层如OBS或EVS,再从存储服务层读取,大数据应用性能会大幅下降。现在的解决方法是将大数据应用部署在带有本地盘的计算服务器上,产生的Shuffle Data直接写入到本地盘中,再从本地盘中读取。虽然这个方法相对于OBS/EVS存储提升了大数据应用的性能,但是引入了以下问题:
- 部署灵活性低:大数据应用只能部署在带本地盘的计算服务器机型上,限制了其部署灵活性,用户也必须搭建和运维这种特殊机型。
- 可靠性低:本地盘存储Shuffle Data没有可靠性和可用性保证,本地盘故障时,Shuffle Data会丢失,导致Reduce时Fetch data失败,大数据任务重算。
- 性能不高:每个Mapper只能将自己产生的Shuffle Data写入到本节点磁盘中,当Reducer运行时需要从大量的Mapper节点拉取Shuffle Data,从而产生大量的小IO访问,性能差。
MemArtsStore可以很好的解决大数据应用的上述问题,使用MemArtsStore存储Shuffle Data后,大数据应用不再依赖带本地盘的机型;其次,MemArtsStore提供多副本机制保证Shuffle Data的高可用性,单个节点故障不会导致Shuffle Data丢失;最后,MemArtsStore内部会对相同Partition的数据进行聚合,从而消除小IO问题,提升Shuffle性能。
MemArtsStore组件由StoreMaster、StoreWorker、StoreSidecar、StoreClientProxy实例组成。
- StoreMaster负责创建管理Space/Partitions的生命周期。
- StoreWorker负责Partition的数据读写。
- StoreSidecar提供MemArtsStore服务监控采集和服务启停等能力。
- StoreClientProxy缩减MemArtsStore的内存使用的连接数目,支持MemArtsStore在大规模集群环境下使用。
MemArtsStore结构
| 名称 | 说明 |
|---|---|
| Store SDK | Store客户端,在不修改Spark代码的前提下嵌入Spark流程,将Spark的shuffle语义转换为Store的流语义,将shuffle数据分发到Store的分区。 |
| Store Master | 负责创建管理Space/Partitions的生命周期。 |
| Store Worker | 负责Partition的数据读写。 |
MemArtsStore与其他组件的关系
MemArtsStore代替Spark原生的shuffle服务,用于存储Spark的shuffle数据,Spark的Map任务将shuffle数据写到Store中,Reduce任务从Store读取shuffle数据。