Python 避免或处理;BadRequestError:请求的查询已过期;?
我使用链接的延迟任务和查询游标在AppEngine中循环数据。Python2.7,使用db(而不是ndb)。例如 此操作总共运行约75分钟(每个任务运行约1分钟),然后引发此异常:Python 避免或处理;BadRequestError:请求的查询已过期;?,python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,我使用链接的延迟任务和查询游标在AppEngine中循环数据。Python2.7,使用db(而不是ndb)。例如 此操作总共运行约75分钟(每个任务运行约1分钟),然后引发此异常: BadRequestError:请求的查询已过期。请使用最后一个光标重新启动,以读取更多结果。 阅读,唯一说明的原因是: 新的应用程序引擎版本可能会更改内部实现细节,使依赖它们的游标无效。如果应用程序试图使用不再有效的游标,数据存储将引发BadRequestError异常 所以,也许这就是发生的事情,但我第一次尝试这
BadRequestError:请求的查询已过期。请使用最后一个光标重新启动,以读取更多结果。
阅读,唯一说明的原因是:
新的应用程序引擎版本可能会更改内部实现细节,使依赖它们的游标无效。如果应用程序试图使用不再有效的游标,数据存储将引发BadRequestError异常
所以,也许这就是发生的事情,但我第一次尝试这种技术时,我遇到了“内部实现的变化”(除非这种情况经常发生),这似乎是巧合
这还有别的解释吗?
有没有办法重新设计代码以避免这种情况
如果没有,我认为唯一的解决方案是标记哪些资产已被处理,然后在查询中添加一个额外的过滤器以排除这些资产,然后在每次流程死亡时手动重新启动流程
作为参考,我问了一些类似的问题,但公认的答案是“使用光标”,我已经在这么做了,所以这不可能是同一个问题 您可能想看看
MapReduce是一种用于处理大量数据的编程模型
以并行和分布式的方式。对于大型,
无法在单个任务范围内处理的长时间运行的作业
请求,任务如下:
- 分析应用程序日志
- 从外部来源聚合相关数据
- 将数据从一种格式转换为另一种格式
- 导出用于外部分析的数据
当我问这个问题时,我已经运行了一次代码,并经历了一次BadRequestError。然后我再次运行它,它完成了,没有出现错误,总共运行了6个小时。所以在这一点上,我想说这个问题的最佳“解决方案”是使代码幂等(以便可以重试),然后添加一些代码以自动重试 在我的具体案例中,还可以调整查询,以便在光标“过期”的情况下,查询可以在没有光标的情况下重新启动。有效地将查询更改为:
assets = models.Asset.all().order('-size').filter('size <', last_seen_size)
assets=models.Asset.all().order('-size').filter('size谢谢。在我的is_special()块中,我实际上正在调用AWS S3(通过boto sdk)哪个是urlfetch。这可以在MapReduce中完成,还是仅限于数据操作?我认为您可以在处理数据的另一个阶段之前添加一个阶段来执行urlfetch:是的,您可以按照使用自定义输入读取器来执行urlfetch。值得注意的是,BadRequestError并不总是导致实现更改的原因e-这可能是由于单个子查询超时造成的。实现重试可能是一个解决方案。@Adam谢谢。您有关于BadRequestError的其他原因的文档链接吗?-我很乐意阅读。
assets = models.Asset.all().order('-size').filter('size <', last_seen_size)