Поделиться через


Отказоустойчивость действия копирования в конвейерах Фабрики данных Azure и Synapse Analytics

ОБЛАСТЬ ПРИМЕНЕНИЯ: Фабрика данных Azure Azure Synapse Analytics

Совет

Попробуйте использовать фабрику данных в Microsoft Fabric, решение для аналитики с одним интерфейсом для предприятий. Microsoft Fabric охватывает все, от перемещения данных до обработки и анализа данных в режиме реального времени, бизнес-аналитики и отчетности. Узнайте, как бесплатно запустить новую пробную версию !

При копировании данных из исходного в целевое хранилище действие копирования обеспечивает определенный уровень отказоустойчивости для предотвращения сбоев в ходе перемещения данных. Допустим, вы копируете миллионы строк из исходного в целевое хранилище, при этом в целевой базе данных создан первичный ключ, а в исходной базе данных первичные ключи не определены. При копировании повторяющихся строк произойдет сбой из-за нарушения первичного ключа в целевой базе данных. На данном этапе действие копирования предлагает два способа решения таких проблем:

  • Можно прервать действие копирования при возникновении какой-либо ошибки.
  • Можно продолжить копирование оставшихся элементов, включив отказоустойчивость, чтобы пропускать несовместимые данные. Например, можно пропустить повторяющуюся строку в этом случае. Кроме того, можно зарегистрировать пропущенные данные в журнале сеанса, включив его в рамках действия копирования. Дополнительные сведения см. в журнале сеансов для действия копирования.

Копирование двоичных файлов

Служба поддерживает следующие сценарии отказоустойчивости при копировании двоичных файлов. Вы можете прервать действие копирования или продолжить копирование остальных элементов в следующих сценариях:

  1. Файлы, которые копируются службой, в это же время удаляются другими приложениями.
  2. Некоторые папки или файлы не позволяют службе получить доступ, так как списки ACL для этих файлов или папок требуют более высокого уровня разрешений, чем у настроенного подключения.
  3. Один или несколько файлов не проверяются на согласованность между исходным и целевым хранилищами, если включена проверка согласованности данных.

Включение отказоустойчивости с помощью пользовательского интерфейса

Чтобы настроить отказоустойчивость для действия копирования в конвейере с помощью пользовательского интерфейса, сделайте следующее:

  1. Если вы еще не создали действие копирования для конвейера, выполните поиск по запросу копирование на панели действий конвейера и перетащите действие копирования данных на холст конвейера.

  2. Выберите новое действие копирования данных на холсте, если оно еще не выбрано, и перейдите на вкладку Параметры, чтобы настроить отказоустойчивость.

    Отображает пользовательский интерфейс для действия копирования данных на вкладке

Настройка

При копировании двоичных файлов между хранилищами можно включить отказоустойчивость, как показано ниже.

