Cosco: an efficient facebook-scale shuffle service

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大小对整体吞吐的影响:


屏幕快照 2019-11-17 23.15.29.png

Cosco Shuffle的实现

  • Mappers: 每个partition共享一个Write-Ahead Buffer(根据需求是否排序,这个是在remote shuffle实现的);
  • Reducers: 顺序读取shuffle数据;

这样带来的好处有:

  • 增大IO文件大小: 从IO平均大小200KB->2.5MB;
  • 解决写放大问题: 3x -> 1.2x;
屏幕快照 2019-11-17 23.24.42.png

方案设计

  • 在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的迭代器的优化,基于归并排序的方法),来减少读写放大;
屏幕快照 2019-11-17 23.28.49.png

参考

  • https://databricks.com/session/cosco-an-efficient-facebook-scale-shuffle-service

你可能感兴趣的:(Cosco: an efficient facebook-scale shuffle service)