2016-03-30 10 views
0

私は実際に様々な機能を組み合わせたSpark v.1.6.0のスカラアプリケーションを構築しました。特定のエントリのデータフレームをスキャンするためのコードがあり、データフレーム上で特定の計算を実行するコードがあり、出力を作成するコードがあります。パラレルパイプラインの作成方法は?

コンポーネントは「静的」に結合されています私のコードは、私は結果のデータを取り、入力としてデータを取るコンポーネントYのメソッドを呼び出して、計算を行うコンポーネントXからコードを呼び出します。

Iは、ユーザが単にパイプライン(並列実行と、おそらくいずれか)を指定有し、これはより柔軟取得したいと思い。私は、次の画像のように、ワークフローがかなり小さくてシンプルであることを前提となります

exemplary workflow

をしかし、私は最高のこの問題にアプローチする方法がわかりません。私は

  • ...あまりにもおそらく多少の誤差は、全体のパイプライン論理を自分で構築することができ、おそらくかなりの作業になりますどのと

    • 私は、Apacheのスパークは、MLパッケージにPipelineクラスが付属していることを見てきました、しかし、正しく理解していれば並列実行はサポートされていません(この例では2つのParquetReaderが同時にデータを読み込んで処理する可能性があります)。Luigi project明らかにこれを行う可能性があります。ルイージは長期的なワークフローのためのものですが、私はちょうど短期間のワークフローが必要ですが、ルイージは過度のものでしょうか?)あなたはスパークでの仕事/データフローを構築するためのことをお勧め何

  • 答えて

    1

    私はあなたがそれのような音がうまくケースに合う記述するものを、スパークのMLlibパイプライン機能を使用することをお勧めします。 Sparkがあなたのためにフローを最適化できるようにすることは、可能な場合よりもスマートな方法で可能です。

    あなたはそれが並列に2つの寄せ木ファイルを読み込むことはできません言及し、それは、分散方法で、それぞれ別のファイルを読むことができます。したがって、N/2ノードで各ファイルを個別に処理するのではなく、N個のノードで連続して処理するようにします。特に、y-cへのマッピングが1対1の場合に似たようなランタイムを期待します。基本的には、あなたのリソースが不十分であることを心配する必要はありません(データが適切に分割されている場合)。

    実際には、スパークがあなたよりもフローを最適化するためにスマートなので、実際にはもっとうまくいくかもしれません。あなたがそれらを定義するときに、スパークは正確に方法と手順を実行しないことがあります:y-cを計算するように指示すると、実際にはそれが実際には行われません。それは怠け者です(良い方法で!)、あなたが全体の流れを構築して答えを求めるまで待っています。その時点で流れを分析し、最適化を適用します(例えば、1つの可能性は、 Parquetファイルの1つまたは両方、特にpartition discoveryの大きなチャンクを読み込んで処理する必要があります)、最終的なプランのみを実行します。

    +0

    それは確かにあなたのコードを最適化するための良い方法です。しかし、ここでは無料のランチはありません!スパークのパイプラインが超並列最適化されているとは思えません。ロジスティック回帰を推定する単純なクロス検証パイプラインでは、4つ以上のEC2スレーブで3つのCPU使用率が50%以下です。いいえ、いいえ!しかし、すべてがRAMにキャッシュされています。私は実際にそれを最適化する方法を模索しています。 – Boris

    関連する問題