2016-05-22 71 views
1

我想了解RDD分区逻辑。 RDD在节点间进行分区,但希望了解这种分区逻辑的工作原理。RDD分区逻辑

我有4个内核分配给它的虚拟机。我创建了两个RDD,一个来自HDFS,一个来自并行操作。得到了创建

enter image description here

第一次两个分隔但在第二操作4分区得到创建。

我检查了分配给文件的块号 - 它是1块,因为文件非常小,但是当我在该文件上创建了RDD时,它显示了两个分区。为什么是这样 ?我在某处看到,分区还取决于核心,在我的情况下,这仍然不能满足该输出。

有人可以帮助理解这一点吗?

+1

[HDFS上的文件数据分区如何工作?](http://stackoverflow.com/questions/29011574/how-does-partitioning-work-for-data-from-files-on- hdfs) – sgvd

回答

2

textFile完整的签名是:

textFile(path: String, minPartitions: Int = defaultMinPartitions): RDD[String] 

以第二个参数,minPartitions,你可以设置你想要得到的分区的最小量。正如你所看到的,默认情况下它设置为defaultMinPartitions,这反过来又被定义为:

def defaultMinPartitions: Int = math.min(defaultParallelism, 2) 

defaultParalellism值配置了spark.default.parallelism设置,默认运行星火时候取决于你的内核数量在本地模式下。这是4你的情况,所以你得到min(4, 2),这就是为什么你得到2个分区。

+0

伟大的答案。你是怎么想到的:“defaultParalellism的值是用spark.default.parallelism设置配置的”?? – bigdatamann

+0

首先通过假设变量的命名和设置不是偶然的;)但通过以下代码:https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache /spark/SparkContext.scala#L2321从taskscheduler设置它,这里https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/scheduler/TaskSchedulerImpl。 scala#L517从后台获取它在这里https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/scheduler/local/LocalSchedulerBackend.scala#L144获取它从设置 – sgvd

+0

真棒!非常感谢 – bigdatamann