【问题标题】:Google Dataproc pySpark slow on public BigQuery tableGoogle Dataproc pySpark 在公共 BigQuery 表上运行缓慢
【发布时间】:2021-07-04 16:57:35
【问题描述】:

我正在尝试在这个 google public BigQuery table 上使用 pySpark(表大小:268.42 GB,行数:611,647,042)。我将集群的区域设置为 US(与 BigQuery 表相同),但即使在集群中使用多台高性能机器时,代码也非常慢。知道为什么吗?我应该在我的存储桶中创建公共 BigQuery 表的副本吗?如果是,怎么做?

from pyspark.sql import SparkSession

spark = SparkSession.builder \
  .master('yarn') \
  .appName('spark-bigquery-crypto') \
  .config('spark.jars', 'gs://spark-lib/bigquery/spark-bigquery-latest_2.12.jar') \
  .getOrCreate()

# Use the Cloud Storage bucket for temporary BigQuery export data used
# by the spark-bigquery-connector.
bucket = "dataproc-staging-us-central1-397704471406-lrrymuq9"
spark.conf.set('temporaryGcsBucket', bucket)

# Load data from BigQuery.
eth_transactions = spark.read.format('bigquery') \
  .option('table', 'bigquery-public-data:crypto_ethereum.transactions') \
  .load()
eth_transactions.createOrReplaceTempView('eth_transactions')

# Perform SQL query.
df = spark.sql('''SELECT * FROM eth_transactions WHERE DATE(block_timestamp) between "2019-01-01" and "2019-01-31"''')

【问题讨论】:

    标签: google-cloud-platform pyspark google-bigquery dataproc


    【解决方案1】:

    这是因为 Spark 需要先将整个表加载到内存中,然后再在 Spark 执行器上运行查询。

    如果您直接在 BigQuery UI 上运行此查询将比使用 Spark 快得多。

    如果您的项目足够简单,我建议您使用 Composer 之类的调度程序运行 SQL 查询。但如果您想继续使用 Spark,请尝试在 BigQuery 上过滤尽可能多的数据。

    【讨论】:

    • 问题是我将需要使用图形框架 Spark 包中的复杂网络函数,这些函数在 SQL 中不可用,并将它们应用于整个数据集。
    • 另外,即使是以下内容也需要几分钟才能运行.. # Load data from BigQuery. table = 'bigquery-public-data:crypto_ethereum.transactions' eth_transactions = spark.read \ .format('bigquery') \ .option('table', table) \ .option("filter", "DATE(block_timestamp) between '2020-01-01' and '2020-01-31'") \ .load() eth_transactions.createOrReplaceTempView('eth_transactions') # Perform SQL query. eth_data = spark.sql( '''SELECT * FROM eth_transactions limit 10''') eth_data.show()
    • 那么您最好的选择是创建一个 BigQuery 表,该表是该查询的结果,然后使用 Spark 进行处理。
    • @frebls 在尝试重现您的问题时,我可以使用给定代码 sn-p 在具有默认配置的 Dataproc 集群上成功运行作业。这些作业大约需要 40 秒。我找不到代码有任何问题。
    • @frebls 看来这个问题需要进一步调查,所以如果您有support plan,请创建一个新的 GCP 支持案例。否则,您可以在issue tracker 上打开一个新问题。由于您必须分享您的项目 ID,请使用 this link 打开它。
    猜你喜欢
    • 2022-10-04
    • 2012-11-24
    • 2019-06-12
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 2022-10-03
    相关资源
    最近更新 更多