Google bigquery 为什么我的BigQuery流媒体插入有速率限制?

Google bigquery 为什么我的BigQuery流媒体插入有速率限制?,google-bigquery,Google Bigquery,在对BigQuery进行流式插入时,我遇到了403错误。我并行地做了很多流媒体插入,所以虽然我知道这可能是一些速率限制的原因,但我不确定具体的速率限制是什么 以下是我得到的: { “代码”:403, “错误”:[{ “域”:“全局”, “消息”:“超出速率限制:您的表超出了行的配额。有关详细信息,请参阅。”https://cloud.google.com/bigquery/troubleshooting-errors", “原因”:“超出费率限制” } ], “消息”:“超出速率限制:您的表超

在对BigQuery进行流式插入时,我遇到了
403
错误。我并行地做了很多流媒体插入,所以虽然我知道这可能是一些速率限制的原因,但我不确定具体的速率限制是什么

以下是我得到的:


{
“代码”:403,
“错误”:[{
“域”:“全局”,
“消息”:“超出速率限制:您的表超出了行的配额。有关详细信息,请参阅。”https://cloud.google.com/bigquery/troubleshooting-errors",
“原因”:“超出费率限制”
} ],
“消息”:“超出速率限制:您的表超出了行的配额。有关详细信息,请参阅。”https://cloud.google.com/bigquery/troubleshooting-errors"
}

基于,
403
是由或引起的,但文档表明这两种情况都不适用于流媒体操作

但是,错误中的
消息
提到
表超出了行的配额
,这听起来更像是
403 quotaeExceed
错误。这些措施包括:

  • 最大行大小:1MB-我在这个范围内-我的平均行大小以KB为单位,我专门限制大小以确保它们不会达到1MB
  • HTTP请求大小限制:10 MB-我在这个范围内-我的平均批处理大小<400KB,最大值<1MB
  • 每秒最大行数:每个表每秒100000行。超过此金额将导致超出配额的错误。-无法想象我会超过这一步——每批大约有500行,每批大约需要500毫秒。我并行运行,但插入了大约2000个表,因此,虽然可能(尽管不太可能)我每秒执行10万行,但不可能是每个表(更像是每个表最多1000行/秒)
  • 每个请求的最大行数:500-我正好是500
  • 每秒最大字节数:每个表每秒100 MB。超过此金额将导致超出配额的错误。-同样,我的插入率在表中也没有接近这个数量

如果您有任何关于此利率限制的想法/建议,我们将不胜感激

我怀疑您偶尔会每秒向单个表提交超过100000行。您的并行insert进程可能偶尔都在同一个表上排列吗

将此报告为速率限制错误的原因是为了提供一个后退信号以降低速度:要处理单个表上的零星操作峰值,可以后退并再次尝试分散负载


这与配额失败不同,配额失败意味着重试仍将失败,直到配额时代结束(例如,每日配额限制)。

如果您可以提供项目/表格,我们可以详细了解可能发生的情况。。。该错误特定于10万行/秒/表限制,如果以O(1000/s)速率进行流式传输,则不应触发该错误。截至2019年8月,每秒100000行也适用于整个项目。因此,如果您的2000个表在同一个项目中,并且您平均每秒为每个表插入50个。在这里提示之后,经过进一步调查,看起来我确实达到了单个表的100k行/秒限制。我使用的是BigQueryTableInserter(from)的一个修改版本,我没有意识到它使用了100个线程池进行插入——因此我的每个Spark执行器一次最多可以执行100个插入(每个执行器都有自己的JVM),这可以很容易地得到大约100K行/秒/表。最后,我缩小了线程池的大小,错误就消失了。我也在使用expo后退,以防万一。我说,当我收到带有“RateLimitOvered”原因的403错误时,我可以看到作业插入了行。现在,在批处理加载场景中,我不知道是否必须为此错误回滚,文档也不是很清楚。我的默认操作是重试,然后我希望避免在Bigquery中出现重复。有什么建议吗?