我最近开始在纱线上使用火花,并在调整程序时发现了一个问题。
当SparkContext初始化为sc并准备从hdfs读取文本文件时,将调用textFile(path,defaultMinPartitions)方法。 我追踪了火花源代码中的第二个参数,最后发现了这个: CoarseGrainedSchedulerBackend.scala中的conf.getInt(“spark.default.parallelism”,math.max(totalCoreCount.get(),2))
我没有在任何地方指定属性“spark.default.parallelism”,因此getInt将从totalCoreCount和2之间的较大值返回值。
当我使用spark-submit提交应用程序并指定参数: - num-executors 2 --executor-cores 6时,我想totalCoreCount将是 2 * 6 = 12,因此defaultMinPartitions将为12。
但是当我在程序中打印defaultMinPartitions的值时,我仍然得到2回报,这是怎么回事,或者我在哪里犯错?
答案 0 :(得分:4)
在SparkContext.scala中:
def defaultMinPartitions: Int = math.min(defaultParallelism, 2)
您追踪了defaultParallelism
的计算结果。在你的情况下它确实应该是12。所以defaultMinPartitions
变为2。
最后,您不应该尝试设置defaultMinPartitions
。而是为创建RDD的操作指定显式分区计数。
答案 1 :(得分:0)
我在代码中找到了注释(在SparkContext.scala中),这可能解释了为什么使用最小值:
未给出Hadoop RDD的默认最小分区数 用户请注意,我们使用math.min这样的“defaultMinPartitions” 不能高于2.其原因在
中讨论