2

我遇到了 BigQuery JS UDF 限制的问题。唯一记录的内存限制 [1] 是approximately 5 MB or less对 UDF 输出数据量的限制,因此我设置了一个内部检查以在输出缓冲区超过 ~3MB 时返回错误(在 base64 转换之前);但即便如此,在对一系列行运行 UDF 时,我还是遇到了限制,尽管它们单独工作正常。

例如,这失败了Resources exceeded during query execution: UDF out of memory.

WITH joined_data AS
(
  SELECT z, x, y, ARRAY_AGG(data) as data
  FROM `rmr_tests.z6_pre_agg`
  WHERE x = 14
  GROUP BY z, x, y
)
SELECT z, x, y, rmr_tests.UDFNAME(data, 4096, '{}') as mvt from joined_data

作业 ID:cartodb-gcp-backend-data-team:US.bquxjob_1628ffa1_170c4d0d50f

另一方面,如果我欺骗 Bigquery 以不同方式对 UDF 的调用进行批处理,我没有任何问题:

WITH joined_data AS
(
  SELECT z, x, y,
      ARRAY_AGG(data) as data,
      ABS(MOD(FARM_FINGERPRINT(CONCAT(CAST(x AS STRING), y, CAST(z AS STRING))), 5)) AS r
  FROM `rmr_tests.z6_pre_agg`
  WHERE x = 14
  GROUP BY z, x, y
)
SELECT z, x, y, rmr_tests.UDFNAME(data, 4096, '{}') as mvt FROM joined_data WHERE r = 0
UNION ALL 
SELECT z, x, y, rmr_tests.UDFNAME(data, 4096, '{}') as mvt FROM joined_data WHERE r = 1
UNION ALL 
SELECT z, x, y, rmr_tests.UDFNAME(data, 4096, '{}') as mvt FROM joined_data WHERE r = 2
UNION ALL 
SELECT z, x, y, rmr_tests.UDFNAME(data, 4096, '{}') as mvt FROM joined_data WHERE r = 3
UNION ALL 
SELECT z, x, y, rmr_tests.UDFNAME(data, 4096, '{}') as mvt FROM joined_data WHERE r = 4

作业 ID:cartodb-gcp-backend-data-team:US.bquxjob_3f216117_170c4d2abae

我不确定它是否重要,但传递给 UDF 的数据可能很大(在本例中约为 20 MB),并且输出类型为 BYTE(长度(mvt)报告的最大为 2.71 MB)。

过去 [2] 有一个类似的问题,它被引用为 v8 的一个可能问题,但我无法知道它是否是同一个问题。

这是我的 UDF 中的问题还是 v8+Bigquery 中的问题?我在 node 下测试了一个等效的代码,内存保持稳定(运行 20-30 分钟后没有明显的泄漏)。

[1] - https://cloud.google.com/bigquery/docs/reference/standard-sql/user-defined-functions

[2] - https://stackoverflow.com/a/35563562

编辑:在错误跟踪器中报告:https ://issuetracker.google.com/u/1/issues/151212192

4

1 回答 1

0

当您说“我在针对一系列行运行 UDF 时遇到了限制,尽管它们单独工作正常”。我认为这是您达到限制的确切原因,因为“UDF 限制文档”指的是单行,如下所示:

“处理单行时 JavaScript UDF 输出的数据量——大约 5 MB 或更少。”

于 2020-03-10T21:29:25.770 回答