ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

用AI代码助手实现Databricks成本审计:从权限配置到自动化监控

用AI代码助手实现Databricks成本审计:从权限配置到自动化监控 1. 先搞清楚 Databricks 成本优化到底要解决什么问题如果你正在用 Databricks 做数据处理或机器学习账单上的数字可能比模型训练曲线更让你心跳加速。Databricks 的成本结构复杂计算资源、存储、网络出口、DBU 费用层层叠加单靠平台自带的账单报告很难快速定位“钱到底花在哪了”更别说找到优化空间。这就是 Databricks Cost Optimizer 这类工具要解决的核心问题把模糊的云账单变成可分析、可行动的成本洞察。它不是简单地告诉你花了多少钱而是帮你回答几个关键问题哪个团队、哪个作业、哪个用户消耗了最多的资源有没有集群配置过度Over-provisioning闲置的集群是不是忘了关自动伸缩策略真的省钱了吗而“Audit Spend with Codex or Claude Code”这个提法点出了当前成本优化领域的一个新趋势用 AI 代码助手如 Codex, Claude Code来编写、理解和执行成本审计与分析脚本。传统做法可能需要你手动写复杂的 SQL 去查询系统表如system.billing.usage或者学习特定的查询语言。现在你可以用自然语言向 AI 助手描述你的分析需求让它生成可直接在 Databricks 中运行的代码大大降低了成本分析的门槛。所以这篇文章适合所有 Databricks 用户尤其是团队负责人、运维工程师和关注 FinOps财务运维的数据工程师。最关键的价值在于让你能用接近“说人话”的方式快速启动成本审计把 AI 助手从编程伙伴变成你的“云财务顾问”。2. 环境准备你的 Databricks 和 AI 助手需要哪些权限在开始让 AI 写成本审计代码之前你得先确保两个环境是通的一个是 Databricks 工作区另一个是你的 AI 代码助手如 Claude Code 插件或 Codex 集成的开发环境。2.1 Databricks 工作区权限检查AI 生成的代码最终要在 Databricks 里跑所以权限是第一步。别一上来就写复杂查询先确认基础访问能力。1. 访问系统表权限Databricks 的成本和使用量数据主要存储在系统表里例如system.billing.usage。你需要有工作区级别的CAN_MANAGE权限或者账号管理员给你分配了相应的权限才能查询这些表。普通用户默认是看不到的。怎么确认最简单的方法是用你的账号在 Databricks SQL 或 Notebook 里跑一个最简单的查询试试SELECT * FROM system.billing.usage LIMIT 1;如果返回“权限被拒绝”之类的错误你就需要联系账号管理员开通权限。这是最常见的卡点。2. 工作区与集群配置工作区版本确保你的 Databricks 工作区版本不是过于陈旧的。较新的版本系统表结构更完善。这不是硬性要求但建议在较稳定的统一版本如 DBR 10.4 LTS 以上环境下操作。集群策略运行审计查询的集群不需要高性能。建议单独创建一个用于“成本分析”的单节点集群Single Node选择较小的节点类型如Standard_F4s并设置较短的自动终止时间如15分钟。这本身就是为了省钱——用最小的资源跑审计脚本。2.2 AI 代码助手环境配置这里以在 VSCode 中配置 Claude Code 插件为例因为这是目前比较主流且免费可用的方式。Codex 通常通过 OpenAI API 调用流程类似但需要 API Key。1. 安装 Claude Code 插件在 VSCode 的扩展商店中搜索 “Claude Code”由 Anthropic 官方发布。点击安装。安装后侧边栏会出现 Claude 的图标。2. 处理连接与代理问题常见坑点安装后启动你可能会遇到连接失败的错误例如“unable to connect to anthropic services”或“cc switch local proxy failed”。这通常是因为网络访问问题。不要尝试任何非正规的网络访问工具或配置。这是红线。正确做法是检查企业网络策略如果你在公司网络可能需要联系 IT 部门确认是否对相关服务的访问端口做了限制。Claude Code 插件需要能够访问其后台服务来完成身份验证和对话。个人环境尝试在个人网络环境下确保网络连接正常。有时重启 VSCode 或等待片刻即可。备选方案如果 Claude Code 服务持续不稳定你可以将需求描述清楚然后使用其他可访问的、合规的大模型服务如一些国内备案的、面向开发者的 AI 服务来生成代码框架再在 Databricks 中调试。核心思路是“用 AI 辅助生成代码逻辑”不绑定唯一工具。3. 模型识别问题在提示词中指定使用deepseek-v4-flash等模型时可能会报错“is not a model this version of claude code recognizes”。这是因为 Claude Code 插件后端连接的是 Anthropic 自己的 Claude 模型不支持直接调用第三方模型。你只需要正常使用它默认的 Claude 模型如 Claude 3 Haiku/Sonnet即可无需指定其他模型名称。你的任务是让它理解 Databricks 成本审计的需求并生成 SQL/Python 代码而不是让它切换底层模型。配置要点总结Databricks确认有system.billing.usage等表的查询权限。AI助手在 IDE 中安装好插件能正常对话不追求特定模型。心态AI 是帮你写代码的“实习生”代码的正确性和安全性需要你把关。3. 实操用自然语言驱动 AI 生成成本审计代码环境就绪后我们就可以进入核心环节如何向 AI 提问才能得到可直接运行或稍加修改就能用的成本审计代码。关键在于提问的精准度。3.1 第一轮获取基础消费概览不要一上来就让 AI 写一个“分析所有成本”的巨无霸脚本。先从最简单的单表查询开始验证数据可访问性并建立认知。给你的 AI 助手如 Claude Code的提示词示例“我需要分析 Databricks 的成本。请帮我写一段 SQL 代码在 Databricks 中运行。查询system.billing.usage表获取最近7天内的数据。按workspace_id和sku_name分组计算每个工作区、每种资源类型的总消费金额usage_quantity*list_price和总使用量。结果按消费金额降序排列。请确保 SQL 语法符合 Databricks Photon 引擎的规范。”为什么这样问限定时间范围最近7天避免查询全量历史数据耗时过长。明确分组维度工作区、SKU这是成本分摊Showback/Chargeback的基础。指定计算方式明确金额的计算逻辑避免歧义。要求语法兼容性提醒 AI 注意 Databricks SQL 的特性。AI 可能会生成的代码框架-- 分析最近7天 Databricks 各工作区按资源类型的消费情况 SELECT workspace_id, sku_name, SUM(usage_quantity) AS total_usage, SUM(usage_quantity * list_price) AS total_cost FROM system.billing.usage WHERE usage_date DATE_SUB(CURRENT_DATE(), 7) -- 假设有 usage_date 字段实际字段名可能为 date 或 usage_start_time GROUP BY workspace_id, sku_name ORDER BY total_cost DESC;拿到代码后你要做的事字段名验证立刻检查usage_date这个字段名是否正确。实际表中常用的是usage_start_time。你需要手动修改为正确的字段名。这是 AI 目前容易出错的地方因为它无法实时连接你的数据库查看表结构。运行测试将修正后的代码复制到 Databricks SQL 或 Notebook 中在小集群上运行。确认能跑通并且返回的数据格式符合预期。理解输出看看哪个workspace_id对应哪个团队或项目花费最高哪个sku_name如“标准版 DBU”、“交互式作业 DBU”、“存储”是消费大头。3.2 第二轮深入分析集群浪费情况基础消费看清后下一步是找“浪费”。集群空转是最大的浪费源之一。更聚焦的提示词示例“基于上面的查询现在我想深入分析集群级别的浪费。请写 SQL 查询system.billing.usage表及其相关表如system.compute.clusters找出在过去24小时内有哪些集群cluster_id的总成本很高但其活跃运行时间active_seconds占计费时间的比例很低。假设有cluster_id、sku_name包含‘DBU’、usage_quantity、list_price字段。请计算每个集群的总成本、估算的活跃成本比例并筛选出比例低于30%的集群。提示活跃时间可能需要从system.compute.clusters的state和start_time/terminated_time推断。”这个提示词更高级的地方引入了业务逻辑“活跃时间占比低”是浪费的典型表现。关联了多表提示 AI 可能需要 JOIN 其他系统表。给出了假设字段帮助 AI 构建更合理的查询逻辑。设定了筛选阈值30%让分析结果更具可操作性。AI 生成的代码可能更复杂需要你更多干预-- 尝试关联集群使用详情和计费数据示例逻辑需根据实际表结构调整 WITH cluster_usage AS ( SELECT u.cluster_id, u.sku_name, SUM(u.usage_quantity) as total_dbu, SUM(u.usage_quantity * u.list_price) as cluster_cost, MAX(c.start_time) as cluster_start, -- 假设来自 clusters 表 MAX(c.terminated_time) as cluster_end FROM system.billing.usage u LEFT JOIN system.compute.clusters c ON u.cluster_id c.cluster_id WHERE u.usage_start_time DATE_SUB(CURRENT_TIMESTAMP(), 1) AND u.sku_name LIKE %DBU% AND c.state IN (RUNNING, TERMINATED) -- 假设状态字段 GROUP BY u.cluster_id, u.sku_name ), time_analysis AS ( SELECT cluster_id, cluster_cost, -- 这是一个简化的活跃时间估算实际情况复杂得多 (UNIX_TIMESTAMP(cluster_end) - UNIX_TIMESTAMP(cluster_start)) AS billed_seconds, -- 假设有某种方式估算活跃秒数这里用 0.5 作为示例占位符 (UNIX_TIMESTAMP(cluster_end) - UNIX_TIMESTAMP(cluster_start)) * 0.5 AS estimated_active_seconds FROM cluster_usage ) SELECT cluster_id, cluster_cost, estimated_active_seconds / NULLIF(billed_seconds, 0) AS active_ratio FROM time_analysis WHERE active_ratio 0.3 ORDER BY cluster_cost DESC;你需要做的关键调整表名和字段名对齐system.compute.clusters这个表名可能不准确实际可能是system.compute.cluster_events或system.clusters。你需要查阅 Databricks 官方文档找到记录集群生命周期事件的正确表。活跃时间逻辑重构上面的estimated_active_seconds计算是瞎猜的。真实逻辑需要分析集群事件日志将状态为RUNNING且未被PENDING、TERMINATING等中断的时间段累加起来。这个逻辑非常复杂AI 很难一次性写对。这时AI 的价值是给你一个初步框架和关联思路最复杂的核心逻辑需要你凭借领域知识来填充。分步调试不要一次性运行整个复杂脚本。先分别运行WITH语句中的每一个子查询确认每个中间结果都正确再组合起来。3.3 第三轮创建定期监控与告警一次性分析不够需要建立持续监控。这时可以让 AI 帮助创建定时作业和告警逻辑。提示词示例“我想在 Databricks 中创建一个每日自动运行的成本监控作业。请帮我编写一个 Python 脚本使用databricks-sdk或SQL语句。脚本需要1. 查询昨日成本比前日环比增长超过20%的工作区。2. 如果发现这样的工作区通过 Databricks API 向一个指定的 Slack Webhook 或发送邮件请用注释说明如何集成。3. 将每日结果保存到cost_monitoring.daily_spike这个 Delta 表中。请提供详细的脚本和配置步骤说明。”AI 可能会生成一个包含以下要素的脚本框架# 示例框架需填充细节 from databricks.sdk import WorkspaceClient from datetime import datetime, timedelta import requests # 用于调用 Slack Webhook import os # 初始化客户端会从环境变量 DATABRICKS_HOST 和 DATABRICKS_TOKEN 读取配置 w WorkspaceClient() def calculate_cost_spike(): yesterday (datetime.now() - timedelta(days1)).strftime(%Y-%m-%d) day_before (datetime.now() - timedelta(days2)).strftime(%Y-%m-%d) # 构建查询昨日和前日成本的 SQL query f WITH daily_cost AS ( SELECT workspace_id, DATE(usage_start_time) as cost_date, SUM(usage_quantity * list_price) as daily_total FROM system.billing.usage WHERE DATE(usage_start_time) IN ({yesterday}, {day_before}) GROUP BY workspace_id, DATE(usage_start_time) ), pivot_cost AS ( SELECT workspace_id, MAX(CASE WHEN cost_date {yesterday} THEN daily_total END) as cost_yesterday, MAX(CASE WHEN cost_date {day_before} THEN daily_total END) as cost_day_before FROM daily_cost GROUP BY workspace_id ) SELECT workspace_id, cost_yesterday, cost_day_before, (cost_yesterday - cost_day_before) / NULLIF(cost_day_before, 0) as growth_rate FROM pivot_cost WHERE cost_day_before 0 -- 避免除零 AND ((cost_yesterday - cost_day_before) / NULLIF(cost_day_before, 0)) 0.2 -- 增长超过20% # 执行查询 result w.statement_execution.execute_statement( warehouse_idYOUR_SQL_WAREHOUSE_ID, # 需要替换 statementquery, formatJSON_ARRAY ).result() alert_messages [] if result and result.data_array: for row in result.data_array: ws_id, cost_ytd, cost_dbf, rate row msg f告警: 工作区 {ws_id} 昨日成本 {cost_ytd:.2f} 较前日 {cost_dbf:.2f} 增长 {rate:.2%} alert_messages.append(msg) # 保存到 Delta 表 (示例) # w.statement_execution.execute_statement(... INSERT INTO cost_monitoring.daily_spike ...) # 发送告警示例Slack if alert_messages: webhook_url os.getenv(SLACK_WEBHOOK_URL) if webhook_url: payload {text: \n.join(alert_messages)} requests.post(webhook_url, jsonpayload) return alert_messages if __name__ __main__: calculate_cost_spike()拿到脚本后你的实施清单填充配置替换YOUR_SQL_WAREHOUSE_ID设置正确的DATABRICKS_HOST和DATABRICKS_TOKEN环境变量。完善存储逻辑编写完整的INSERT INTO cost_monitoring.daily_spike语句。设置告警通道配置 Slack Incoming Webhook 或邮件 SMTP 服务并确保运行脚本的机器能访问。创建 Databricks 作业在 Databricks 工作区创建一个 Job任务类型为“Python脚本”上传或指向这个脚本并设置每日定时触发。4. 关键排查点当成本分析代码不工作时用 AI 生成的代码在 Databricks 中运行时难免会遇到问题。别急着怀疑 AI 的能力按以下顺序排查大部分问题都能快速解决。4.1 权限与表不存在错误现象TABLE_OR_VIEW_NOT_FOUND: system.billing.usage或PERMISSION_DENIED。排查确认表名直接在工作区执行SHOW TABLES IN system或SHOW TABLES IN system.billing查看确切的表名。不同 Databricks 版本和部署模式AWS/Azure/GCP表名可能有细微差异。确认权限联系账号管理员确保你的用户或服务主体Service Principal有查询系统账单表的权限。这通常需要账号层级的设置。4.2 查询超时或返回数据空现象查询一直运行或者很快返回但结果为空。排查检查时间范围AI 生成的WHERE子句中的时间字段usage_start_time,date和日期函数CURRENT_DATE,DATE_SUB是否正确。先用一个非常宽的时间范围如WHERE usage_start_time 2023-01-01测试看是否有数据。检查集群规格复杂查询可能消耗大量资源。确保你使用的 SQL 仓库或集群有足够的内存。对于历史全量数据扫描考虑使用按需 SQL 仓库而不是交互式集群。简化查询去掉所有GROUP BY和JOIN先跑SELECT COUNT(*) FROM system.billing.usage确认数据总量和可访问性。4.3 成本计算逻辑不符预期现象自己手动估算的消费和查询结果对不上。排查理解 SKU 和定价模型list_price可能是单价但最终账单可能有折扣、承诺消费抵扣、税费等。AI 生成的usage_quantity * list_price是估算值可能与账单有出入。重点看趋势和相对值而非绝对金额。检查货币和单位确认list_price的单位是否是每小时/每DBU与usage_quantity的单位匹配。关联其他表更精确的成本分摊可能需要关联system.billing.list_prices价格表和system.access.workspaces工作区信息表。4.4 AI 生成的关联查询逻辑错误现象在 JOIN 多表时出错或者活跃时间计算完全不对。排查分而治之这是最重要的策略。不要运行 AI 生成的完整复杂脚本。把 CTEWITH 子句中的每一个子查询单独拿出来运行查看中间结果。查阅官方文档直接去 Databricks 官方文档查看system.compute.clusters、system.compute.cluster_events等表的准确 Schema 和字段含义。这是 AI 无法替代的。用简单案例验证逻辑先针对一个你知道起止时间的特定集群手动计算一次活跃时间然后用你的 SQL 逻辑去跑看结果是否匹配。修正逻辑后再推广到全量。5. 进阶思路超越基础查询构建成本优化体系当你能熟练使用 AI 助手生成基础审计代码后可以朝着更体系化的 FinOps 方向迈进。5.1 建立成本分摊Chargeback/Showback仪表板不要只停留在一次性查询。将关键成本指标可视化。目标在 Databricks SQL 或第三方 BI 工具如 Tableau中创建一个仪表板展示各团队标签、项目、工作区的每日/每周成本趋势、TOP N 消费作业、集群利用率热力图等。AI 辅助点让 AI 帮你编写创建汇总表Aggregate Table的 Delta Live TablesDLT管道代码或者生成 Grafana 监控面板的 JSON 配置。5.2 实现自动化策略自动终止闲置资源分析是为了行动。可以设置自动化策略。思路编写一个定时作业定期扫描所有运行中的集群如果其过去一小时内没有执行任何任务可通过system.compute.cluster_events判断且创建者不是特定管理员则自动调用 Databricks API 终止它并发送通知。AI 辅助点让 AI 生成调用 Databricks Clusters API (POST /2.0/clusters/delete) 的 Python 代码框架并集成条件判断逻辑。5.3 利用标签Tags进行更细粒度管理Databricks 允许为集群、作业、池等资源打上自定义标签如projectfinance,teamdata_platform,envprod。操作强制执行标签策略。让 AI 生成代码定期检查未打标签的资源并报告给管理员。分析让 AI 生成按标签分组的成本分析 SQL这是实现精准成本分摊的黄金标准。5.4 关注存储与网络出口成本成本优化不止于计算DBU。存储使用 AI 生成查询分析 Delta 表的历史版本存储增长情况识别可以执行VACUUM或转换为DEEP CLONE以优化存储的表。网络出口分析system.billing.usage中 SKU 包含“Egress”的数据找出跨区域或出云流量大的作业优化数据布局。6. 核心经验与避坑指南最后结合实践分享几个最关键的经验帮你少走弯路。AI 是“副驾驶”你才是“机长”AI 生成的代码尤其是涉及复杂业务逻辑如活跃时间计算和 API 调用时必须经过你的严格审查、测试和修改。不要直接在生产环境运行未经检验的 AI 代码。从“小查询”到“大系统”永远从最简单的单表查询开始验证数据、权限和基本逻辑。成功后再逐步增加关联、复杂计算和自动化。这能帮你快速定位问题是出在数据、权限还是逻辑上。成本数据有延迟system.billing.usage表中的数据通常有数小时到一天的延迟。做当日实时监控是不可行的你的告警和仪表板应基于 T-1 的数据。关注相对值而非绝对值由于折扣、汇率等因素代码计算出的成本可能与最终账单有出入。优化工具的核心价值在于发现异常增长趋势、不合理的资源消耗模式和跨团队/项目的对比排名。建立优化文化而不仅是技术工具最好的成本优化工具是让每个数据开发者在创建集群时思考“我需要多大规格运行多久”。将成本仪表板公开给团队比任何自动化脚本都更能驱动行为改变。把 Claude Code、Codex 这类 AI 助手当作你的 SQL 和 Python 代码生成器它能极大提升你探索成本数据、构建监控脚本的效率。但最终对 Databricks 架构、计费模型和业务需求的理解才是实现有效成本优化的根本。从今天起尝试用一句清晰的指令让 AI 帮你写出第一个成本查询迈出 FinOps 实践的第一步。
返回列表