2016-04-13 5 views
0

私はSpark SQLのコスト関数に取り組んでいます。 TABLE SCANの振る舞いをモデル化しているうちに、READとWRITEがパイプラインで実行されるか順番に実行されるかはわかりません。Spark SQL - シーケンスまたはパイプラインでREADとWRITEを実行しますか?

私たちは、次のSQLクエリについて考えてみましょう:WHERE columnA =「xyzの」TABLE1 FROM

SELECT *を;

各タスク:

  1. は、データブロック(ローカルまたはリモート・ノードからの)
  2. ディスクに残りのタプルを述語
  3. 書き込みを満たさないタプルフィルタリングを読み込み

(1)、(2)及び(3)の順序でまたはパイプラインで行われていますか?言い換えれば、データブロックは最初に完全に読み込まれ(それを構成するすべてのディスクページ)、次にフィルタ処理され、ディスクに書き直されるか、またはこれらのアクティビティがパイプラインで実行されますか? (すなわち、(n + 1)タプルを読み取っている間に、nタプルを処理して書き込むことができる)。

ありがとうございます。

答えて

0

もう少し掘り下げた後、私はSpark SQLがいわゆる "火山風のプルモデル"を使用していることを知りました。 このモデルによれば、単純なスキャンフィルタ書き込みクエリはパイプラインで実行され、完全に分散される。

つまり、パーティション(HDFSブロック)を読み込んでいる間は、読み込み済み行に対してフィルタリングを実行できます。フィルタリングを開始するためにブロック全体を読む必要はありません。それに応じて書き込みが行われる。

0

あなたが仕事を提出するたびに、最初のスパークんが、あなたの仕事のためにDAG(有向非巡回グラフ)を作成することです。

DAGを作成した後、sparkはどのタスクを並列で実行できるか、どのタスクが前のステップの出力に依存するかなどを知っています。

あなたのケースでは、 Sparkはデータを並行して読み込み(パーティションで見ることができます)、それらを(各パーティションで)フィルタリングします。 これで、必要なフィルタリングを保存したので、少なくとも1つのパーティションでフィルタリングが終了するのを待ってから、保存を開始します。

+0

あなたの答えによれば、1つのタスクを考えると、その計算時間はTimeRead + TimeProcessing + TimeWrite(パイプラインなし)で推定できます。 TimeReadは、パーティションの読み取りに費やされた時間、それをフィルタリングするためのTimeProcessing、および結果をローカルディスクに書き込むためのTimeWriteです。私は正しいですか? – loba76

関連する問題