首页 > 解决方案 > GCP Dataproc:使用存储连接器的网络带宽不佳

问题描述

更新

使用 DataFrame 加载文件时,我取得了非常出色的性能。还没有机会研究为什么会这样,但是像这样阅读然后转换为 RDD 是我迄今为止找到的最佳解决方案。

sparkSession.read.text("gs://bucket/some/sub/directory/prefix*")

我正在尝试将 GCS 存储桶中的文件简单地读取到 Dataproc Spark 中,然后插入到 Hive 表中。从存储桶下载文件时,我的网络带宽非常差(最大 1MB/s)。

集群:3 x n1-standard-4(一个为主)。

Bucket 有 1440 个 GZIPed 项目,大约。每个 4MB。

我正在使用

sc.textFile("gs://bucket/some/sub/directory/prefix*")

我的 dataproc 集群和 GCS 存储桶位于同一区域/地区。存储桶仅是区域性的(不是多区域性的)。

我观察到增加集群的大小会增加我的最大网络带宽,但我不想为了获得体面的网络带宽而使用大型集群。

如果我要使用 gsutil cp(在 dataproc 主 VM 实例上运行)下载相同的数据,则只需约 30 秒。

我是否缺少某些设置,或者 sc.textFile(...) 方法对于 GCS 来说非常不理想?

谢谢

标签: apache-sparkhadoopgoogle-cloud-platformgoogle-cloud-storagegoogle-cloud-dataproc

解决方案


这篇博文应该回答一些关于 RDD 与 DataFrame 性能差异的问题: https ://www.linkedin.com/pulse/apache-spark-rdd-vs-dataframe-dataset-chandan-prakash

更普遍:

  • GCS IO 性能可能因负载而异
  • IO 性能可能因 GCE 区域 VM 所在的不同而不同
  • IO 取决于 CPU 数量和磁盘大小

在我自己对这篇文章的测试中,gsutil cp本地磁盘最慢,而各种分布式命令在与您的数据类似的数据集(1440 个 4mb 随机数据的文本文件)上明显更快:

import timeit
i1 = sc.textFile("gs://my-bucket/input/*")

// Ordered by fastest first to slowest last:
timeit.timeit(lambda: spark.read.text("gs://.../input/*").count(), number=1)

timeit.timeit(lambda: i1.count(), number=1)

timeit.timeit(lambda: spark.read.text("gs://.../input/*").rdd.count(), number=1)

推荐阅读