在Spark中重新分区RDD时的数据分发

时间:2017-04-21 10:19:32

标签: python apache-spark pyspark

考虑以下代码段(在Python 2.7上运行Spark 2.1):

nums = range(0, 10)

with SparkContext("local[2]") as sc:
    rdd = sc.parallelize(nums)
    print("Number of partitions: {}".format(rdd.getNumPartitions()))
    print("Partitions structure: {}".format(rdd.glom().collect()))

    rdd2 = rdd.repartition(5)
    print("Number of partitions: {}".format(rdd2.getNumPartitions()))
    print("Partitions structure: {}".format(rdd2.glom().collect()))

输出结果为:

Number of partitions: 2
Partitions structure: [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]

Number of partitions: 5
Partitions structure: [[], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [], [], []]

为什么重新分区数据没有在所有分区中分发?

1 个答案:

答案 0 :(得分:0)

pyspark中的

repartitioncoalesce(numPartitions, shuffle=True)see core code here)。。数据在整个网络中进行洗牌,分区以循环方式完成,意思是,第一条记录转到第一个处理节点,第二个到第二个处理节点,但在你的情况下你只分配了local[2]即两个(假设的)节点,但我的猜测是spark只能从你的本地机器获得一个核心,所以它将所有值放在任务运行的特定节点中。