7

次のようなパイプライン コピー アクティビティを含むデータ ファクトリがあります。

{
  "type": "Copy",
  "name": "Copy from storage to SQL",
  "inputs": [
    {
      "name": "storageDatasetName"
    }
  ],
  "outputs": [
    {
      "name": "sqlOutputDatasetName"
    }
  ],
  "typeProperties": {
    "source": {
      "type": "BlobSource"
    },
    "sink": {
      "type": "SqlSink"
    }
  },
  "policy": {
    "concurrency": 1,
    "retry": 3
  },
  "scheduler": {
    "frequency": "Month",
    "interval": 1
  }
}

入力データのサイズは約 90MB、約 150 万行で、約 2 分割されています。Azure Storage 内の 20 x 4.5 MB ブロック BLOB ファイル。データ (CSV) の例を次に示します。

A81001,1,1,1,2,600,3.0,0.47236654,141.70996,0.70854986 A81001,4,11,0,25,58,243.0,5.904582,138.87575757575758,58,58,243.0,5.904582,138575757575757575757575757575757575757575757574 65.65895

シンクは、定格が 50 DTU の S2 型の Azure SQL Server です。適切なデータ型で、キー、インデックス、その他の凝ったものはなく、列だけの単純なテーブルを作成しました。

CREATE TABLE [dbo].[Prescriptions](
    [Practice] [char](6) NOT NULL,
    [BnfChapter] [tinyint] NOT NULL,
    [BnfSection] [tinyint] NOT NULL,
    [BnfParagraph] [tinyint] NOT NULL,
    [TotalItems] [int] NOT NULL,
    [TotalQty] [int] NOT NULL,
    [TotalActCost] [float] NOT NULL,
    [TotalItemsPerThousand] [float] NOT NULL,
    [TotalQtyPerThousand] [float] NOT NULL,
    [TotalActCostPerThousand] [float] NOT NULL
)

ソース、シンク、データ ファクトリはすべて同じリージョン (北ヨーロッパ) にあります。

Microsoft の「コピー アクティビティのパフォーマンスとチューニング ガイド」によると、Azure ストレージ ソースと Azure SQL S2 シンクの場合、約 0.4 MBps になるはずです。私の計算では、約 30 分で 90MB が転送されるはずです (そうですか?)。

ここに画像の説明を入力

何らかの理由で、70,000 行を非常に高速にコピーした後、ハングしているように見えます。SQL 管理スタジオを使用すると、データベース テーブルの行数が正確に 70,000 で、 7 時間でまったく増加していないことがわかります。それでも、コピー タスクはエラーなしで実行されています。

ここに画像の説明を入力

これが70,000行でぶら下がっている理由は何ですか? 70,001 番目のデータ行について、問題を引き起こすような異常は見られません。データ ファクトリを強制的に破棄してやり直そうとしましたが、常に同じ動作になります。小さいテーブル (8000 行) を使用した別のコピー アクティビティがあり、1 分で完了します。

4

2 に答える 2

12

それが他の誰かを助ける場合に備えて、私自身の質問に答えるために:

問題は null 値にありました。私の実行が 70,000 行で停止した理由は、ブロブ ソース ファイルの行 76560 で、列の 1 つに null 値があったためです。この BLOB ファイルを生成するために使用した HIVE スクリプトでは、null 値が「\N」として書き込まれていました。また、シンク SQL テーブルは列の一部として「NOT NULL」を指定し、列は FLOAT 値でした。

そのため、2 つの変更を加えました。次のプロパティをブロブ データセット定義に追加しました。

"nullValue": "\\N"

そして、SQL テーブルの列を null 可能にしました。今では完全に動作し、ハングしません! :)

問題は、Data Factory がエラーではなく、スタックしたことです。ジョブが失敗して有用なエラー メッセージが表示され、データのどの行に問題があるかを教えてくれたらいいのにと思います。書き込みバッチ サイズはデフォルトで 10,000 であるため、76560 ではなく 70,000 でスタックしたのはこのためだと思います。

于 2016-03-23T10:37:45.677 に答える