Spark中的默认分区方案

时间:2015-12-28 09:53:38

标签: apache-spark rdd partitioning

当我执行以下命令时:

 
state

它表示有10个分区,并使用scala> val rdd = sc.parallelize(List((1,2),(3,4),(3,6)),4).partitionBy(new HashPartitioner(10)).persist() rdd: org.apache.spark.rdd.RDD[(Int, Int)] = ShuffledRDD[10] at partitionBy at <console>:22 scala> rdd.partitions.size res9: Int = 10 scala> rdd.partitioner.isDefined res10: Boolean = true scala> rdd.partitioner.get res11: org.apache.spark.Partitioner = org.apache.spark.HashPartitioner@a 完成分区。但是当我执行下面的命令时:

 
HashPartitioner

它表示有4个分区,并且未定义分区程序。那么,什么是Spark中的默认分区方案? /如何在第二种情况下对数据进行分区?

1 个答案:

答案 0 :(得分:19)

你必须区分两个不同的东西:

  • 根据仅限于PairwiseRDDsRDD[(T, U)])的密钥值,在分区之间分配数据。这将在分区和可在给定分区上找到的密钥集之间创建关系。
  • 将分割输入分区为多个分区,其中数据被简单地划分为包含连续记录的块,以实现分布式计算。确切的逻辑取决于特定的来源,但它是记录的数量或块的大小。

    如果parallelize数据使用索引在分区之间均匀分布。如果是HadoopInputFormats(例如textFile),则取决于mapreduce.input.fileinputformat.split.minsize / mapreduce.input.fileinputformat.split.maxsize等属性。

因此默认分区方案完全没有,因为分区不适用于所有RDD。对于需要在PairwiseRDDaggregateByKeyreduceByKey等)上进行分区的操作,默认方法是使用散列分区。