以有效的方式从 BigQuery 读取到 Spark?

Read from BigQuery into Spark in efficient way?

当使用 BigQuery Connector 从 BigQuery 读取数据时,我发现它首先将所有数据复制到 Google Cloud Storage。然后将这些数据并行读取到Spark中,但是当读取big table时,在复制数据阶段需要很长时间。那么有没有更有效的方法将BigQuery中的数据读取到Spark中呢?

另一个问题:从由 2 个阶段组成的 BigQuery 读取(复制到 GCS,从 GCS 并行读取)。复制阶段受 Spark 集群大小影响还是需要固定时间?

也许 Google 员工会纠正我,但据我所知这是唯一的方法。这是因为在幕后它还使用 Hadoop 的 BigQuery 连接器,这符合 docs:

The BigQuery connector for Hadoop downloads data into your Google Cloud Storage bucket before running a Hadoop job..

附带说明一下,使用 Dataflow 时也是如此 - 它也会先将 BigQuery table(s) 导出到 GCS,然后并行读取它们。

WRT 复制阶段(本质上是 BigQuery 导出作业)是否受您的 Spark 集群大小影响,或者它是否是固定时间 - 否。 BigQuery 导出作业是不确定的,BigQuery 使用自己的资源导出到 GCS,即不是您的 Spark 集群。

spark-bigquery-connector uses the BigQuery storage API 超级快。

我强烈建议您验证是否真的需要将数据从 BQ 存储移动到 Spark 引擎。
BQ 具有计算和存储功能。什么停止利用本机 BQ 的计算。如果您使用的是固定时段计费模式,它是免费的。原生 BQ 计算至少可以激发计算能力。 如果您在 spark 中有除摄取之外的管道,则更喜欢将预聚合、浓缩、ETL 直接移动到 BQ 中。它的性能会更好、成本效益更高且易于管理。 BQ 是无服务器服务,您无需预测在数据量突然变化时处理数据所需的节点。

Spark 的另一个缺点是成本-

  1. 如果您处理大型数据集,使用存储 API 会增加很多成本。Dataproc/Dataflow 使用存储 API 从大查询中读取数据
  2. Dataproc 节点成本
  3. Dataproc 服务费用
  4. 可选 - 如果 BQ 插槽成本会被浪费,因为您不会使用它。