【发布时间】:2018-10-28 21:06:33
【问题描述】:
更新
当使用 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 主虚拟机实例上运行)下载相同的数据,则只需大约 30 秒。
是否缺少某些设置,或者 sc.textFile(...) 方法对于 GCS 非常不理想?
谢谢
【问题讨论】:
-
您在该 spark 应用程序中有多少个 spark 核心?据我了解,您的输入将被转换为具有 1440 个分区的 RDD(因为 gzip 不可拆分),并且这些 1440 个任务将在您可用的 spark 核心上安排。对于您规模的集群,它可能是 8 个核心,即 8 个并行任务,因此总时间约为 1400/8=180 次执行一个任务。
-
我已经用各种不同大小的集群运行它,随着内核的增加,性能似乎呈线性增长,但基本速度太慢了。请参阅上面的编辑以发布迄今为止我找到的最佳解决方案。
-
您可能希望使用对 IO 性能有显着改进的最新 GCS 连接器 1.9.6 (github.com/GoogleCloudPlatform/bigdata-interop/releases/tag/…)。您可以使用初始化操作更新 Dataproc 集群上的 GCS 连接器:github.com/GoogleCloudPlatform/dataproc-initialization-actions/…
标签: apache-spark hadoop google-cloud-platform google-cloud-storage google-cloud-dataproc