基于Rust语言对Apache Spark性能瓶颈的优化

This-Lynx

闫泽轩 李牧龙 罗浩铭 汤皓宇 徐航宇

目录

1 项目介绍

2 立项依据

3 具体改进

4 测试结果

5 项目总结

1 项目介绍

基于Rust版Spark开源项目vega

项目架构

2 立项依据

Rust语言

  • 安全性

  • 高性能

  • 并发性

分布式计算框架

  • Apache Hadoop

  • Apache Spark

  • Ray

  • . . .

Spark和RDD

3 具体改进

改进依据

flame img

Shuffle优化

Shuffle介绍

将输入的M个分区内的数据“按一定规则”重新分配到R个分区上。

  • 各个节点上相同key的内容写入主节点磁盘文件中
  • 相同key的数据将被拉取到同一个分区进行聚合操作

最大的性能瓶颈!

Hash Shuffle Manager

  • 对每一对Map和Reduce端的分区配对都产生一条分区记录,原版Spark生成一个文件存入,Vega将Shuffle记录保存在以DashMap(分布式HashMap)实现的缓存里
  • 由于生成的文件数过多,会对文件系统造成压力,且大量小文件的随机读写会带来一定的磁盘开销,故其性能不佳

Sort Shuffle Manager

  • 数据会根据目标的分区Id(即带Shuffle过程的目标RDD中各个分区的Id值)进行排序,然后写入一个单独的Map端输出文件中,而非很多个小文件
  • 输出文件中按reduce端的分区号来索引文件中的不同shuffle部分
  • 大幅减小了随机访存的开销与文件系统的压力,不过增加了排序的开销

我们的优化

在我们对Vega中shuffle逻辑的优化中,由于使用了DashMap缓存来保存Shuffle记录,我们无需进行排序,直接按reduce端分区号作为键值写入缓存即可。这既避免了排序的开销,又获得了SortShuffle合并shuffle记录以减少shuffle记录条数的效果。这样,shuffle输出只需以reduce端分区号为键值读出即可。

Shuffle优化测试结果

使用两千万条shuffle记录的载量进行单元测试,测试结果如下:
(Map端有M个分区,Reduce端有R个分区,$M\cdot R=20000000$

时间/s 1 2 3 平均
优化前 9.73 10.96 10.32 10.34
优化后 6.82 5.46 4.87 5.72

运行速度提升了81%

实现容错

VEGA原来的容错情况

容错机制

利用循环队列,在某从机下线时递归地进行任务的重新分发,
保证程序的正常运行,并打印出相关Error信息以供用户检查。

效果展示

fault_tolerance.png

加入HDFS文件系统

HDFS

  • Hadoop DFS
  • 基于GFS开发

实现目标

  • 从HDFS读文件
  • 利用读取的数据生成Rdd
  • 将数据写入HDFS

Hdrs

hdfs.png

  • 用Rust包装HDFS的C接口
  • 实现了Read、Write等Trait,功能丰富

读取数据/生成Rdd

  • 不能仅由主机读取
  • HdfsReadRdd
  • compute阶段读取
  • 可以解码数据

写入数据

  • 仅由主机写入

添加实时监控拓展模块

监控工具

  • Prometheus
  • Grafana
  • node_exporter

基于Docker直接部署

效果展示

效果展示

自动化测试

Alt text

Alt text

4 测试结果

5 项目总结

组员分工

  • 闫泽轩(组长):负责会议日程议程安排,对项目正确性进行测试,编写测试样例和部署测试。
  • 李牧龙:为Vega增加了HDFS的读写接口和用于调试的本地读文件接口,进行Vega和Spark的分布式运行对比测试,编写wordcount样例
  • 罗浩铭:对Vega的Shuffle模块进行优化,编写项目测试样例
  • 汤皓宇:对vega进行Docker部署,添加性能监控拓展模块,负责每次会议的记录整理
  • 徐航宇:负责Vega运行环境与配置文件的创建,撰写及维护用户手册,并为Vega实现容错机制

进度管理

时间进度 计划进度 实际进度
第八周 系统学习rust 以lab2, lab3为抓手在实验中学习Rust
第九周 编译,测试Vega模块 修复了原版Vega编译失败,部署失效的Bug
第十周 定位Vega模块 分配任务量,借鉴Spark对Vega代码进行阅读和理解
第十一到十三周 编写优化对象模块 测试Vega分布式部署,开会写注释
第十四到十五周 添加拓展模块 完成lab4, 推进HDFS加入文件系统及容错机制的编写
第十六周 跑benchmark部署测试 编写测试样例,准备进入考试周
第十七周 考试周放空
第十八周 连续五天开会高强度工作,完成所有既定任务并撰写报告和展示

项目意义与前瞻性

  • Vega继承了Spark的诸多优点
  • Vega吸收了Rust语言的诸多优良特性
  • 我们对Vega项目进行了诸多优化,进一步提升了其性能

未来的优化方向

减少序列化反序列化开销

构建更加用户友好的API

  • Rust的类型机制较为复杂
  • 原有的RDD算子类型不够丰富

建立更加完善的容错机制

  • Lineage(血统)机制实现容错
  • 降低容错为程序运行带来的成本

谢谢大家

Q&A