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()
誰かが明確にできますか?
(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
の場合)にあります。どちらも同じことを隠します。つまり、両方とも、変換とアクションを使用して処理されるデータにアクセスする方法の記述を作成します。
したがって、主な違いはデータのソースです。