Google cloud storage Google云存储中的速率限制

Google cloud storage Google云存储中的速率限制,google-cloud-storage,Google Cloud Storage,在每分钟的顶端,我的代码将总共20到40个文件(从多台机器,大约5个文件并行上传,直到全部上传)上传到谷歌云存储。我经常收到429-错误太多,如下所示: java.io.IOException: Error inserting: bucket: mybucket, object: work/foo/hour/out/2015/08/21/1440191400003-e7ba2b0c-b71b-460a-9095-74f37661ae83/2015-08-21T20-00-00Z/

在每分钟的顶端,我的代码将总共20到40个文件(从多台机器,大约5个文件并行上传,直到全部上传)上传到谷歌云存储。我经常收到
429-错误太多
,如下所示:

java.io.IOException: Error inserting: bucket: mybucket, object: work/foo/hour/out/2015/08/21/1440191400003-e7ba2b0c-b71b-460a-9095-74f37661ae83/2015-08-21T20-00-00Z/
        at com.google.cloud.hadoop.gcsio.GoogleCloudStorageImpl.wrapException(GoogleCloudStorageImpl.java:1583)
        at com.google.cloud.hadoop.gcsio.GoogleCloudStorageImpl$3.run(GoogleCloudStorageImpl.java:474)
        ... 3 more
Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 429 Too Many Requests
{
  "code" : 429,
  "errors" : [ {
    "domain" : "usageLimits",
    "message" : "The total number of changes to the object mybucket/work/foo/hour/out/2015/08/21/1440191400003-e7ba2b0c-b71b-460a-9095-74f37661ae83/2015-08-21T20-00-00Z/ exceeds the rate limit. Please reduce the rate of create, update, and delete requests.",
    "reason" : "rateLimitExceeded"
  } ],
  "message" : "The total number of changes to the object mybucket/work/foo/hour/out/2015/08/21/1440191400003-e7ba2b0c-b71b-460a-9095-74f37661ae83/2015-08-21T20-00-00Z/ exceeds the rate limit. Please reduce the rate of create, update, and delete requests."
}
        at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:145)
        at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
        at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
        at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:432)
        at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
        at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
        at com.google.cloud.hadoop.gcsio.GoogleCloudStorageImpl$3.run(GoogleCloudStorageImpl.java:471)
        ... 3 more
我有一些重试逻辑,这有一点帮助,但即使在一些指数退避和最多3次重试后,我仍然经常得到错误

奇怪的是,当我进入Google开发者控制台->API&auth->API->云存储API->配额时,我看到了每个用户每秒102406.11个请求/用户。当我查看Usage选项卡时,它显示no Usage


我错过了什么?在将文件上载到地面军事系统时,如何停止速率限制?为什么我的配额这么高,而我的使用率报告为0

如果您试图过于频繁地更新同一对象,则会发生此错误。发件人:

在一个bucket中创建或更新不同对象的速度没有限制。但是,单个特定对象每秒最多只能更新或覆盖一次


根据您对多台机器在同一时刻执行操作的描述判断,我怀疑您的所有机器都试图在同一时刻写入完全相同的对象名称。GCS限制对任何单个对象每秒的写入次数(每秒1次)


因为它看起来像是以斜杠结尾的对象名,就像它们是一个目录(
work/foo/hour/out/2015/08/21/1440191400003-e7ba2b0c-b71b-460a-9095-74f37661ae83/2015-08-21T20-00-00Z/
),您是否有可能打算用一些唯一的值或机器名或其他东西来结束它们,但没有使用该位?

很有趣-重复更新同一对象是有意义的,但我已经验证了我正在编写的对象没有以斜杠结束(例如,路径的格式正确,并且所有路径都是唯一的)。我正在使用GoogleCloudStorageConnectorforHadoop进行编写(这是一个很好的工作),所以我想它一定在做这件事。将尝试将fs.gs.implicit.directory.repair设置为false,看看会发生什么。它看起来像是GSC。我能够在一个测试中复制这个问题,方法是将所有文件写入一个类似“gs://${basePath}/${fileName}”的路径,得到一个类似于$basePath的异常(像我的问题一样以斜杠结尾)。使路径的最后一位唯一,如“gs://${basePath}/${UUID.randomUuid()}/${fileName}”(为每个文件生成一个新的UUID),修复了此问题。我之前的评论错了。问题是,我在许多Spark执行器(单独的JVM)上并行地在同一目录中创建了一组新文件。如果文件不存在,GSC驱动程序将尝试为其创建父目录。这些任务在许多机器上并行运行,因此它们都试图并行创建相同的目录。在执行器上运行并行文件复制任务之前,我通过在Spark驱动程序进程中创建父目录来确保父目录存在,从而解决了这个问题。啊,这是一个已知的问题,似乎在当前的最新版本中得到了修复。请参阅Thx以获得提示!我能够摆脱我的黑客,并使用新的GCS Jar来解决这个问题。