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- 一次只能查询一个地区