[英]Spark is not utlizing any parallization on reduction
我是一个新手。 我正在使用python(pyspark)编写程序。 我使用groupByKey
函数将键值对转换为键(值列表)对。 我在64核计算机上运行spark,并尝试通过使用以下命令启动程序来使用所有64核。
spark-submit --master local[64] my_program.py
但是,我注意到在执行groupByKey
函数时,仅使用了一个内核。 数据很大。 那么,为什么spark不将其划分为64个分区,而在64个不同的内核中进行归约/分组呢?
我是否缺少并行化的重要步骤?
代码的相关部分如下所示:
# Here input itself is a key-(list of values) pair. The mapPartitions
# function is used to return a key-value pair (variable x), from
# which another key-(list of values) pair is created (variable y)
x = input.mapPartitions(transFunc)
# x contains key value pair, such as [(k1, v1), (k1, v2), (k2, v3)]
y = x.groupByKey()
# y contains key-list of values pair such as [(k1, [v1, v2]), (k2, [v2])]
Spark中的默认并行度级别由配置选项: spark.default.parallelism
。 默认值为:(*来自docs )
本地模式:本地计算机上的内核数Mesos细粒度模式:8其他:所有执行程序节点上的内核总数或2,以较大者为准
可以使用以下操作将RDD重新划分为更多或更少的分区:
rdd.repartition(partitions: Int) // redistributes the RDD into the given nr of partitions
rdd.coalesce(partitions:Int) // reduces the number of partitions of the RDD to the given nr
需要内部numPartitions
操作通常采用numPartitions
参数来指定目标分区的数量。 执行此操作后,RDD将具有该新数量的分区。 让我用一个例子来说明:
鉴于:
val rdd = sc.textFile("localFile") // default nr of partitions. Let's say 2
然后:
val moreParallelRdd = rdd.repartition(64) // 64 partitions
val onePartitionRdd = moreParallelRdd.coalesce(1) // 1 partition
val sortedRdd = onePartitionRdd.sortBy(x=> sortSelector(x), numPartitions=10) // 10 partitions
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.