如何通过表/数据集实时监控已发生的BigQuery账单成本(已完成的作业)



BigQuery计费中最大的一部分来自查询消耗。我试图通过了解哪些数据集/表消耗最多来优化这一点。

因此,我正在寻找一种跟踪BigQuery使用情况的方法,但最好是更实时的方法(我不必等一天才能得到最终结果(。例如,最好的方法是每个表/数据集在最后一个小时消耗了多少。

到目前为止,我设法找到了Dashboard Monitoring,但这只允许显示每个项目的查询和每个表存储的字节数,这不是我想要的。

还有什么其他解决方案可以检索此类信息?

使用Stackdriver日志,您可以创建一个以Pub/Sub主题为目标的接收器,用于实时分析,只过滤BigQuery日志,如下所示:

resource.type="bigquery_resource" AND
proto_payload.method_name="jobservice.jobcompleted" AND
proto_payload.service_data.job_completed_event.job.job_statistics.total_billed_bytes:*

(请参阅此处的示例查询:https://cloud.google.com/logging/docs/view/query-library?hl=en_US#bigquery-过滤器(

您可以在特定项目、文件夹甚至组织上创建接收器。这将检索在特定项目、文件夹或组织中的BigQuery中完成的所有查询。

字段proto_payload.service_data.job_completed_event.job.job_statistics.total_billed_bytes将提供查询处理的字节数。

根据按需BigQuery定价(截至目前,大多数地区的价格为5美元/TB,但请查看您自己的地区(,您可以轻松地实时估计账单。您可以创建一个数据流作业,在BigQuery中聚合结果,或者简单地将目标Pub/Sub主题与您想要进行定价计算的任何作业一起使用:

jobPriceInUSD = totalBilledBytes / 1_000_000_000_000 * pricePerTB

因为1 TB=1_000_000_0000_000 B。正如我之前所说,pricePerTB取决于区域(请参见:(https://cloud.google.com/bigquery/pricing#on_demand_pricing确切的价格(。例如,截至撰写本文时:

  • 5美元/TB
  • 亚洲-东北地区每TB 6美元1
  • 南美地区9美元/TB

此外,从现在起,每个月的第一个TB都是免费的。

使用INFORMATION_SCHEMA.JOBS_BY_*视图可能更容易,因为您不必设置stackdriver日志记录,并且可以立即使用它们。

示例&修改自Google BigQuery 中如何监控查询成本

DECLARE gb_divisor INT64 DEFAULT 1024*1024*1024;
DECLARE tb_divisor INT64 DEFAULT gb_divisor*1024;
DECLARE cost_per_tb_in_dollar INT64 DEFAULT 5;
DECLARE cost_factor FLOAT64 DEFAULT cost_per_tb_in_dollar / tb_divisor;
SELECT
ROUND(SUM(total_bytes_processed) / gb_divisor,2) as bytes_processed_in_gb,
ROUND(SUM(IF(cache_hit != true, total_bytes_processed, 0)) * cost_factor,4) as cost_in_dollar,
user_email,
FROM (
(SELECT * FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_USER)
UNION ALL
(SELECT * FROM `other-project.region-us`.INFORMATION_SCHEMA.JOBS_BY_USER)
)
WHERE
DATE(creation_time) BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY) and CURRENT_DATE()
GROUP BY 
user_email

一些注意事项:

  • 您需要UNION ALL显式使用的所有项目
  • JOBS_BY_USER在我的私人帐户上对我不起作用(据说是因为我的登录电子邮件是@googlemail,大查询将我的电子邮件存储为@gmail`(
  • WHERE条件需要根据您的计费周期(而不是最后30天(进行调整
  • 没有提供";"计费字节";信息,因此我们需要根据缓存使用情况来确定
  • 不包括";如果小于10MB,则使用10MB";条件
  • 仅保留过去180天的数据
  • DECLARE cost_per_tb_in_dollar INT64 DEFAULT 5;仅反映美国成本-其他地区可能有不同的成本-请参阅https://cloud.google.com/bigquery/pricing#on_demand_pricing
  • 一次只能查询一个地区

最新更新