【问题标题】:What's causing so much overhead in Google BigQuery query?是什么导致 Google BigQuery 查询的开销如此之大?
【发布时间】:2019-05-26 17:27:30
【问题描述】:

我正在运行以下函数来分析 BigQuery 查询:

# q = "SELECT * FROM bqtable LIMIT 1'''

def run_query(q):
    t0 = time.time()
    client = bigquery.Client()
    t1 = time.time()
    res = client.query(q)
    t2 = time.time()
    results = res.result()
    t3 = time.time()
    records = [_ for _ in results]
    t4 = time.time()
    print (records[0])
    print ("Initialize BQClient: %.4f | ExecuteQuery: %.4f | FetchResults: %.4f | PrintRecords: %.4f | Total: %.4f | FromCache: %s" % (t1-t0, t2-t1, t3-t2, t4-t3, t4-t0, res.cache_hit))

而且,我得到如下信息:

初始化 BQClient:0.0007 |执行查询:0.2854 |提取结果:1.0659 |打印记录:0.0958 |总计:1.4478 | FromCache: 真

我在 GCP 机器上运行它,它只在美国位置(同一区域等)获取一个结果,因此网络传输应该(我希望?)可以忽略不计。是什么导致了这里的所有开销?

我在 GCP 控制台上试过这个,它说缓存命中需要不到 0.1s 才能返回,但实际上,它超过了一秒钟。这是一个示例视频来说明:https://www.youtube.com/watch?v=dONZH1cCiJc

注意第一个查询,例如,它说它在 0.253s 内从缓存中返回:

但是,如果您查看上述视频,查询实际上是在 7 秒和 3 帧时开始的 --

它在 8 秒和 13 帧时完成 --

那远远超过一秒——几乎一秒半!!这个数字与我在 python 中从命令行执行查询时得到的数字相似。


那么为什么它报告说它实际上只用了0.253s 进行查询并返回一个结果,它需要五倍以上的量?

换句话说,查询时间似乎有大约第二个开销无关(在执行细节中根本没有注意到)。有什么办法可以减少这个时间?

【问题讨论】:

  • 这里有两个API调用一个是执行查询,另一个是获取结果。两者是独立的,应该单独分析。另一方面,请注意,与传统的 RDBMS 相比,BQ 的最短响应时间应该是 1-3 秒而不是毫秒,因为 BQ 是一个数据湖,它是为海量数据而设计的

标签: python google-cloud-platform google-bigquery


【解决方案1】:

UI 报告的是查询执行时间,而不是总时间。

查询执行时间是 BigQuery 实际扫描数据并计算结果所需的时间。如果它只是从缓存中读取,那么它会非常快,通常不到 1 秒,这反映了你看到的时间。

但这不包括下载结果表并将其显示在 UI 中。您实际上在 Python 脚本中测量了这一点,该脚本显示 FetchResults 步骤花费了 1 秒以上,这与浏览器控制台中发生的事情相同。例如,包含数百万行的缓存查询结果将执行非常快,但可能需要 30 秒才能完全下载。

BigQuery 是一个大规模分析 (OLAP) 系统,旨在提高吞吐量而不是延迟。它使用具有密集规划过程的分布式设计,并将所有结果写入临时表。这使它可以在几秒钟内处理 PB 级数据,但代价是每个查询都需要几秒钟才能运行,无论多小。

您可以查看official documentation 以获取有关查询计划和性能的更多信息,但在这种情况下,无法进一步减少延迟。几秒钟是目前 BigQuery 的最佳情况。

如果您需要更短的重复查询响应时间,则可以考虑将结果存储在自己的缓存层(如 Redis)中,或者使用 BigQuery 将数据聚合到更小的数据集中,然后将其存储在传统的关系数据库中(如 Postgres 或 MySQL)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多