Sparkドキュメンテーション操作でシャッフルを引き起こす操作と行わない操作を見つけるのに問題があります。このリストで、シャッフルを引き起こすものとそうでないものはどれですか?
マップとフィルターは行いません。しかし、私は他の人と確信が持てません。
map(func)
filter(func)
flatMap(func)
mapPartitions(func)
mapPartitionsWithIndex(func)
sample(withReplacement, fraction, seed)
union(otherDataset)
intersection(otherDataset)
distinct([numTasks]))
groupByKey([numTasks])
reduceByKey(func, [numTasks])
aggregateByKey(zeroValue)(seqOp, combOp, [numTasks])
sortByKey([ascending], [numTasks])
join(otherDataset, [numTasks])
cogroup(otherDataset, [numTasks])
cartesian(otherDataset)
pipe(command, [envVars])
coalesce(numPartitions)
ドキュメントがなくても、これを見つけるのは非常に簡単です。これらの関数のいずれについても、RDDを作成してデバッグ文字列を呼び出すだけです。残りは自分で実行できる1つの例です。
scala> val a = sc.parallelize(Array(1,2,3)).distinct
scala> a.toDebugString
MappedRDD[5] at distinct at <console>:12 (1 partitions)
MapPartitionsRDD[4] at distinct at <console>:12 (1 partitions)
**ShuffledRDD[3] at distinct at <console>:12 (1 partitions)**
MapPartitionsRDD[2] at distinct at <console>:12 (1 partitions)
MappedRDD[1] at distinct at <console>:12 (1 partitions)
ParallelCollectionRDD[0] at parallelize at <console>:12 (1 partitions)
ご覧のとおり、distinct
はシャッフルを作成します。特定の機能にシャッフルが必要な場合と必要でない場合があるため、ドキュメントではなくこの方法を見つけることも特に重要です。たとえば、結合には通常シャッフルが必要ですが、2つのRDDを結合すると、同じRDDから分岐するsparkがシャッフルを回避できる場合があります。
mightがシャッフルする操作のリストを次に示します。
join
:ハッシュパーティション
leftOuterJoin
:ハッシュパーティション
rightOuterJoin
:ハッシュパーティション
groupByKey
:ハッシュパーティション
reduceByKey
:ハッシュパーティション
combineByKey
:ハッシュパーティション
sortByKey
:範囲パーティション
intersection
:ハッシュパーティション
出典: Spark and Scala を使用したビッグデータ分析)、パーティションによる最適化、Coursera
これは役に立ちます: https://spark.Apache.org/docs/latest/programming-guide.html#shuffle-operations
またはこれ: http://www.slideshare.net/SparkSummit/dev-ops-training 、スライド208以降
スライド209から:「distinctのように 'numPartitions'を使用する変換は、おそらくシャッフルします」
これは、変換のシャッフルに関する一般化されたステートメントです。
シャッフルを引き起こす可能性のある変換には、
repartition
やcoalesce
などのrepartition操作が含まれます 'ByKeygroupByKey
やreduceByKey
などの操作(カウントを除く)、joincogroup
やjoin
などの操作。