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 万行,分成大约 150 万行。Azure 存储中的 20 个 4.5MB 块 blob 文件。这是数据(CSV)的示例:

A81001,1,1,1,1,2,600,3.0,47236654,141.7096,0.70854986 A81001,1001,11,11,11,255,55,588,543.0,543.0,5904582,1382,1382,1382,138.8757,8757,8757,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,8799925555555555555555555555555559999999999转65.65895

接收器是 S2 类型的 Azure SQL Server,额定为 50 个 DTU。我创建了一个具有合理数据类型的简单表,没有键、索引或任何花哨的东西,只有列:

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。根据我的计算,这意味着 90MB 应该在大约半小时内传输(对吗?)。

在此处输入图像描述

由于某种原因,它非常快速地复制了 70,000 行,然后似乎挂起。使用 SQL 管理工作室,我可以看到数据库表中的行数正好是 70,000,并且在7 小时内根本没有增加。然而,复制任务仍在运行,没有错误:

在此处输入图像描述

任何想法为什么这挂在 70,000 行?我看不到第 70,001 个数据行有任何异常会导致问题。我已经尝试过彻底破坏数据工厂并重新开始,但我总是得到相同的行为。我有一个较小的表(8000 行)的另一个复制活动,它在 1 分钟内完成。

4

2 回答 2

12

只是为了回答我自己的问题,以防它帮助其他人:

问题在于空值。我的运行挂在 70,000 行的原因是在我的 blob 源文件的第 76560 行,其中一列中有一个空值。我用来生成此 blob 文件的 HIVE 脚本将空值写入为 '\N'。此外,我的接收器 SQL 表将“NOT NULL”指定为列的一部分,并且该列是 FLOAT 值。

所以我做了两个更改:在我的 blob 数据集定义中添加了以下属性:

"nullValue": "\\N"

并使我的 SQL 表列可以为空。它现在完全运行并且不会挂起!:)

问题是数据工厂没有出错,它只是卡住了 - 如果作业失败并显示有用的错误消息,并告诉我数据的哪一行是问题,那就太好了。我认为因为默认情况下写入批量大小为 10,000,这就是为什么它卡在 70,000 而不是 76560 的原因。

于 2016-03-23T10:37:45.677 回答
0

这是一个新的解决方法,只是设置write batch size为覆盖默认值(10,000)

单击此处查看我的复制数据活动配置

于 2021-04-15T08:07:25.707 回答