2016-10-17 4 views
2

私は、first()vs collect()操作のためにSparkによって作成されるジョブを理解しようとしています。first()操作のスパーク動作

myRDD = spark.sparkContext.parallelize(['A', 'B', 'C']) 

def func(d): 
    return d + '-foo' 

myRDD = myRDD.map(func) 

マイRDDが16個のパーティションに分割され::私が呼び出した場合

print(myRDD.toDebugString()) 
(16) PythonRDD[24] at RDD at PythonRDD.scala:48 [] 
| ParallelCollectionRDD[23] at parallelize at PythonRDD.scala:475 [] 

myRDD.collect() 

私が作成した16のタスクと1つの仕事を得る。コードが与えられ

私はこれがパーティションごとに1つのタスクだと仮定します。私が呼び出す場合

しかし、:

myRDD.first() 

は、私が作成した1、4、および11のタスクと、3つのジョブを取得します。なぜ3つのジョブが作成されたのですか?

私は、Mesosによってプロビジョニングされた単一の16コアエグゼキュータでspark-2.0.1を実行しています。

+0

スパークのバージョンとクラスタ設定についても触れてください。 – shanmuga

+0

@shanmugaが更新されました。 – MarkNS

+0

AFAIK collect()は実際にシャッフルを1つのパーティションにします。 first()が3つのパーティションにまたがって実行されている可能性があります。 *うずまき* – Kristian

答えて

1

実際にはかなりスマートなスパーク動作です。 map()は変形(遅延評価)で、first()collect()は両方ともアクション(端末操作)です。すべての変換は、アクションを呼び出した時点でデータに適用されます。

first()を呼び出すと、sparkは可能な限り少ない操作(変換)を実行しようとします。まず、1つのランダムなパーティションを試します。結果がなければ、4回以上のパーティションが必要となります。繰り返しますが、結果が見つからない場合、sparkは4回のパーティション分割(5 * 4)を行い、再度結果を得ようとします。

この場合、11個の手つかずのパーティション(16 - 1-4)しかありません。 RDDまたはそれより少ないパーティション数のデータが多い場合は、おそらくfirst()の結果が早く見つかる可能性があります。

関連する問題