2017-05-28 6 views
1

Sparkでマルチクラスタを使用すると、SQLクエリが遅くなることがあります。私はマスターのために2人の労働者を作り、地元のスパークスタンドアローンで働いています。はい、私はローカルマシン上のワーカーを作成するためにメモリとコアの数を半分にしました。私はsqlContextのパーティションを、partitionColumn,lowerBoundUpperBoundnumberPartitionsを使用して指定しました。これにより、作業(またはパーティション)を作業者に分散させることができます。私は(partitionColumnが一意である)以下のようにそれらを説明:Spark Multi Clustersを使用したSQLクエリの改善

df = sqlContext.read.format("jdbc").options(
    url = "jdbc:sqlserver://localhost;databasename=AdventureWorks2014;integratedSecurity=true;", 
    driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver", 
    dbtable = query, 
    partitionColumn = "RowId", 
    lowerBound = 1, 
    upperBound = 10000000, 
    numPartitions = 4).load() 

私はオプションを指定した後、マスター上で、私のスクリプトを実行したが、私は、クラスタなしで火花上で動作しているときに対して任意のパフォーマンスの向上を得ることができませんでした。私は実験の完全性のために記憶を半分にしてはならないはずであることを知っています。しかし、それが事実かどうか、あるいはそうでない場合は何らかの理由があるかどうかを知りたいと思います。どんな考えも歓迎です。どうもありがとう。

+0

通常、パフォーマンスの利点は、ローカルマシンで実験するときではなく、スケールで発生します。 – mtoto

答えて

1

ここではさまざまな要因がありますが、これらのそれぞれの重みはケースバイケースで異なる場合があります。

  • は、単一のマシン上の労働者の数を増やすことでmtotonicely pointed outとして、任意のパフォーマンスの向上をもたらすことはほとんどありません。

    1台のマシン上の複数のワーカーは、同じ固定プールにアクセスできます。ワーカーは処理自体に参加しないので、管理のためにこのプールのより高い部分を使用するだけです。

    実行者のJVMの数が多いほうが正当な場合がありますが、これは従業員数の増加と同じではありません(前者はアプリケーションリソース、後者はクラスタリソース)。

  • ベースラインとマルチワーカー構成に同じ数のコアを使用するかどうかは不明ですが、コアはSparkの使用を考慮する必要がある唯一のリソースではありません。典型的なSparkジョブは、IO(主にネットワークとディスク)にバインドされています。ディスクとネットワークの設定が十分であることを確認せずに、単一のノード上のスレッドの数を増やすと、データを待つだけになります。

    コアを増やすだけでは、CPUにバインドされているジョブ(通常は1台のマシン上でのスケーラビリティ)が向上します。

  • 外部リソースが要求に追いつけない場合は、Sparkリソースを使って手伝ってもお手伝いできません。レプリケートされていない単一のデータベースから多数の同時バッチ・リードを実行するだけで、サーバーが絞られます。

    この特定のケースでは、Sparkと同じノード上でデータベースサーバーを実行すると、さらに悪化します。これにはいくつかの利点があります(すべてのトラフィックがループバックを通過できます)が、データベースとSparkが異なるディスクセットを使用しない限り、ディスクIO(および他のリソースも含む)と競合します。

query何であるか明確ではないが、データベースに対して直接実行する場合には、遅い場合は、それも遅くスパークからそれをしますフェッチ。おそらく、クエリやデータベースの構造と構成を最初に詳しく見ておくべきでしょう。

+0

あなたの説明をありがとう。あなたの答えを理解する時間がかかりました。インデックスがないフィールドのwhere句を使用して、意図的にテーブルをスキャンするので、クエリが遅いです。私が知る限り、クエリの述語評価は、ストレージ(ディスクI/O)とメモリ(メモリ境界)から読み込んだ後、コアのローカルキャッシュ(CPUバインド)で実行されます。この場合、複数のクラスタを大規模に実行することにより、より多くのコアを持つパフォーマンスが確実に向上します。 –

+0

しかし、ディスクI/Oで多くのパフォーマンスを消費する場合は、スレーブとしてより多くのマシンを実行してディスク帯域幅を増やすだけでなく、SQLレプリケーションを作成するか、hdfsでデータをインポートする必要があります。 –

+0

このシナリオで[商用SQL Server JDBCドライバ](https://www.progress.com/jdbc/microsoft-sql-server)を試して、パフォーマンスの問題を特定することができます。私は進歩のために働き、商用ドライバはより良いスループットのためにメモリとCPUを少なくし、不一致の文字セットの場合にはテーブルスキャンをよりよく扱うことができます。 –

関連する問題