【发布时间】:2014-08-07 11:54:31
【问题描述】:
我正在运行一项并行作业,将数据从 Heroku 复制到 Google Cloud Storage 并最终复制到 Bigquery。我现在这样做的方式是将查询范围 [61500000, 62000000) 中的 ID 的工作拆分为 40 个任务队列任务,并且在每个任务处理程序内部负责子范围说 [ 61500000、61512500)。在每个 taskqueue 任务处理程序中,它生成 3 个 goroutine 来并行查询我们的 Heroku API,以及一个额外的 goroutine 执行插入到 Google Cloud Storage 的操作。 3 HTTP API 输入 goroutine 将数据泵入 GCS 插入 goroutine 的方式是通过 io.Pipe()。
但是,由于某种原因,除了玩具工作负载外,我无法让它工作。几乎每次都会有一些分片因错误而失败:
从 storage.ObjectsInsertCall.Do() 返回。
我检查了所有可能达到收费应用配额的地方: * urlfetch 总限制 developers.google.com/appengine/docs/quotas#UrlFetch * 实例内存developers.google.com/appengine/docs/go/modules/#Go_Instance_scaling_and_class 但仍然找不到原因。 下面我解释一下为什么我排除了上述可能性:
-
urlfetch 总限制 urlfetch 在 3 个 goroutine 中用于向我们的 API 服务器查询 JSON 数据。然后这 3 个 goroutine 处理数据并通过 io.Pipe() 将它们发送到 GCS goroutine。代码看起来像
cl := urlfetch.Client(c) resp, err := cl.Get("pic-collage.com/...") 如果错误!= nil { 如果 appengine.IsOverQuota(err) { c.Errorf("collageJSONByID over quota: %v", err) } 返回错误 }
但是,虽然我们看到大量“POST www.googleapis.com/upload/storage/v1beta2...: Over quota:”错误,但我们从未看到与 Heroku 的 urlfetches 相关的日志“collageJSONByID ...”服务器。
- 实例内存 我们将 B1 实例用于我们的作业,它有 128MB 的 RAM。在整个运行过程中,我们从 appengine 控制台看到,每个实例的内存使用量始终远低于 30MB。
我还对"Over quota" when using GCS json-api from App Engine 中描述的服务帐户内的缓存应用了修复,但问题仍然存在。
我想知道我们是否有可能获得有关我们超出的特定 App Engine 配额的更多信息?或者也许还有其他文档中未提及的 Google Cloud Storage 隐藏配额?
【问题讨论】:
-
有时你的 GOPATH 包可能是最新的,但你的 GOROOT 包不是,所以你需要手动清除它们。 IIRC,当您在 Go 1.2 中拉取一个包但在本地使用 Go 1.3 拉取更新时出现了一个错误。此外,您可能应该更新您的库,以便它们指向 v1 JSON API 端点而不是 beta:groups.google.com/forum/#!topic/gs-announce/xJ0f0fsIS_8
标签: google-app-engine google-cloud-storage