Google BigQuery 优化策略
Posted
技术标签:
【中文标题】Google BigQuery 优化策略【英文标题】:Google BigQuery Optimization Strategies 【发布时间】:2015-06-10 17:28:24 【问题描述】:我正在使用 Google BigQuery 从 Google Analytics Premium 查询数据。目前,我有一个查询用于计算一些指标(如总访问量或转化率)。此查询包含几个嵌套的 JOIN 子句和嵌套的 SELECT。只查询一张表时出现错误:
Error: Resources exceeded during query execution.
使用 GROUP EACH BY 和 JOIN EACH 似乎不能解决这个问题。
未来将采用的一种解决方案涉及仅提取此查询所需的相关数据并将其导出到单独的表中(然后将对其进行查询)。这个策略原则上是有效的,我已经有了一个工作原型。
但是,我想探索适用于原始表的此查询的其他优化策略。
在此演示文稿中You might be paying too much for BigQuery 中提出了一些建议,即:
缩小扫描范围(已经在做) 使用查询缓存(不适用)《Google BigQuery Analytics》一书也提到了调整查询功能,即:
GROUP BY 子句生成大量不同的组(已经 这样做了) 需要与输入值数量成比例的内存的聚合函数(可能不适用) 加入操作生成的输出数量多于输入(似乎不适用)另一种选择只是将此查询拆分为其组成的子查询,但目前我无法选择此策略。
我还能做些什么来优化这个查询?
【问题讨论】:
如果您为失败的查询提供作业 ID,Google 工程师可以查找问题所在,并可能提供解决该问题的策略。 谢谢,那太好了!作业 ID 为:job_Igf4PUrzzeUAKgD2nPlSEKb2KbU 【参考方案1】:BigQuery 为什么会出现错误?
BigQuery 是一种共享和分布式资源,因此预计作业会在某个时间点失败。这就是为什么唯一的解决方案是使用指数退避重试作业。作为黄金法则,作业应至少重试 5 次,只要作业无法完成超过 15 分钟,服务就在 SLA [1] 范围内。
可能是什么原因?
我可以想到两个可能会影响您的查询的原因:
-
数据倾斜 [2]
未优化的查询
数据倾斜
关于第一种情况,当数据分布不均匀时会发生这种情况。因为 BigQuery 的内部机制使用 MapReduce 的一个版本,这意味着如果您有一个具有数百万点击量的音乐或视频文件,那么进行数据聚合的工作人员将耗尽他们的资源,而其他工作人员将不会做太多事情这都是因为他们正在处理的视频或音乐的聚合几乎没有点击率。
如果是这种情况,建议统一分布您的数据。
未优化的查询
如果您无权修改数据,唯一的解决方案是优化查询。优化查询遵循以下一般规则:
使用 SELECT 时,请确保只严格选择所需的列,因为这会降低请求的基数(例如,避免使用 SELECT *) 避免对大量数据使用 ORDER BY 子句 避免使用 GROUP BY 子句,因为它们会阻碍并行性 避免使用 JOINS,因为它们对工作器的内存非常重,并且可能导致资源不足和资源错误(如内存不足)。 避免使用分析函数 [3] 如果可能,请对分区表进行查询 [4]。遵循这些策略中的任何一个都应该有助于您的查询减少错误并提高其整体运行时间。
附加
除非您先了解 MapReduce,否则您无法真正了解 BigQuery。因此,我强烈建议您查看 Hadoop 教程,例如 tutorialspoint 中的教程:
https://www.tutorialspoint.com/hadoop/hadoop_mapreduce.htm对于 BigQuery 的类似版本,但它是开源的(并且在各个方面都没有优化),您还可以查看 Apache Hive [4]。如果您了解 Apache Hive 失败的原因,您就会了解 BigQuery 失败的原因。
[1]https://cloud.google.com/bigquery/sla
[2]https://www.mathsisfun.com/data/skewness.html
[3]https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#analytic-functions
[4]https://cloud.google.com/bigquery/docs/partitioned-tables
[5]https://en.wikipedia.org/wiki/Apache_Hive
【讨论】:
我刚刚阅读了您的回复。感谢您抽出宝贵时间提供这么多有用的信息! @Flame_Phoenix 是项目级别的资源共享吗?还是在数据集级别?【参考方案2】:Google 的 BigQuery 有很多怪癖,因为它不兼容 ANSI。这些怪癖也是它的优点。也就是说,您将浪费太多时间直接针对 BigQuery 编写查询。您应该使用 API/SDK 或 Looker 等工具在执行时为您生成 SQL:https://looker.com/blog/big-query-launch-blog,在花钱之前为您提供资源估算。
【讨论】:
这根本不是真的。将查询写入 BigQuery 是从 PB 级数据中获取所需信息的最安全、最快速的方法之一。使用 API 或 SDK 也同样有效。以上是关于Google BigQuery 优化策略的主要内容,如果未能解决你的问题,请参考以下文章
sql [BigQuery - Facebook产品目录]查询para obtenerelcatálogodeproductos de Kichink。 #facebook #bigqu
GoogleApiException:流式传输到 BigQuery 时,Google.Apis.Requests.RequestError 后端错误 [500]
如何将 Spark-BigQuery_connector 用于现有的 spark 环境(不使用 google dataproc)
为数据集创建了外部 Bigquery 配置单元分区表,但无法查看具有分区键的列