Spark没有在还原时使用任何并行化

时间:2014-11-08 10:34:02

标签: python scala bigdata apache-spark

我是一个要点火的新手。我正在使用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])]

1 个答案:

答案 0 :(得分:1)

Spark中的默认并行度级别由配置选项spark.default.parallelism决定。默认值为:(* docs

  

本地模式:本地计算机上的核心数Mesos细粒度   mode: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参数来指定目标分区的数量。在这样的操作之后,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