web-dev-qa-db-ja.com

sc.parallelizeとsc.textFileの違いは何ですか?

Sparkは初めてです。誰かが私の疑問をクリアしてください:

以下が私のコードだと仮定しましょう:

a = sc.textFile(filename) 
b = a.filter(lambda x: len(x)>0 and x.split("\t").count("111"))
c = b.collect()

以下が内部で起こることを願っています:(私の理解が間違っている場合は修正してください)

(1)変数aは、期待されるtxtファイルの内容を含むRDD変数として保存されます

(2)ドライバーノードは作業をタスクに分割し、各タスクには操作対象のデータの分割に関する情報が含まれています。これで、これらのタスクはワーカーノードに割り当てられました。

(3)収集アクション(この例ではcollect())が呼び出されると、結果は異なるノードからマスターに返され、ローカル変数cとして保存されます。

ここで、以下のコードがどのような違いをもたらすかを理解したいと思います。

a = sc.textFile(filename).collect() 
b = sc.parallelize(a).filter(lambda x: len(x)>0 and x.split("\t").count("111")) 
c = b.collect() 

誰かが明確にできますか?

10
user2531569

(1)変数aはRDD変数として保存されますcontaining期待されるtxtファイルの内容

(ハイライト鉱山)そうでもない。describes何が起こるかafter行を実行します。つまり、RDD変数はnot期待されるtxtファイルの内容が含まれています。

RDDは、アクションが呼び出されたときに、入力ファイルの各部分を読み取るタスクになるパーティションを記述します。

(2)ドライバーノードは作業をタスクに分割し、各タスクには操作対象のデータの分割に関する情報が含まれています。これで、これらのタスクはワーカーノードに割り当てられました。

はい。ただし、あなたのケースではc=b.collect()であるアクションが呼び出されたときのみです。

(3)収集アクション(この場合はcollect())が呼び出されると、結果は異なるノードからマスターに返され、ローカル変数cとして保存されます。

はい!クラスター内のすべてのSpark executorがsomewhereを実行しているため、ドライバーへのデータの送信が開始されるため、これはメモリ上最も危険な操作です。

ここで、以下のコードがどのような違いをもたらすかを理解したい

sc.textFile のドキュメントを引用:

textFile(path:String、minPartitions:Int = defaultMinPartitions):RDD [String]HDFS、ローカルファイルシステム(すべてのノードで使用可能)、またはHadoopでサポートされているファイルシステムURIであり、それを文字列のRDDとして返します。

sc.parallelize のドキュメントを引用:

parallelize [T](seq:Seq [T]、numSlices:Int = defaultParallelism)(implicit arg0:ClassTag [T]):RDD [T]ローカル配布= Scala RDDを形成するコレクション。

違いはデータセット-ファイル(textFileの場合)とローカルコレクション(parallelizeの場合)にあります。どちらも同じことを隠します。つまり、両方とも、変換とアクションを使用して処理されるデータにアクセスする方法の記述を作成します。

したがって、主な違いはデータのソースです。

15
Jacek Laskowski