{
  "name": "CopyActivityFaultTolerance",
  "type": "Copy",
  "typeProperties": {
    "source": {
      "type": "BinarySource",
      "storeSettings": {
        "type": "AzureDataLakeStoreReadSettings",
        "recursive": true
      }
    },
    "sink": {
      "type": "BinarySink",
      "storeSettings": {
        "type": "AzureDataLakeStoreWriteSettings"
      }
    },
    "skipErrorFile": {
      "fileMissing": true,
      "fileForbidden": true,
      "dataInconsistency": true,
      "invalidFileName": true
    },
    "validateDataConsistency": true,
    "logSettings": {
      "enableCopyActivityLog": true,
      "copyActivityLogSettings": {
        "logLevel": "Warning",
        "enableReliableLogging": false
      },
      "logLocationSettings": {
        "linkedServiceName": {
          "referenceName": "ADLSGen2",
          "type": "LinkedServiceReference"
        },
        "path": "sessionlog/"
      }
    }
  }
}
Свойство Description Допустимые значения Обязательное поле
skipErrorFile Группа свойств для указания типов сбоев, которые необходимо пропустить во время перемещения данных. No
fileMissing Одна из пар "ключ-значение" в контейнере свойств skipErrorFile, определяющая необходимость пропуска файлов, которые удаляются другими приложениями, когда служба выполняет операцию копирования.
– True: необходимо скопировать остальные файлы, пропуская файлы, удаляемые другими приложениями.
– False: необходимо прервать действие копирования в случае удаления каких-либо файлов из исходного хранилища в ходе перемещения данных.
Обратите внимание, что по умолчанию это свойство имеет значение True.
True(default)
False
No
fileForbidden Одна из пар "ключ-значение" в контейнере свойств skipErrorFile, определяющая необходимость пропуска определенных файлов, если списки ACL для этих файлов или папок требуют более высокого уровня разрешений, чем у настроенного подключения.
– True: необходимо скопировать остальные файлы, пропуская эти.
– False: необходимо прервать действие копирования при возникновении проблемы с разрешениями для папок или файлов.
Истинный
False (по умолчанию)
No
dataInconsistency Одна из пар "ключ-значение" в контейнере свойств skipErrorFile, определяющая необходимость пропуска несогласованных данных между исходным и целевым хранилищами.
– True: необходимо скопировать остальные данные, пропуская несогласованные.
— False: необходимо прервать действие копирования при обнаружении несогласованных данных.
Обратите внимание, что это свойство действительно, только если свойство validateDataConsistency имеет значение True.
Истинный
False (по умолчанию)
No
invalidFileName Одна из пар «ключ-значение» в контейнере свойств skipErrorFile для определения необходимости пропуска определенных файлов, если имена файлов недопустимы для целевого хранилища.
- True: необходимо скопировать остальные файлы, пропуская файлы с недопустимыми именами.
- False: необходимо прервать действие копирования при обнаружении недопустимых имен файлов.
Имейте в виду, что это свойство работает только при копировании двоичных файлов из любого хранилища в ADLS 2-го поколения или при копировании двоичных файлов из AWS S3 в любое хранилище.
Истинный
False (по умолчанию)
No
logSettings Группа свойств, которые можно указать, если вы хотите зарегистрировать имена пропущенных объектов в журнале.   No
linkedServiceName Связанная служба хранилища BLOB-объектов Azure или Azure Data Lake Storage 2-го поколения для хранения файлов журнала сеанса. Имя связанной службы AzureBlobStorage или AzureBlobFS, которая ссылается на экземпляр хранилища, используемый для хранения файла журнала. No
path Путь к файлам журнала. Укажите путь, используемый для хранения файлов журнала. Если путь не указан, служба создаст контейнер самостоятельно. No

Примечание.

Ниже приведены предварительные требования для включения отказоустойчивости в действии копирования при копировании двоичных файлов. Для пропуска определенных файлов при их удалении из исходного хранилища:

  • Исходный набор данных и набор данных приемника должны иметь двоичный формат, а также не нужно указывать тип сжатия.
  • Поддерживаемые типы хранилища данных: хранилище BLOB-объектов Azure, Azure Data Lake Storage 1-го поколения, Azure Data Lake Storage 2-го поколения, Файлов Azure, файловая система, FTP, SFTP, Amazon S3, Google Cloud Storage и HDFS.
  • Только при указании нескольких файлов в исходном наборе данных, который может быть папкой, подстановочным знаком или списком файлов, действие копирования может пропустить определенные некорректные файлы. Если один файл в исходном наборе данных выбран для копирования в целевое расположение, при возникновении любой ошибки действие копирования завершится ошибкой.

Для пропуска определенных файлов, доступ к которым закрыт из исходного хранилища:

  • Исходный набор данных и набор данных приемника должны иметь двоичный формат, а также не нужно указывать тип сжатия.
  • Поддерживаемые типы хранилища данных: хранилище BLOB-объектов Azure, Azure Data Lake Storage 1-го поколения, Azure Data Lake Storage 2-го поколения, Файлов Azure, SFTP, Amazon S3 и HDFS.
  • Только при указании нескольких файлов в исходном наборе данных, который может быть папкой, подстановочным знаком или списком файлов, действие копирования может пропустить определенные некорректные файлы. Если один файл в исходном наборе данных выбран для копирования в целевое расположение, при возникновении любой ошибки действие копирования завершится ошибкой.

Для пропуска определенных файлов, при проверке которых обнаружена несогласованность данных в исходном и целевом хранилище:

  • Дополнительные сведения см. в документе о согласованности данных здесь.

