Apache spark 在spark中处理压缩文件:重新分区可以提高或降低性能吗

Apache spark 在spark中处理压缩文件:重新分区可以提高或降低性能吗,apache-spark,apache-spark-sql,compressed-files,Apache Spark,Apache Spark Sql,Compressed Files,我正在使用“start_pyspark_shell”命令启动我的spark shell,并将cli选项设置为-4个执行器,每个执行器2个内核,工作节点内存为4GB,主节点内存为4GB 存储:HDFS 输入文件:大小为221.3 MB的压缩.csv.gz文件(HDFS上有2个块)& Spart版本:2.4.0 手头的任务很简单,可以计算文件中的记录数。唯一的问题是它是一个压缩文件。 我使用 df = spark.read.format("com.databricks.spark.csv&

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

存储:HDFS

输入文件:大小为221.3 MB的压缩.csv.gz文件(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个新分区中,并且可能跨工作节点。我可以看到,现在任务的数量与我指定的分区的数量是一致的。我希望在执行时间方面有一些改进。结果现在是25-26秒

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

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


注意:我确实看到了一些关于这方面的好文章,但仍然没有弄清楚。因此发布了一个新的查询。

压缩文件似乎被加载到单个执行器上的单个分区中。当我们尝试重新分区时,会有更多的任务在不同的工作节点上并行运行,但是,重新分区也会产生额外的时间,以便将数据随机/复制到多个工作节点

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

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

您能否在spark UI中检查所有任务是否都在运行,或者只有一个任务在运行,而另一个任务只是处于死机状态。请验证任务的状态一次。还要检查您工作的spark UI中的spark事件时间线,并检查哪个阶段需要更多时间。