0

我正在使用“start_pyspark_shell”命令启动我的 spark shell,并将 cli 选项提供为 - 4 个执行程序,每个执行程序 2 个内核和 4GB 内存用于工作节点和 4GB 用于主节点

存储:HDFS

输入文件:压缩的 .csv.gz 文件,大小为 221.3 MB(HDFS 上有 2 个块)和
Spart 版本:2.4.0

手头的任务是计算文件中记录数的简单任务。唯一的问题是它是一个压缩文件。我使用加载文件

df = spark.read.format("com.databricks.spark.csv").load(hdfs_path)

当我这样做时df.count(),我看到有一个执行程序任务并且可能是预期的(?),因为我正在处理一个不可拆分的压缩文件并且将使用单个分区进行操作?

我检查了分区的数量——df.rdd.getNumPartitions()它返回了 1,可能与预期的一样。

多次运行同一命令的处理时间约为 15-17 秒。

我想我们可以在这里得出结论,上述处理没有太多的并行性?

我现在尝试df.repartition(10).count()期望数据将被重新分区到 10 个新分区中,并且可能跨工作节点。我可以看到 TASKS 的数量现在取决于我指定的分区数量。我希望在执行时间方面有一些改进的性能。原来是25-26秒。

当我使用.repartition(20)时,它运行了 4 多分钟,我不得不杀死它。

性能降低。我是不是做错了什么,或者我错过了提高性能的任何步骤?

注意:我确实看到了一些很好的现有帖子,但仍然不清楚。因此发布一个新的查询。

4

1 回答 1

0

压缩文件似乎被加载到单个执行程序上的单个分区中。当我们尝试重新分区时,我们会在不同的工作节点上并行运行更多任务,但是,重新分区也需要额外的时间来将数据混洗/复制到多个工作节点。

这似乎是处理时间更长的原因。

结论:a)如果任务/动作很简单,则不值得对压缩文件的数据进行重新分区。b)如果我们有很多处理线,重新分区的成本只有一次,但多个处理活动可能会受益,并且值得额外的处理时间。

于 2020-09-18T08:32:58.157 回答