google-bigquery - BigQuery 可以被视为通用 DW 吗?
问题描述
我的大部分平台都在 Google Cloud 上,我们对此非常满意。但就目前而言,在我看来,虽然BigQuery (BQ)
可以处理难以想象的数据量,但它只能在价格和性能方面表现良好,适用于狭窄的场景。当我们正在考虑更改为 时Redshift
,我想分享我的(可能是错误的)结论,以避免误解。
以下是我们现在的部分和结论:
- 我们需要
stream
数据到BQ
. 维度内容可能会更改,更改必须流式传输到 BQ。 - 假设某些用户将事务更改
record X
为“steve
”,而不是“John
”,然后更改为“Robert
”。BQ
由于这些限制,流式传输到的挑战是您必须至少等待 30 分钟才能再次 DML 记录 X(尽管我在 DML 42 分钟后出现缓存错误)。所以我们需要构建的不仅仅是队列,因为第三个 DML 不需要等待 30 分钟,而第二个 DML 必须被忽略。 - 由于您只能
insert/*
在表上同时运行操作(delete/delete, delete/update, update/update
不允许),因此所有非insert DML
流式操作都必须是serialized
. DML latency
是一个巨大的问题。流式传输insert
是可以的,也很容易bulk insert
,但是流式传输delete
或update
每次操作将花费您半秒的时间,并且必须serialized
基于表格。因此,如果您的系统中发生了很多updates
事情,那么您可能queue
永远不会结束。- 尽管本文指出
BQ
能够处理“对查询延迟极为敏感的工作负载”,但在我看来,这在很大程度上取决于您的用例。对于我的用例(小resultset
),SQL
延迟太高,对于一个小查询来说至少需要两秒钟。 - 价格是不可预测的,据我了解,它不适合您希望
resultset
在不那么大的情况下运行数百个小查询的用例datasets
。您为扫描时访问的数据列付费(但请记住,没有索引)。如果您有 a60KB resultset
,无论您的过滤条件多么精确120GB dataset
,您都将为此付出代价(您可以尝试避免使用、和其他技术,但是当一组非常基本的索引可以完成这项工作时,它会增加您的复杂性)。120GB
sharding
partition
rollup temporary tables
当然,好的一面是BQ
完整serverless
的,没有基础设施复杂性,没有调优,没有索引,不用担心高可用性并且存储价格是公平的。
所以,据我所知,如果你想要低延迟,如果你的数据发生变化(即使是很少的变化),如果你的用例不要求你扫描大量数据,你应该避免BQ
.
欢迎任何考虑。
[编辑]:小Resultset
而大Dataset
。因此,postgree 可能不是我们想要成为的选择。
解决方案
作为后续,我在原帖中提到的问题上学到了一些要点。
虽然我认为我写的都是对的,但我提到的大部分问题的解决方案都不是 Redshift。您将解决几个问题,创造几个其他问题,并且仍然会面对其中的大部分。
因此,关于我对 Redshift 的了解导致我决定继续使用(披露:BQ
我与BQ
Redshift
DML 延迟与BQ
. 不同的原因,几乎相同的症状。如本文档所述,您可以为已更新的每一列存储 1 MB。- 与基础设施方面相比,太多细节
BQ
- 这项技术对我来说似乎更古老。无共享架构是众所周知的痛苦管理任务的来源,虽然这是一个非常难以解决的问题,但十多年前
Oracle
就已经解决了这个问题。Google BQ
以完全不同的方式面对问题,将存储层与处理层分开。作为一种postgre
演变,Redshift 保留了一些DDL
约束语言(如主键),它们不仅无害,而且在使用时会产生错误的输出select distinct
,例如。 - 本身不支持复杂的结构
arrays
是绝对不行的。似乎 Redshift 可以通过频谱访问 S3 中的外部数据,但这不是我们想要的。 - 虽然我没有深入探讨这个话题,但
Redshift
在我看来,将数据流式传输到BQ
.
从好的方面来说,如果你使用 DW 的时间超过 20% ,它会更便宜,这是我的情况,你会发现更多的 BI 工具覆盖率。
如果流数据和 DML 延迟是最重要的,或者您需要较小结果集上的 SQL 延迟,那么使用 Oracle 或其他非列式 DW 可能会更好。
推荐阅读
- java - 在 java 编译器中标记行的问题
- python - 在 Python 中返回簇段的平均值
- javascript - 我该如何解决这个错误:SyntaxError: await is only valid in async function
- node.js - Nodejs MSSQL如何同时池化多个数据库
- python-3.x - 有没有办法设置可以放入 python 3 中的一组值?
- javascript - Discord.js 日志记录,如何通过嵌入将问题发送到特定频道?
- typescript - TypeScript 中的泛型和类型推断
- jenkins - 詹金斯登录后重定向回主页
- json - 如何在 django 函数中将单个对象作为 json 响应返回?
- python - 如何检查科学记数法是否存在 Python?