繁体   English   中英

如何在 pyspark 中设置动态 spark.sql.shuffle.partitions?

[英]How to set dynamic spark.sql.shuffle.partitions in pyspark?

我想动态设置 Spark (V 2.3) 配置spark.sql.shuffle.partitions并且此配置用于多个 spark 应用程序。

代码:

Spark configuration
===================
spark = SparkConf() \
 .setAppName("My App") \ 
 .set('spark.executor.memory', '7g') \
 .set('spark.num.executors', '15') \
 .set('spark.executor.cores', '4') \
 .set('spark.yarn.executor.memoryOverhead', '3098m') \
 .set('spark.sql.shuffle.partitions', '1500') \
 .set('fs.s3.multipart.uploads.enabled', 'true')

 empsql = 'Select * From Employee'  #Only 30 records and 40 columns
 df = spark.sql(empsql) ##Spark is configured
 df.coalesce(2).write.mode('overwrite').format("parquet").option("delimiter",'|').save(s3_path, header = True) #coalesce cannot be changed to repartition due to restrictions 
**Error:** Spark Out of memeory issues
**Resolved:** By changing the above spark configuration to .set('spark.sql.shuffle.partitions', '2')

对于上述数据帧,通过更改 to.set('spark.sql.shuffle.partitions', '2') 解决了问题,它不适用于具有超过一百万条记录的 spark 应用程序和它需要.set('spark.sql.shuffle.partitions', '1500')。

如何解决此问题以及如何使其动态化?

评论的初步答案 -

实际上设置 'spark.sql.shuffle.partitions', 'num_partitions' 是更改随机分区默认设置的动态方法。 这里的任务是选择最好的 num_partitions。 选择最佳 numPartitions 的方法可以是 -

  1. 基于集群资源
  2. 基于您要应用此属性的数据大小

更新-1

Que from Author- by added.set('spark.sql.shuffle.partitions',num_partitions) 会根据数据大小动态计算分区数,比如最多占用 1500 个分区吗?

@K.Tom,这只会将属性值spark.sql.shuffle.partitions设置(覆盖默认值 = 200)为num_partitions 每当发生任何shuffling action时都会使用相同的操作(火花计划中的Exchange )。 请注意,如果您的集群没有足够的资源,此操作可能会失败。 此外,如果您的集群有资源来容纳num_partitions ,但数据集不是很大,那么您可能会使大部分分区为空,这又是维护(调度、处理和维护所有这些分区的元数据)的开销。 因此得出结论,设置属性spark.sql.shuffle.partitions是艺术与科学的结合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM