更新
使用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来说是非常不理想的?
由于
答案 0 :(得分:0)
此博客文章应回答有关RDD与DataFrame性能差异的几个问题: https://www.linkedin.com/pulse/apache-spark-rdd-vs-dataframe-dataset-chandan-prakash
更一般地说:
在我自己对这篇文章的测试中,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)