2017-02-21 8 views
2

コードは2000個の小さなファイル(〜10-50 Kb)〜1分を超過して非常に高速に実行されます。 Parallelizm = 5.NET呼び出しを追加するとu-sqlジョブが非常に遅くなります

@arenaData = 
    EXTRACT col1, col2, col3 
    FROM @in 
    USING Extractors.Tsv(quoting : true, skipFirstNRows : 1, nullEscape : "\\N", encoding:Encoding.UTF8); 

@res = 
    SELECT col1, col2, col3 
    FROM @arenaData; 
    OUTPUT @res 
    TO @out 
    USING Outputters.Csv(); 

しかし、私はこのようなコードを変更した場合、.NETコールがとても遅いのはなぜそれが〜1時間

@arenaData = 
    EXTRACT col1, col2, col3 
    FROM @in 
    USING Extractors.Tsv(quoting : true, skipFirstNRows : 1, nullEscape : "\\N", encoding:Encoding.UTF8); 

@res = 
    SELECT 
     col1.ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture) AS col1_converted, 
, col2, col3 

    FROM @arenaData; 
    OUTPUT @res 
    TO @out 
    USING Outputters.Csv(); 

を取りますか?私はソースのCSVファイルの日付形式を "yyyy-MM-dd HH:mm:ss"に変換する必要がありますか?どうすればそれを効果的に行うことができますか?

+0

これは正しく聞こえません。 CLRをロードしてネイティブコードからC#の実行にコールする必要がありますが、それは60倍悪化してはいけません。あなたは調査のためにエンジニアリングチームに依頼することができますので、私にジョブリンク(マイクロソフトドットコムのusql)を送ってください。 –

+0

私はstackoverflowに質問を投稿する前に、ADLAサポートチームのサポートチケットを開始しました。 Iやったサポートチームのためにこれらのテスト(以下JOBさんのURL):〜2分CLRなし (MAXDOP = 5): https://arkadium.azuredatalakeanalytics.net/jobs/68d7a42a-4f66-4308-a398- 3775eee74877?api-version = 2015-11-01-プレビュー 1つのCLRコールで同じ〜38分(MAXDOP = 5): https://arkadium.azuredatalakeanalytics.net/jobs/4291a7e6-ed0f-4516- b677-38a432a9997c?api-version = 2015-11-01-preview パラメータが変更されているにもかかわらず、問題が依然として存在するため、タイミングが変更されます。 sooo大きな違い – churupaha

+0

いくつかのテスト: CLR +並列性が同じジョブが5から20に増加しました。経過時間〜10分https:// arkadium。azuredatalakeanalytics.net/jobs/c09a8917-3425-48df-97ea-e4a84dad3c15?api-version=2015-11-01-preview CLR +並列処理が同じジョブが5から3に増加しました。経過時間〜59分+キャンセル私によって https://arkadium.azuredatalakeanalytics.net/jobs/9168ea66-e988-4497-b661-417f1128ceac?api-version=2015-11-01-preview – churupaha

答えて

2

あなたは今より良いパフォーマンスを得ていると聞いて嬉しいです!

あなたのジョブは、管理されたコードで実行されている式を使用して2800個以上の非常に小さなファイルで実行され、U-SQLのより一般的なC#式があるためC++に変換されません。

これは、次のような問題につながる:

  1. あなたはAUの一定数を使用してジョブを開始します。各AUは、YARNコンテナを開始してジョブの一部を実行します。これは、コンテナをきれいに初期化する必要があることを意味します(これは、Vertex Execution Viewで作成時に表示されます)。さて、これは少し時間がかかります。頂点がいくらかの大量の処理を行うならば、あまりオーバーヘッドではありません。残念ながら、あなたのケースでは、処理は小さなファイル上で非常に速いので、大きなオーバーヘッドがあります。

  2. 頂点がコード生成したコードをC++コードにのみ実行する場合は、再初期化時間なしでコンテナを再利用できます。残念ながら、潜在的な成果物が残っているため、管理対象ランタイムで実行される一般的なユーザーコードを再利用することはできません。したがって、その場合は、コンテナを再初期化する必要があります。コンテナには時間がかかります(2800回以上)。

今すぐあなたのフィードバックに基づいて、我々は(あなたはインラインC#の式を持つ空想何もしないならば、我々はまだ再初期化することができます)私たちの再初期化ロジックを改善しています。また、頂点ごとに1つのファイルではなく、単一の頂点の中にいくつかの小さなファイルを処理できるようになると、より良い結果が得られます。

回避策としては、ファイルのサイズを大きくし、カスタムコード(必ずしも当てはまるとは限りませんが)があまりに多くの頂点に収まらないようにすることです。

+0

詳しい説明はBig thanxを参照してください。また、私は今、AU〜Apache YARNコンテナのアンダーフードがあることを知っています。 – churupaha

関連する問題