GCP Dataproc:使用存储连接器的网络带宽较差

时间:2018-05-18 12:09:30

标签: apache-spark hadoop google-cloud-platform google-cloud-storage google-cloud-dataproc

更新

使用DataFrame加载文件时,我获得了更好的性能。 Haven没有机会研究为什么会这样,但是这样读到然后转换为RDD是我迄今为止找到的最佳解决方案。

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

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

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

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

我正在使用

加载到spark中
sc.textFile("gs://bucket/some/sub/directory/prefix*")

我的数据中心群集和GCS存储桶位于同一区域/区域中。该桶只是区域性的(不是多区域的)。

我观察到增加群集的大小会增加我的最大网络带宽,但我不想使用大型群集来获得合适的网络带宽。

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

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

由于

1 个答案:

答案 0 :(得分:0)

此博客文章应回答有关RDD与DataFrame性能差异的几个问题: https://www.linkedin.com/pulse/apache-spark-rdd-vs-dataframe-dataset-chandan-prakash

更一般地说:

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

在我自己对这篇文章的测试中,gsutil cp到本地磁盘的速度最慢,而各种分布式命令在你的数据集上更快(440个随机数据的1440个文本文件):

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)