GCP 数据处理:使用存储连接器的网络带宽较差



更新

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

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

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

集群:3 x n1-标准-4(一个是主设备(。

存储桶有 1440 个 GZIP 项目,每个项目约 4MB。

我正在使用加载到火花中

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

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

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

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

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

谢谢

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

更一般地说:

  • GCS IO 性能可能因负载而异
  • IO 性能可能因 GCE 区域虚拟机所在的不同
  • 而异
  • 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)

最新更新