我有一项服务,它不断更新GCS存储桶中的文件,其格式为:
bucket
device_id=aaaa
month=01
part-0.parquet
month=02
part-0.parquet
....
device_id=bbbb
month=01
part-0.parquet
month=02
part-0.parquet
....
如果今天我们在month=02
,我用BigQuery运行了以下内容:
SELECT DISTINCT event_id
FROM `project_id.dataset.table`
WHERE month = '02';
我得到错误:Not found: Files /bigstore/bucket_name/device_id=aaaa/month=02/part-0.parquet
我检查了一下,查询运行时文件就在那里。
如果我运行
SELECT DISTINCT event_id
FROM `project_id.dataset.table`
WHERE month = '01';
我得到的结果没有任何错误。我想这个错误与我在查询数据时修改数据有关。但据我所知,GCS不应该是这样,这是他们的文档。
因为上传是强一致的,所以在写入后读取或元数据更新后读取操作中,您永远不会收到404未找到响应或过时数据。
我看到一些帖子,这可能与我的bucketMulti-region
有关。
还有其他见解吗?
可能是由于某种原因导致了此错误。
- 当您将数据从云存储加载到BigQuery表中时包含该表的数据集必须位于同一区域或作为云存储桶的多区域位置
- 由于一致性,对于bucket,而元数据更新强烈元数据更新操作后的读取一致完成更改可能需要时间
- 不建议使用多区域铲斗
在这种情况下,这可能是由于一致性,因为当您在执行查询的同时更新文件GCS时,所以当您执行查询时,镶木地板文件可以读取,您没有得到错误,但下次镶木地板不可用,因为服务正在更新文件,您得到了错误。
不幸的是,没有一个简单的方法来解决这个问题,但这里有一些选择:
- 您可以将pub/sub例程添加到bucket和/或文件中,然后快速关闭服务完成文件更新后的查询
- 创建一个工作流,阻止更新其bucket,直到它们的查询完成
- 如果文件的查询失败并显示"未找到",并且您已经验证GCS中是否存在ABCD,然后重试该查询X次
- 您需要将数据备份到另一个不需要备份的位置不断更新这些文件,每天只更新一次
- 您可以将数据移动到一个托管存储中这个问题是因为您可以执行快照