Наблюдение

Выходные данные действия копирования

С помощью выходных данных каждого выполнения действия копирования можно получить количество считанных, записанных и пропущенных файлов.

"output": {
            "dataRead": 695,
            "dataWritten": 186,
            "filesRead": 3,  
            "filesWritten": 1, 
            "filesSkipped": 2, 
            "throughput": 297,
            "logFilePath": "myfolder/a84bf8d4-233f-4216-8cb5-45962831cd1b/",
            "dataConsistencyVerification": 
           { 
                "VerificationResult": "Verified", 
                "InconsistentData": "Skipped" 
           } 
        }

Журнал сеанса действия копирования

Если вы настроили регистрацию имен пропущенных файлов в журнале, файл журнала можно найти по этому пути:https://[your-blob-account].blob.core.windows.net/[path-if-configured]/copyactivity-logs/[copy-activity-name]/[copy-activity-run-id]/[auto-generated-GUID].csv

Файлы журнала должны иметь формат CSV. Ниже приведена схема файла журнала.

Столбец Description
Метка времени Метка времени для пропуска файла.
Уровень Уровень ведения журнала для этого элемента. Для элемента, обозначающего пропуск файла, будет использоваться уровень Warning.
OperationName Рабочее поведение действия копирования для каждого файла. Для пропуска файла будет использоваться значение FileSkip.
OperationItem Имена пропускаемых файлов.
Сообщение Дополнительные сведения о причине пропуска файла.

Ниже приведен пример файла журнала.

Timestamp,Level,OperationName,OperationItem,Message 
2020-03-24 05:35:41.0209942,Warning,FileSkip,"bigfile.csv","File is skipped after read 322961408 bytes: ErrorCode=UserErrorSourceBlobNotExist,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=The required Blob is missing. ContainerName: https://transferserviceonebox.blob.core.windows.net/skipfaultyfile, path: bigfile.csv.,Source=Microsoft.DataTransfer.ClientLibrary,'." 
2020-03-24 05:38:41.2595989,Warning,FileSkip,"3_nopermission.txt","File is skipped after read 0 bytes: ErrorCode=AdlsGen2OperationFailed,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=ADLS Gen2 operation failed for: Operation returned an invalid status code 'Forbidden'. Account: 'adlsgen2perfsource'. FileSystem: 'skipfaultyfilesforbidden'. Path: '3_nopermission.txt'. ErrorCode: 'AuthorizationPermissionMismatch'. Message: 'This request is not authorized to perform this operation using this permission.'. RequestId: '35089f5d-101f-008c-489e-01cce4000000'..,Source=Microsoft.DataTransfer.ClientLibrary,''Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=Operation returned an invalid status code 'Forbidden',Source=,''Type=Microsoft.Azure.Storage.Data.Models.ErrorSchemaException,Message='Type=Microsoft.Azure.Storage.Data.Models.ErrorSchemaException,Message=Operation returned an invalid status code 'Forbidden',Source=Microsoft.DataTransfer.ClientLibrary,',Source=Microsoft.DataTransfer.ClientLibrary,'." 

Из журнала выше можно узнать, что файл bigfile.csv был пропущен из-за того, что другое приложение удалило его во время копирования службой. А файл 3_nopermission.txt был пропущен, так как службе не удалось получить к нему доступ из-за проблемы с разрешениями.

Копирование табличных данных

Поддерживаемые сценарии

Действие копирования поддерживает три сценария для обработки несовместимых табличных данных: обнаружение, пропуск и запись в журнал.

  • Несовместимость между типом данных источника и собственным типом приемника.

    Пример. Выполняется копирование данных из CSV-файла в хранилище BLOB-объектов в базу данных SQL с использованием определения схемы, которое содержит три столбца типа INT. Строки CSV-файла, которые содержат числовые данные, например 123,456,789, успешно копируются в хранилище приемника. А строки, которые содержат нечисловые значения, например 123,456, abc, определяются как несовместимые и пропускаются.

  • Несоответствие числа столбцов между источником и приемником.

    Пример. Выполняется копирование данных из CSV-файла в хранилище BLOB-объектов в базу данных SQL с использованием определения схемы, которое содержит шесть столбцов. Строки CSV-файла, которые содержат шесть столбцов, успешно копируются в хранилище приемника. Строки CSV-файла, которые содержат больше шести столбцов, определяются как несовместимые и пропускаются.

  • Нарушение первичного ключа при записи в SQL Server, Базу данных SQL Azure или Azure Cosmos DB.

    Пример. Выполняется копирование данных из SQL Server в базу данных SQL. Определен первичный ключ в базе данных SQL приемников, но такой первичный ключ не определен на исходном сервере SQL Server. Повторяющиеся строки, которые существуют в источнике, не удается скопировать в приемник. Действие копирования копирует только первую строку исходных данных в приемник. Последующие строки в источнике, которые содержат повторяющиеся значения первичного ключа, определяются как несовместимые и пропускаются.

