首页 > 解决方案 > Spark:写入云存储的数据异常缓慢

问题描述

作为 pyspark 作业的最后阶段,我需要将 33Gb 的数据保存到 Cloud Storage。

我的集群在 Dataproc 上,由 15 个 n1-standard-v4 工作人员组成。我正在使用 avro 和用于保存数据的代码:

df = spark.createDataFrame(df.rdd, avro_schema_str)
df \
   .write \
   .format("avro") \
   .partitionBy('<field_with_<5_unique_values>', 'field_with_lots_of_unique_values>') \
   .save(f"gs://{output_path}")

来自 UI 的写入阶段统计信息: 在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

我的工人统计:

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

奇怪的是,对于足够的分区大小,洗牌溢出是巨大的:

在此处输入图像描述

我想问的问题如下:

  1. 如果这个阶段需要 1.3 小时并且工人完成他们的工作 25 分钟 - 这是否意味着驱动程序将 50 分钟写入 GCS?

  2. 考虑到没有使用缓存、持久化,是什么导致了这种大小的 shuffle 溢出?

  3. 为什么舞台需要这么长时间?

更新:

SQL 选项卡:

在此处输入图像描述

标签: apache-sparkpysparkapache-spark-sqlgoogle-cloud-storageavro

解决方案


推荐阅读