web-dev-qa-db-ja.com

Sparkのデフォルトのパーティション分割スキーム

以下のコマンドを実行すると:

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?/ 2番目のケースでデータがどのようにパーティション化されるか)のデフォルトのパーティション化スキームとは何ですか?

18

2つの異なるものを区別する必要があります。

  • PairwiseRDDsRDD[(T, U)])のみに制限されているキーの値に応じて、パーティション間でデータを分散するパーティション分割。これにより、パーティションと、特定のパーティションにあるキーのセットとの間に関係が作成されます。
  • 入力を複数のパーティションに分割することによるパーティション分割。データは、分散計算を可能にするために、連続するレコードを含むチャンクに単純に分割されます。正確なロジックは特定のソースによって異なりますが、レコード数またはチャンクのサイズのいずれかです。

    parallelizeの場合、データはインデックスを使用してパーティション間で均等に分散されます。 HadoopInputFormatstextFileなど)の場合は、mapreduce.input.fileinputformat.split.minsize/mapreduce.input.fileinputformat.split.maxsizeなどのプロパティに依存します。

したがって、パーティショニングはすべてのRDDに適用できるわけではないため、デフォルトのパーティショニングスキームは単純にnoneです。 PairwiseRDDaggregateByKeyreduceByKeyなど)でのパーティショニングが必要な操作の場合、デフォルトの方法はハッシュパーティショニングを使用することです。

19
zero323