从运行时火灾到飞行前控制:Spark SQL 的守门人模型

主要观点:为解决 Spark 中因用户查询问题导致的资源浪费等问题,作者构建了一个查询门控系统,利用 SQLGlot 进行快速语法检查,结合 LLM 处理语义问题,有效阻止了不良查询,提高了效率并节省了成本。
关键信息:

  • 凌晨 2 点集群仪表盘变红,用户提供的查询中有一个逗号导致浪费计算资源等问题,于是决定构建门控系统。
  • 尝试了多种单独的工具如 SQLGlot、JSQLParser 等,都存在各自问题,最终选择 ADK + SQLGlot 的混合方案。
  • Spark 的原生解析器在提交查询时不完全验证,存在早期计算分配、后期失败、错误信息晦涩、反馈慢、自动缩放波动等问题,需要更早的阻止机制。
  • 系统流程包括工具验证器、错误解释器代理、模型验证器代理和协调器代理,通过自定义的CoordinatorAgent处理逻辑。
  • 模型验证器的提示很重要,要明确且有示例,设置特定的生成配置以保证输出格式。
  • 经过测试,系统能有效阻止不良查询,目前约 90%的畸形查询被提前阻止,还将进一步优化。
    重要细节:
  • 各种工具尝试的优缺点,如 SQLGlot 解析快但用户体验差,JSQLParser 不理解 Spark 扩展等。
  • 系统代码中CoordinatorAgent的具体实现,包括对不同情况的处理和状态管理。
  • 模型验证器提示的设置,如严格的 JSON 模式、零温度设置和示例等。
  • 测试查询的结果展示,包括工具验证器和验证器(人类友好型)的输出。
  • 总结的经验教训,如解析器的局限性、LLM 的特点和注意会话泄露等。
  • 未来的计划,如接入 Hive Metastore、统计节省成本等。
阅读 21
0 条评论