如何解决处理Spark中的压缩文件:可以重新分区以提高或降低性能
我正在使用“ 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分钟以上,因此我不得不将其杀死。
性能降低。我做错了什么还是错过了提高性能的任何步骤?
注意:我确实看到了一些很好的相关文章,但仍不清楚。因此,发布一个新查询。
解决方法
压缩文件似乎被加载到单个执行程序的单个分区中。当我们尝试重新分区时,我们会在不同的工作程序节点上并行运行更多任务,但是,重新分区也需要花费更多时间将数据改组/复制到多个工作程序节点。
这似乎是处理时间更长的原因。
结论: a)如果任务/动作很简单,则不值得对压缩文件的数据进行重新分区。 b)如果我们需要大量的处理,那么重新分区的成本只有一次,但是可以受益于多个处理活动,并且值得增加处理时间。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。