笔记-Spark向量化计算在美团生产环境的实践
![](https://p0.meituan.net/travelcube/1df890f023fb32528670ad8f96d2da5b172509.png)
笔记-Spark向量化计算在美团生产环境的实践
Msdwei美团在生产环境中实践了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