web-dev-qa-db-ja.com

シャッフルを引き起こすSpark変換とは何ですか?

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)
37
poiuytrez

ドキュメントがなくても、これを見つけるのは非常に簡単です。これらの関数のいずれについても、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がシャッフルを回避できる場合があります。

39
aaronman

mightがシャッフルする操作のリストを次に示します。

cogroup

groupWith

join :ハッシュパーティション

leftOuterJoin :ハッシュパーティション

rightOuterJoin :ハッシュパーティション

groupByKey :ハッシュパーティション

reduceByKey :ハッシュパーティション

combineByKey :ハッシュパーティション

sortByKey :範囲パーティション

distinct

intersection :ハッシュパーティション

repartition

coalesce

出典: Spark and Scala を使用したビッグデータ分析)、パーティションによる最適化、Coursera

14
ruhong

これは役に立ちます: https://spark.Apache.org/docs/latest/programming-guide.html#shuffle-operations

またはこれ: http://www.slideshare.net/SparkSummit/dev-ops-training 、スライド208以降

スライド209から:「distinctのように 'numPartitions'を使用する変換は、おそらくシャッフルします」

4
Glenn Strycker

これは、変換のシャッフルに関する一般化されたステートメントです。

シャッフルを引き起こす可能性のある変換には、repartitioncoalesceなどのrepartition操作が含まれます 'ByKeygroupByKeyreduceByKeyなどの操作(カウントを除く)、joincogroupjoinなどの操作。

ソース

2
mrsrinivas