2017-04-12 6 views
0

私は現在、線形回帰(Spark ML)のベンチマークを持つ小さなクラスタ(3つのノードが32のCPUと128 GBのRAM)でSpark 2.1.0を評価しています。私はパラメータ計算(開始、データロードなどを含まない)の時間を測定し、以下の動作を認識しました。小さなデータセット0.1 Mio - 3 Mioデータポイントの場合、測定時間は実際には増加しておらず、約40秒にとどまります。 300 Mioデータポイントのような大きなデータセットでのみ、処理時間は最大200秒になりました。だから、クラスタは小さなデータセットにまったくスケールされていないようです。スパーククラスタは小さなデータに拡張されません

ローカルPCの小さなデータセットと、10人の作業者と16GBのRAMしか使用していないクラスターを比較しました。クラスタの処理時間は3分の1になります。これはSPARKの通常の動作と考えられ、通信オーバヘッドで説明できますか何か間違っていますか(実際には代表的な線形回帰ですか)?

クラスタはスタンドアロンクラスタ(YarnまたはMesosなし)であり、ベンチマークは90人の従業員とともに提出され、それぞれ1コアと4 GBのラムがあります。

スパークは提出: ./spark-submit --masterスパーク://サーバー:7077 --classベンチマーク--deployモードクライアント--total - エグゼキュータ・コア90 --executor・メモリの4Gを - num executor 90 .../Benchmark.jar pathToData

+0

小さい0.1-0でパフォーマンスに不満があるかどうかはわかりません。3Mデータセット、またはそれより大きな300Mデータセット? – ImDarrenG

+0

こんにちは、私はパフォーマンスに不満はありません。私は、データが既にロードされているにもかかわらず、クラスターが計算に30分かかっているのが普通かどうか疑問に思っていました。 –

+0

私はあなたの観察が合理的であると言います。その間に他の人がいなければ、私は睡眠を取った後、より詳細な回答を提供します。 – ImDarrenG

答えて

0

最適なクラスタサイズと構成は、データとジョブの性質によって異なります。この場合、あなたの直感は正しいと思います。クラスター(コアとエグゼキュータ)のサイズを考えれば、過剰なオーバーヘッドがあるため、ジョブは小さなデータセットで完了するのに時間がかかりすぎるようです。

データ量を2桁増加させると、処理時間がわずか5倍に増加することに注意してください。クラスタ設定に最適なサイズにデータを増やしています。

スパークは大量のデータを処理するための優れたツールですが、データが収まる場合は1台のマシンで1つのプロセスを実行することで競合することはありません。ただし、データが1台のマシンに収まらないディスクベースの分散処理ツールよりもはるかに高速です。

私は数年前に話をしていましたが、Sparkは自転車レースのようなものであるとのアナロジーを示しました。重い荷物の場合、機関車は速度を上げるのに時間がかかるかもしれませんが、最終的には速くなります。 (私はスピーカーの名前を忘れてしまうのではないかと心配していますが、それはロンドンのカサンドラ会合であり、スピーカーはエネルギー部門の会社からのものでした)。

0

@ ImDarrenGの評価と、一般的に機関車/自転車の類推に同意します。このようなデータの少量

、私は強くあなたが300Mような何かをする必要がある場合は特に(各ノードにデータセットをブロードキャストし、データセット全体と

B)をキャッシュする)

Aをお勧めします

もう1つの考慮すべき点は、ファイルの数(まだキャッシュされていない場合)です.1つの分割できないファイルを読み込んでいる場合、1つのコアだけがそのファイルを読み込みます。しかし、一度データセットをキャッシュすると(合体または適切に再分割すると)、パフォーマンスは低下しませんongerはディスクにバインドされ、行をシリアライズします。

+0

ブロードキャストの意味がわかりませんが、データセットをキャッシュするとパフォーマンスが大幅に向上しました。 3Mデータセットは0.5秒で処理されます。私はまた、再パーティショニングと一緒にプレイし、さらに50ミリメートルの改善を得た。だから提案に感謝します。 –

+0

@AndreasBartschatブロードキャストとは、データセット全体がクラスタ内のすべてのエグゼキュータにブロードキャストされることを意味します。これにより、各エグゼキュータ上のパーティションを選択するのではなく、データセット全体が各エグゼキュータ上のメモリに格納されます。関数: '' 'ds.join(spark.sql.functions.broadcast(dataset)、" join_column ")' '' =>関連するSO:http://stackoverflow.com/questions/37487318/spark-sql-broadcast-ハッシュジョイン| http://stackoverflow.com/questions/40320441/difference-between-sc-broadcast-and-broadcast-function-in-spark-sql | http://stackoverflow.com/questions/32435263/dataframe-join-optimization-broadcast-hash-join – Garren

関連する問題