我想将一些时间序列数据流式传输到带有insertAll
的BigQuery,但仅保留最后3个月(比如说)以避免无限制的存储成本。通常的答案是save each day of data into a separate table但是AFAICT这需要提前创建每个这样的表。我打算直接从使用仅具有bigquery.insertdata
范围的令牌授权的不安全客户端流式传输数据,因此他们无法自己创建每日表。我能想到的唯一解决方案是运行一个安全的每日cron作业来创建表 - 不理想,特别是因为如果它失败了数据将被删除直到创建表。
另一种方法是将数据流式传输到单个表中,并在表增长时使用table decorators来控制查询成本。 (我希望所有查询都针对特定的时间范围,因此装饰器在这里应该非常有效。)但是,没有办法从表中删除旧数据,因此一段时间后存储成本将变得不可持续。我无法找到任何方法来复制和截断"该表也是原子的,因此我可以将旧数据分区为日常表,而不会丢失当时流式传输的行。
关于如何解决这个问题的任何想法?如果您的解决方案允许我将旧数据重新聚合到时间上较粗的行中以保留更多历史记录以获得相同的存储成本,则可获得奖励积分。感谢。
修改:刚才意识到这是Bigquery event streaming and table creation的部分副本。
答案 0 :(得分:2)
我们大多数人都在做与你描述的相同的事情。
但我们不使用cron,因为我们创建的表格提前1年或某些项目提前5年。你可能想知道为什么我们这样做,以及什么时候。
当我们由开发人员更改架构时,我们会这样做。我们进行部署,并运行一个脚本来处理旧/现有表的模式更改,并且脚本将来删除所有这些空表并简单地重新创建它们。我们没有用cron复杂化我们的生活,因为我们知道架构改变的确切时刻,即部署,并且在这么长的时间内提前创建表没有任何缺点。在创建用户或关闭帐户时,我们也会根据基于SaaS的系统对租户进行此操作。
这样我们就不需要cron,我们只是知道部署需要在架构更改时执行此额外步骤。
关于在对表执行某些维护时不丢失流式插入,您需要在应用程序级别处理业务逻辑。您可能有某种消息队列,比如Beanstalkd将所有行排队到一个管中,然后工作者推送到BigQuery。当BigQuery API响应错误并且您需要重试时,您可以使用此方法来解决此问题。使用简单的消息队列很容易做到这一点。因此,当您暂停或重命名某个表一段时间时,您将依赖此重试阶段。流式插入将失败,很可能是因为表尚未准备好进行流插入,例如:已经临时重命名以进行一些ETL工作。
如果你没有这个重试阶段,你应该考虑添加它,因为它不仅有助于重试BigQuery失败的调用,而且还允许你有一些维护窗口。
答案 1 :(得分:2)
如果你看一下流API发现文档,那就是一个名为" templateSuffix"的一个奇怪的新实验领域,有一个非常相关的描述。
我还指出,没有官方文档发布,因此应特别注意使用此字段 - 尤其是在生产环境中。实验领域可能有错误等。我能想到的事情要小心我的头脑是:
我确定其他事情。无论如何,只是想到我指出了这一点。我确信官方文档会更加全面。
答案 2 :(得分:0)
你已经通过分区解决了它。如果表创建是一个问题,则在appengine中有一个每小时的cron来验证今天和明天的表总是被创建。 很可能该引擎不会超过免费配额,它的正常运行时间为99.95%SLO。 cron永远不会失败。