apache-spark - 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 来说非常不理想?
谢谢
解决方案
这篇博文应该回答一些关于 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)
推荐阅读
- bash - 无法使用“未设置”操作数组
- ruby-on-rails - 未初始化的常量 (NameError) Ruby
- django - 谷歌云数据存储回滚之前保存的行
- python-3.x - groupby value_counts 存储在数据框中
- javascript - HTML5 Canvas Resize - 可以控制或预测内存问题吗?
- mat-table - Mat选项卡切换自定义按钮单击
- javascript - 如何在 ReactJs 中的箭头函数内传递事件和其他参数
- java - FileChooser 保存对话框上的 JavaFX ExtensionFilter 在 macOS 上太宽
- php - 验证数组是否已存在于 mysql php laravel
- mongodb - 在mongodb中查找指定大小的句子中的第一个和第二个单词