当我执行以下命令时:
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
它说有 10 个分区,分区是使用HashPartitioner
。但是当我执行以下命令时:
scala> val rdd = sc.parallelize(List((1,2),(3,4),(3,6)),4)
...
scala> rdd.partitions.size
res6: Int = 4
scala> rdd.partitioner.isDefined
res8: Boolean = false
它说有4个分区,并且未定义分区器。那么,Spark 中的默认分区方案是什么? / 第二种情况下数据如何分区?
您必须区分两种不同的事物:
- 分区是根据键的值在分区之间分配数据,该值仅限于
PairwiseRDDs
(RDD[(T, U)]
)。这会在分区和可以在给定分区上找到的键集之间创建关系。
-
分区是将输入拆分为多个分区,其中数据简单地分为包含连续记录的块以实现分布式计算。确切的逻辑取决于特定的源,但它要么是记录数,要么是块的大小。
的情况下parallelize
数据使用索引均匀分布在分区之间。的情况下HadoopInputFormats
(like textFile
)这取决于像这样的属性mapreduce.input.fileinputformat.split.minsize
/ mapreduce.input.fileinputformat.split.maxsize
.
所以默认的分区方案就是无,因为分区并不适用于所有 RDD。对于需要分区的操作PairwiseRDD
(aggregateByKey
, reduceByKey
等)默认方法是使用哈希分区。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)