Примечание.

  • Чтобы загрузить данные в Azure Synapse Analytics с помощью PolyBase, настройте встроенные параметры отказоустойчивости в PolyBase, указав политики отклонения с помощью параметра polyBaseSettings в действии копирования. По-прежнему можно включить перенаправление несовместимых строк PolyBase в BLOB-объект или ADLS в обычном режиме, как показано ниже.
  • Эта функция не применяется, когда действие копирования настроено на вызов Amazon Redshift Unload.
  • Эта функция не применяется, если действие копирования настроено для вызова хранимой процедуры из приемника SQL или использования Upsert для записи данных в приемник SQL.

Настройка

В следующем примере приводится определение JSON для настройки пропуска несовместимых строк в действии копирования.

"typeProperties": { 
    "source": { 
        "type": "AzureSqlSource" 
    }, 
    "sink": { 
        "type": "AzureSqlSink" 
    }, 
    "enableSkipIncompatibleRow": true, 
    "logSettings": {
        "enableCopyActivityLog": true,
        "copyActivityLogSettings": {            
            "logLevel": "Warning",
            "enableReliableLogging": false
        },
        "logLocationSettings": {
            "linkedServiceName": {
               "referenceName": "ADLSGen2",
               "type": "LinkedServiceReference"
            },
            "path": "sessionlog/"
        }
    } 
}, 
Свойство Description Допустимые значения Обязательное поле
enableSkipIncompatibleRow Указывает, следует ли пропустить несовместимые строки во время копирования или нет. Истина
False (по умолчанию)
No
logSettings Группа свойств, которые можно указать, если вы хотите записать несовместимые строки в журнал.   No
linkedServiceName Связанная служба хранилища BLOB-объектов Azure или Azure Data Lake Storage Gen2 для хранения журнала, содержащего пропущенные строки. Имя связанной службы AzureBlobStorage или AzureBlobFS, которая ссылается на экземпляр хранилища, используемый для хранения файла журнала. No
path Путь к файлам журнала, содержащего пропущенные строки. Укажите путь к журналу, в котором будут храниться несовместимые данные. Если путь не указан, служба создаст контейнер самостоятельно. No

Мониторинг пропущенных строк

Когда действие копирования будет завершено, вы увидите число пропущенных строк в выходных данных действия копирования:

"output": {
            "dataRead": 95,
            "dataWritten": 186,
            "rowsCopied": 9,
            "rowsSkipped": 2,
            "copyDuration": 16,
            "throughput": 0.01,
            "logFilePath": "myfolder/a84bf8d4-233f-4216-8cb5-45962831cd1b/",
            "errors": []
        },

Если вы настроили регистрацию несовместимых строк в журнале, файл журнала можно найти по этому пути: https://[your-blob-account].blob.core.windows.net/[path-if-configured]/copyactivity-logs/[copy-activity-name]/[copy-activity-run-id]/[auto-generated-GUID].csv.

Файлы журнала должны иметь формат CSV. Ниже приведена схема файла журнала.

Столбец Description
Метка времени Метка времени для пропуска несовместимых строк.
Уровень Уровень ведения журнала для этого элемента. Для элемента, обозначающего пропуск строк, будет использоваться уровень Warning.
OperationName Рабочее поведение действия копирования для каждой строки. Для пропуска несовместимой строки будет использоваться значение TabularRowSkip.
OperationItem Пропущенные данные из исходного хранилища данных.
Сообщение Дополнительные сведения о причине несовместимости конкретной строки.

