笔记-Spark向量化计算在美团生产环境的实践

美团在生产环境中实践了Spark向量化计算,利用Gluten和Velox实现了性能和资源利用的优化。以下是对这一实践的概括:

向量化计算原理

  • SISD vs SIMD:传统的单指令单数据(SISD)架构每次处理一个数据点,而单指令多数据(SIMD)架构允许CPU使用更宽的寄存器同时处理多个数据点,显著提高了计算密度和效率。
  • SIMD指令集:Intel自1996年的MMX指令集开始,陆续推出了SSE、AVX、AVX512等指令集扩展,以增强CPU的向量化计算能力。

执行引擎的局限

  • 缓存命中率:按行处理数据会导致不必要的内存加载,降低缓存效率。
  • 变长字段:如字符串字段,会影响数据定位和处理效率。
  • 虚函数调用:封装在循环中的虚函数调用会带来额外的性能开销。

向量化计算的优势

  • 数据组织:按列组织数据(Block By Block)改善了数据局部性,减少了内存访问延迟。
  • 减少函数调用:批量处理同一列数据减少了函数调用次数和虚函数的开销。
  • 自动向量化:允许编译器生成更高效的代码,减少分支预测失败。

Spark向量化计算实践

  • 性能提升:测试显示,向量化版本的函数耗时降为非向量化版本的三分之一。
  • OLAP引擎的发展:向量化技术在Clickhouse、Doris等OLAP引擎中广泛应用,促使Databricks开发了Photon执行引擎,Meta开源了Velox。
  • Gluten项目:旨在为Spark SQL提供向量化执行,通过C++实现,Gluten与Velox的结合使Spark能够享受向量化执行的好处。
  • 资源节省:美团关注资源节省,尤其是内存的节省,而不仅仅是执行加速。
  • 使用C++和Rust:这些语言提供了更底层的控制,适合挖掘CPU的向量化潜力。
  • 可插拔性和跨引擎适用性:Gluten+Velox可以应用于不同的大数据引擎,如Presto和Spark。
  • 开源方案:选择了Gluten+Velox方案,而非完全自研,以减少工作量和风险。

实施过程

  • 软硬件适配:确认服务器支持必要的SIMD指令集,进行内部版本适配和典型任务测试。
  • 稳定性验证:完善特性以提高测试通过率。
  • 性能收益验证:解决内存配置、数据转换等问题,提升资源节省。
  • 一致性验证:确保数据在不同执行引擎上的结果一致。
  • 灰度上线:逐步上线向量化执行环境,监控性能和数据一致性。

遇到的问题及解决方案

  • 聚合时Shuffle阶段OOM:通过调整Gluten侧的配置降低内存占用。
  • SIMD指令crash:修改Arrow内存分配策略以确保数据对齐。
  • ORC数据格式支持:完善了对ORC格式的支持,并优化读取链路。
  • HDFS读优化:减少小数据量随机读取的放大,优化慢节点读请求。
  • Shuffle策略支持:重新设计shuffle接口,更好地适配多种shuffle模式。
  • HBO优化:将历史基线优化策略推广到堆外内存,提高内存使用效率。
  • 数据丢失和结果错误:修正低版本ORC数据读取问题,调整Count Distinct算法避免结果错误。

这一系列的优化措施和实践证明,Spark向量化计算在美团的生产环境中有效提升了性能和资源利用效率。

原文链接:https://tech.meituan.com/2024/06/23/spark-gluten-velox.html