Google bigquery 将数据流传输到BigQuery中的旋转日志表中

Google bigquery 将数据流传输到BigQuery中的旋转日志表中,google-bigquery,Google Bigquery,我想用insertAll将一些时间序列数据流式传输到BigQuery中,但只保留最后3个月(比如)以避免无限的存储成本。通常的答案是,但这需要提前创建每个这样的表。我打算直接从使用令牌授权的不安全客户端流式传输数据,该令牌仅具有bigquery.insertdata作用域,因此它们无法自己创建每日表。我能想到的唯一解决方案是运行一个安全的日常cron作业来创建表——这并不理想,特别是如果它出错,数据将被删除,直到创建表为止 另一种方法是将数据流到单个表中,并在表增长时使用它来控制查询成本。(我希

我想用
insertAll
将一些时间序列数据流式传输到BigQuery中,但只保留最后3个月(比如)以避免无限的存储成本。通常的答案是,但这需要提前创建每个这样的表。我打算直接从使用令牌授权的不安全客户端流式传输数据,该令牌仅具有
bigquery.insertdata
作用域,因此它们无法自己创建每日表。我能想到的唯一解决方案是运行一个安全的日常cron作业来创建表——这并不理想,特别是如果它出错,数据将被删除,直到创建表为止

另一种方法是将数据流到单个表中,并在表增长时使用它来控制查询成本。(我希望所有查询都是针对特定的时间范围的,因此这里的decorator应该非常有效。)但是,无法从表中删除旧数据,因此存储成本在一段时间后将变得不可持续。我也找不出任何方法来原子地“复制和截断”表,这样我就可以将旧数据划分到日常表中,而不会丢失当时流式传输的行

有没有办法解决这个问题?如果您的解决方案允许我将旧数据重新聚合到时间上更粗糙的行中,以在相同的存储成本下保留更多的历史记录,则会有额外的好处。谢谢


编辑:刚刚意识到这是的部分重复。

您已经通过分区解决了它。如果表创建是一个问题,请在appengine中使用每小时一次的cron来验证是否始终创建了今天和明天的表。
很可能appengine不会超过免费配额,并且它的正常运行时间有99.95%的SLO。cron永远不会崩溃。

我们大多数人都在做与您描述的相同的事情

但我们不使用cron,因为我们提前1年或提前5年在某些项目上创建表。你可能想知道我们为什么这样做,什么时候这样做

当模式被开发人员更改时,我们会这样做。我们进行部署并运行一个脚本,该脚本负责旧表/现有表的模式更改,该脚本从将来删除所有这些空表,并简单地重新创建它们。我们没有使用cron使我们的生活复杂化,因为我们知道模式更改的确切时刻,这就是部署,在如此长的时间内提前创建表没有任何缺点。当用户被创建或他们关闭帐户时,我们也会在基于SaaS的系统上基于租户进行此操作

这样我们就不需要cron,我们只需要知道当模式改变时,部署需要执行这个额外的步骤

关于在我对您的表进行维护时不要丢失流式插入,您需要在应用程序级别的业务逻辑中解决这个问题。您可能有某种消息队列,比如Beanstalkd将所有行排队到一个管道中,然后工作人员推送到BigQuery。当BigQueryAPI响应错误并且需要重试时,您可能会遇到这个问题。使用简单的消息队列很容易做到这一点。因此,当您停止或重命名某个表一段时间时,您将依赖于此重试阶段。流式插入将失败,很可能是因为表尚未准备好进行流式插入,例如:已临时重命名以执行一些ETL工作


如果你没有这个重试阶段,你应该考虑添加它,因为它不仅有助于对BigQuice失败的调用进行重试,而且还允许你做一些维护窗口。

< P>如果你查看流API发现文档,有一个奇怪的新的实验场叫做“TeMeStuffuFix”,它有一个非常相关的描述。 我还要指出,还没有发布任何官方文档,所以在使用这个字段时应该特别小心——特别是在生产环境中。实验场可能有虫子等。我脑子里想起来要小心的事情有:

  • 以不向后兼容的方式修改基表的架构
  • 以与基表不兼容的方式直接修改已创建表的架构
  • 通过此后缀直接流式传输到创建的表——行插入ID可能不会跨边界应用
  • 在创建的表被流式传输到时对其执行操作

我相信还有其他事情。不管怎样,我只是想指出这一点。我相信官方文档将更加全面。

您已经通过分区解决了这个问题。如果表创建是一个问题,那么每小时有一个cron来验证是否始终创建了今天和明天的表。我希望将其作为一个无服务器解决方案。如果我使用cron作业,我需要一个服务器来运行它,并进行监视以确保它不会死掉,否则我将丢失数据。所有这些都是可行的,但如果可能的话,我宁愿避免开销。如果您使用appengine cron,则情况并非如此