2017-06-29 5 views
0

私はデータのクエリを作成し、その上にビジュアライゼーションを作成しています。現在、私のパイプライン全体が機能していますが、クエリの結果を返すのに10分以上かかることがあります。この遅い速度を引き起こすいくつかの最適化や重要なステップが欠けていると私は確信しています。スパークスローパフォーマンス

詳細: 私は3500 csvで500gbを持っています。私はこれらをAzure Blobストレージアカウントに保存し、Azure HDInsightsでスパーククラスタを実行します。私はスパーク2.1を使用しています。

csv_df = spark.read.csv('wasb://[email protected]/folder/*.csv', header=True, inferSchema=True) //Read CSV 
csv_df.write.parquet('wasb://[email protected]/folder/parquet_folder/csvdfdata.parquet’) //Write Parquet 
parquet_df = spark.read.csv('wasb://[email protected]/folder/parquet_folder/csvdfdata.parquet) //Read Parquet 
parquet_df.createOrReplaceTempView(‘temp_table’) //Create a temporary table 
spark.sql("create table permenant_table as select * from temp_table"); //Create a permanent table 

私は、データをプルするODBCドライバと、このコードを使用します。ここでは

私はデータを摂取するために使用するスクリプト(アズールJupyterノートブック上のPySpark3)があります。私はODBCが少し物事を遅らせることができると理解していますが、私は10分が予想以上のものだと信じています。 https://github.com/Azure-Samples/hdinsight-dotnet-odbc-spark-sql/blob/master/Program.cs データを取得するために私のコードは次のようになり、^

問題は、パイプラインの作品ということですが、それが他に使用されることはすることがあまりにも遅いです。私が作成した視覚化は、最高で数秒でデータを引き出す必要があります。

その他の詳細は:クエリの良い量がint format = 20170629(2017年6月29日) サンプルクエリで日付を持っているDateIDを使用 = select DateId, count(PageId) as total from permanent_table where (DateId >= 20170623) and (DateId <= 20170629) group by DateId order by DateId asc

任意の助けいただければ幸いです!前もって感謝します! ありがとうございました!

答えて

0

最初に、明確化の1つ:ODBC接続からどのようなクエリを実行していますか?テーブル作成クエリですか?彼らは長い時間がかかります。事前に作成されたハイブテーブルでODBCからの読み取りクエリのみを実行するようにしてください。

ここでは、ここでは数秒でクエリを実行するためにできることはほとんどありません。

  1. HDIのスリフトサーバは、動的リソース割り当てを使用します。したがって、最初のクエリはリソースが割り当てられている間に余分な時間がかかります。その後、より速くなるはずです。 Ambari - > Yarn UI - > Thriftアプリケーションの使用状況をチェックすることができます。これは、クラスタのすべてのコアを使用する必要があります。

  2. 3500ファイルが多すぎます。寄木張りテーブルを作成するときに、より小さな数のパーティションに併合(num_partitions)(または再分割)します。パーティションごとに約100MBがあるように、または十分なデータがない場合は、クラスタのコアごとに少なくとも1つのパーティションが存在するように調整します。

  3. あなたのデータ生成スクリプトでは、一時テーブルを作成するのではなく、1つのステップをスキップすることができます。ハイブテーブルを直接寄せ集め形式で作成します。 csv_df.write.parquetcsv_df.write.mode(SaveMode.Overwrite).saveAsTable("tablename")

  4. 日付のクエリでは、データを年、月、日の列で区切ることができます(最初に抽出する必要があります)。これを行うと#2について心配する必要はありません。あまりにも多くのファイルで終わるかもしれません。そうすれば、パーティションを年、月だけに減らす必要があります。

  5. クラスタのサイズ。 500GBのテキストファイルの場合、D14v2のノード数は少なくて済みます(2〜4枚かもしれません)。しかし、クエリの複雑さに依存します。

+0

こんにちはMaxiluk、ヒントのためのヒント。私はdateIdによって分割し、それは私にスピードを大幅に向上させます!私は今、約2分に500GBのために。理想的には、私は数秒間プッシュしたい。速度を上げるために必要なその他の最適化はどれですか? また、私の最終的なデータサイズは12TBに近く、現在は500GBをテスト用に使用しています。私はどのクラスター設定をお勧めしますか?私は現在、D12 v2のヘッドノード(2ノード8コア)とD4 v2の4ノード(4ノード、32コア)を使用しています。どのような設定を使用する必要がありますか? –

+0

こんにちは、応答の遅れてごめんね。あなたが行うことができる多くの最適化があります。私はスパークのパフォーマンス最適化シリーズのビデオで最も重要なものをここに書いています:https://channel9.msdn.com/Shows/Data-Exposed/Spark-Performance-Series-1-with-Maxim-Lukiyanov – maxiluk

+0

12TBのクラスターサイズについてD14_v2ワーカーノード10〜40を使用します。より多くの番号であなたはより速いスピードを得るでしょう。 – maxiluk