参考文章:
- 京东Spark自研Remote Shuffle Service在大促中的应用实践
- SPARK RSS 杂谈
- RSS设计文档
一、原生的 shuffle 过程
1、在mapper将shuffle数据写到本地磁盘,每个mapper会按照下游reducer的个数生成block
2、reducer在fetch环节拉取对应的block
性能问题
每个map生成的shuffle数据在一个文件中,文件分成多个block,每个block是一个下游reducer需要处理的数据,因此在shuffle read的时候,reducer需要读取上游属于自己的block,随机读比较严重。
- 数据随机读严重
- shuffle read 负载不均衡
- 数据无备份
体现在SPARK任务报错体现在,reducer的数据拉取报失败。
二、RSS 过程
1、shuffle read:在shuffle read阶段,mapper会将shuffle数据不直接罗盘针,而是按照reducer将block推到rss集群内存中。
2、RSS内存将各mapper产生的数据merge起来,存到hdfs中。
3、shuffle write:reducer在shuffle fetch的时候,reducer向Driver发起请求,拿到MapStatus消息,然后找到HDFS上聚合后的数据。
优点:
- 读数据的时候为顺序读,减少磁盘随机读和网络开销。
- rss可以做数据备份和数据去重。
- shuffle read的集群负载均衡。