Ниже приведен пример содержимого файла журнала:

Timestamp, Level, OperationName, OperationItem, Message
2020-02-26 06:22:32.2586581, Warning, TabularRowSkip, """data1"", ""data2"", ""data3""," "Column 'Prop_2' contains an invalid value 'data3'. Cannot convert 'data3' to type 'DateTime'." 
2020-02-26 06:22:33.2586351, Warning, TabularRowSkip, """data4"", ""data5"", ""data6"",", "Violation of PRIMARY KEY constraint 'PK_tblintstrdatetimewithpk'. Cannot insert duplicate key in object 'dbo.tblintstrdatetimewithpk'. The duplicate key value is (data4)." 

Из приведенного выше примера файла журнала можно увидеть, что одна строка, "data1, data2, data3", была пропущена из-за проблемы с преобразованием типов при копировании из исходного в целевое хранилище. Другая строка, "data4, data5, data6", была пропущена из-за проблемы с нарушением первичного ключа в целевом хранилище.

Копирование табличных данных (устаревший способ)

Ниже описан устаревший способ обеспечения отказоустойчивости, который применяется только при копировании табличных данных. При создании нового конвейера или действия вместо него рекомендуется начать с этого.

Настройка

В следующем примере приводится определение JSON для настройки пропуска несовместимых строк в действии копирования.

"typeProperties": {
    "source": {
        "type": "BlobSource"
    },
    "sink": {
        "type": "SqlSink",
    },
    "enableSkipIncompatibleRow": true,
    "redirectIncompatibleRowSettings": {
         "linkedServiceName": {
              "referenceName": "<Azure Storage or Data Lake Store linked service>",
              "type": "LinkedServiceReference"
            },
            "path": "redirectcontainer/erroroutput"
     }
}
Свойство Description Допустимые значения Обязательное поле
enableSkipIncompatibleRow Указывает, следует ли пропустить несовместимые строки во время копирования или нет. Истина
False (по умолчанию)
No
redirectIncompatibleRowSettings Группа свойств, которые можно указать, если вы хотите записать несовместимые строки в журнал.   No
linkedServiceName Связанная служба хранилища Azure или Azure Data Lake Store, в которой будет храниться журнал, содержащий пропущенные строки. Имя связанной службы AzureStorage или AzureDataLakeStore, которая ссылается на экземпляр хранилища, используемый для хранения файла журнала. No
path Путь к файлу журнала, который содержит пропущенные строки. Укажите путь к журналу, в котором будут храниться несовместимые данные. Если путь не указан, служба создаст контейнер самостоятельно. No

Мониторинг пропущенных строк

Когда действие копирования будет завершено, вы увидите число пропущенных строк в выходных данных действия копирования:

"output": {
            "dataRead": 95,
            "dataWritten": 186,
            "rowsCopied": 9,
            "rowsSkipped": 2,
            "copyDuration": 16,
            "throughput": 0.01,
            "redirectRowPath": "https://myblobstorage.blob.core.windows.net//myfolder/a84bf8d4-233f-4216-8cb5-45962831cd1b/",
            "errors": []
        },

При настройке записи несовместимых строк файл журнала можно найти по этому пути: https://[your-blob-account].blob.core.windows.net/[path-if-configured]/[copy-activity-run-id]/[auto-generated-GUID].csv.

Файлы журнала должны быть представлены только в формате CSV. Пропущенные исходные данные при необходимости регистрируются с использованием запятой в качестве разделителя столбцов. Добавим к исходным данным источника в файле журнала два дополнительных столбца — ErrorCode и ErrorMessage. В них содержатся сведения о первопричине несовместимости. ErrorCode и ErrorMessage указываются в двойных кавычках.

Ниже приведен пример содержимого файла журнала:

data1, data2, data3, "UserErrorInvalidDataValue", "Column 'Prop_2' contains an invalid value 'data3'. Cannot convert 'data3' to type 'DateTime'."
data4, data5, data6, "2627", "Violation of PRIMARY KEY constraint 'PK_tblintstrdatetimewithpk'. Cannot insert duplicate key in object 'dbo.tblintstrdatetimewithpk'. The duplicate key value is (data4)."

См. другие статьи о действии копирования: