Facebook的Cosco Shuffle算法类似社区当前的https://issues.apache.org/jira/browse/SPARK-25299
思路(remote shuffle service),但SPARK-25299只是针对SortShuffleManager算法实现的,Cosco Shuffle算法是一种完全Shuffle分离的实现( fully disaggregated shuffle implementations)。当前facebook的同学也正在尝试着想将这部分的实现合入到社区中。
背景及现状分析
- 在存储、计算分离的架构实现中,磁盘存储很容易成为性能的瓶颈:
- Small IO size: 小文件问题导致需要多次seek(IO),进而影响到吞吐量;
- 而为了改进该问题,有两种途径:
- 增大交互IO大小以提升整体吞吐量: 优化shuffle算法避免小文件读写;
- Read/Write更少的数据减少吞吐需求:减少读写放大;
下图就展示了读写IO大小对整体吞吐的影响:
Cosco Shuffle的实现
- Mappers: 每个partition共享一个Write-Ahead Buffer(根据需求是否排序,这个是在remote shuffle实现的);
- Reducers: 顺序读取shuffle数据;
这样带来的好处有:
- 增大IO文件大小: 从IO平均大小200KB->2.5MB;
- 解决写放大问题: 3x -> 1.2x;
方案设计
- 在mappers/reduers之间增加了cosco中间服务(类似于remote shuffle service)的实现;
- Cosco is based on the idea of partial in-memory aggregation across a shared pool of distributed memory. This provides vastly improved efficiency in disk usage compared to Spark’s built-in shuffle.;
- 同时Cosco是内存设计的,极大地提供了shuffle性能;
- 而在shuffle数据的写入时决定是否排序,减少在reduce的时候排序(依赖reduce的迭代器的优化,基于归并排序的方法),来减少读写放大;