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

ПРИМЕНИМО К: Фабрика данных Azure Azure Synapse Analytics

Совет

Data Factory в Microsoft Fabric — это следующее поколение Фабрика данных Azure с более простой архитектурой, встроенным ИИ и новыми функциями. Если вы не знакомы с интеграцией данных, начните с Fabric Data Factory. Существующие рабочие нагрузки ADF могут обновляться до Fabric для доступа к новым возможностям в области обработки и анализа данных, аналитики в режиме реального времени и отчетов.

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

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

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

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

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

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

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

  1. Если вы еще не создали активность копирования для вашего конвейера, найдите Copy в области действий конвейера и перетащите активность копирования данных на рабочую область конвейера.

  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/"
      }
    }
  }
}
Свойство Описание Допустимые значения Обязательное поле
skipErrorFile Группа свойств для указания типов сбоев, которые необходимо пропустить во время перемещения данных. нет
файл отсутствует Одна из пар "ключ-значение" в контейнере свойств skipErrorFile предназначена для определения, следует ли пропускать файлы, которые удаляются другими приложениями в момент, когда служба выполняет операцию копирования.
– True: необходимо скопировать остальные файлы, пропуская файлы, удаляемые другими приложениями.
– False: необходимо прервать действие копирования в случае удаления каких-либо файлов из исходного хранилища в ходе перемещения данных.
Обратите внимание, что по умолчанию это свойство имеет значение True.
True(default)
Неправда
нет
файл запрещен Одна из пар "ключ-значение" в контейнере свойств skipErrorFile, определяющая необходимость пропуска определенных файлов, если списки ACL для этих файлов или папок требуют более высокого уровня разрешений, чем у настроенного подключения.
– True: необходимо скопировать остальные файлы, пропуская эти.
– False: необходимо прервать действие копирования при возникновении проблемы с разрешениями для папок или файлов.
Истина
False (по умолчанию)
нет
несогласованность данных Одна из пар "ключ-значение" в контейнере свойств skipErrorFile, которая определяет, следует ли пропускать несогласованные данные между исходным и целевым хранилищами.
– True: необходимо скопировать остальные данные, пропуская несогласованные.
— False: необходимо прервать действие копирования при обнаружении несогласованных данных.
Обратите внимание, что это свойство действительно, только если свойство validateDataConsistency имеет значение True.
Истина
False (по умолчанию)
нет
неверное имя файла Одна из пар «ключ-значение» из контейнера свойств skipErrorFile, используемая для определения необходимости пропускать конкретные файлы, в случае если имена файлов недопустимы для целевого хранилища.
- True: необходимо скопировать остальные файлы, пропуская файлы с недопустимыми именами.
- False: необходимо прервать действие копирования при обнаружении недопустимых имен файлов.
Имейте в виду, что это свойство работает только при копировании двоичных файлов из любого хранилища в ADLS 2-го поколения или при копировании двоичных файлов из AWS S3 в любое хранилище.
Истина
False (по умолчанию)
нет
logSettings Группа свойств, которые можно указать, если вы хотите зарегистрировать имена пропущенных объектов в журнале.   нет
ИмяСвязанногоСервиса Связанная служба Хранилище BLOB-объектов Azure или Azure Data Lake Storage 2-го поколения для хранения файлов журнала сеансов. Имена связанного сервиса типа AzureBlobStorage или AzureBlobFS, который относится к экземпляру, используемому для хранения файла журнала. нет
путь Путь к файлам журнала. Укажите путь, используемый для хранения файлов журнала. Если путь не указан, служба создаст контейнер самостоятельно. нет

Примечание.

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

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

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

  • Исходный набор данных и набор данных приемника должны иметь двоичный формат, а также не нужно указывать тип сжатия.
  • Поддерживаемые типы хранилища данных — это Azure хранилище BLOB-объектов, 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. Ниже приведена схема файла журнала.

Столбец Описание
Метка времени Метка времени, когда был пропущен файл.
Уровень Уровень логирования для этого элемента. Уровень "Предупреждение" будет использоваться для элемента, обозначающего пропуск файла.
Наименование операции Оперативное выполнение активности копирования для каждого файла. Для пропуска файла будет использоваться значение FileSkip.
Элемент операции Имена пропускаемых файлов.
Сообщение Дополнительные сведения для пояснения причины пропуска файла.

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

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 был пропущен, так как службе не удалось получить к нему доступ из-за проблемы с разрешениями.

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

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

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

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

    Пример: Копирование данных из 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-сервере. Повторяющиеся строки, которые существуют в источнике, невозможно скопировать в приемник. действие Copy копирует только первую строку исходных данных в приемник. Последующие строки в источнике, которые содержат повторяющиеся значения первичного ключа, определяются как несовместимые и пропускаются.

Примечание.

  • Чтобы загрузить данные в 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/"
        }
    } 
}, 
Свойство Описание Допустимые значения Обязательное поле
включитьПропускНесовместимыхСтрок Указывает, следует ли пропустить несовместимые строки во время копирования или нет. Истина
False (по умолчанию)
нет
logSettings Группа свойств, которые можно указать, если вы хотите записать несовместимые строки в журнал.   нет
ИмяСвязанногоСервиса Связанная служба Хранилище BLOB-объектов Azure или Azure Data Lake Storage 2-го поколения для хранения журнала, содержащего пропущенные строки. Имена связанного сервиса типа AzureBlobStorage или AzureBlobFS, который относится к экземпляру, используемому для хранения файла журнала. нет
путь Путь к файлам журнала, содержащего пропущенные строки. Укажите путь к журналу, в котором будут храниться несовместимые данные. Если путь не указан, служба создаст контейнер самостоятельно. нет

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

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

"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. Ниже приведена схема файла журнала.

Столбец Описание
Метка времени Метка времени, когда несовместимые строки были пропущены.
Уровень Уровень логирования для этого элемента. Элемент будет находиться на уровне "Warning", если он показывает пропущенные строки.
Наименование операции Операция копирования: рабочее поведение на каждой строке. Для указания, что несовместимая строка пропущена, будет использоваться TabularRowSkip.
Элемент операции Пропущенные строки из исходного хранилища данных.
Сообщение Дополнительные сведения о причине несовместимости конкретной строки.

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

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"
     }
}
Свойство Описание Допустимые значения Обязательное поле
включитьПропускНесовместимыхСтрок Указывает, следует ли пропустить несовместимые строки во время копирования или нет. Истина
False (по умолчанию)
нет
перенаправление несовместимых настроек строки Группа свойств, которые можно указать, если вы хотите записать несовместимые строки в журнал.   нет
ИмяСвязанногоСервиса Связанная служба служба хранилища Azure или Azure Data Lake Store для хранения журнала, содержащего пропущенные строки. Имя связанной службы типа AzureStorage или AzureDataLakeStore, которая относится к экземпляру, который вы хотите использовать для хранения файла журнала. нет
путь Путь к файлу журнала, который содержит пропущенные строки. Укажите путь к журналу, в котором будут храниться несовместимые данные. Если путь не указан, служба создаст контейнер самостоятельно. нет

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

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

"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)."

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