2017-04-21 97 views
0

考虑下面的代码片段(Python的2.7运行星火2.1):数据分布,而在星火重新分区RDD

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], [], [], []] 

为什么重新划分数据后未在所有分布式分区?

回答

0

在pyspark repartitioncoalesce(numPartitions, shuffle=True)see core code here).IE数据被网络上所有混洗和分区在轮循方式的意义进行,第一条记录进入所述第一处理节点,第二至所述第二处理节点,但在你的情况下,因为你只分配了local[2]即两个(假设的)节点,但是我的猜测是spark只能从本地机器获得一个核心,所以它将所有值都放在任务运行的特定节点上。

+0

感谢您的评论。我不认为情况会如此。此方法在使用DataFrame时有效(请参阅https://hackernoon.com/managing-spark-partitions-with-coalesce-and-repartition-4050c57ad5c4),但在纯RDD上失败 – Khozzy