Выполнение потоков данных в Azure Фабрике данных в 4 раза медленнее, чем в Azure поток данных SSIS - PullRequest
0 голосов
/ 27 мая 2020

Вот подробности этого теста производительности (очень простой). Я пытаюсь понять, почему выполнение потоков данных в облачной среде Azure Data Factory (Spark) намного медленнее, чем выполнение потоков данных, размещенных в Azure SSIS IR. Мои результаты показывают, что запуск в последней версии ADFv2 более чем в 4 раза медленнее, чем запуск того же потока данных в Azure SSIS (даже с теплым ИК-кластером, уже разогретым после предыдущего запуска). Мне нравятся все новые функции потоков данных v2, но вряд ли они стоят снижения производительности, если я чего-то полностью не упускаю. В конце концов я буду добавлять более сложные потоки данных, но хотел понять базовое поведение производительности.

Источник: 1 ГБ CSV, хранящийся в хранилище BLOB-объектов

Место назначения: Azure SQL База данных сервера (одна таблица и усекается перед каждым запуском)

При использовании потока управления в ADFv2 с использованием простого CopyActivity (без потока данных)

91 секунда

При использовании собственный пакет SSIS с потоком данных (Azure Feature Pack для извлечения из того же хранилища BLOB-объектов) с запущенным Azure SSIS с 8 ядрами.

76 секунд

Pure ADF Облачный конвейер с использованием DataFlow с теплым Azure IR (кешируется из предыдущего запуска) 8 (+ 8 ядер драйверов) с разделением по умолчанию (Spark) (включает 96-секундный запуск кластера, чего я еще не понимаю, поскольку TTL составляет 30 минут на ИК-порт, и он был запущен всего за 10 минут до этого)

360 секунд

Pipeline (LandWithCopy)

{"name": "LandWithCopy" , "properties": {"activity" : [{"name": "CopyData", "type": "Copy", "sizesOn": [], "policy": {"timeout": "7.00: 00: 00", "retry": 0, " retryIntervalInSeconds ": 30," secureOutput ": false," secureInput ": false}," userProperties ": []," typeProperties ": {" source ": {" type ":" DelimitedTextSource "," storeSettings ": {" type ":" AzureBlobStorageReadSettings "," рекурсивный ": true," wildcardFileName ":" data.csv "," enablePartitionDiscovery ": false}," formatSettings ": {" type ":" DelimitedTextReadSettings "}}," раковина ": {" type ":" AzureSqlSink "," preCopyScript ":" TRUNCATE TABLE PatientAR "," disableMetricsCollection ": false}," enableStaging ": false," translator ": {" type ":" TabularTranslator "," mappings ": [{" source ": {" name ":" RecordAction "," type ":" String "}," сток ": {" name ":" RecordAction "," type ":" String "}}, {" source ": { "name": "UniqueId", "type": "String"}, "ink ": {" name ":" UniqueId "," type ":" String "}}, {" source ": { "name": "Тип", "type": "Строка"}, "раковина": {"name": "Тип", "type": "Строка"}}, {"source": {"name": "TypeDescription", "type": "String"}, "раковина": {"name": "TypeDescription", "type": "String"}}, {"source": {"name": "PatientId", "тип": "Строка"}, "раковина": {"имя": "PatientId", "тип": "Строка"}}, {"источник": {"имя": "PatientVisitId", "тип": "String"}, "слив": {"name": "PatientVisitId", "type": "String"}}, {"source": {"name": "VisitDateOfService", "type": "String"} , "раковина": {"имя": "VisitDateOfService", "тип": "строка"}}, {"источник": {"имя": "VisitDateOfEntry", "тип": "Строка"}, "приемник" : {"name": "VisitDateOfEntry", "type": "String"}}, {"source": {"name": "DoctorId", "type": "String"}, "раковина": {"name ":" DoctorId "," type ":" String "}}, {" source ": {" name ":" DoctorName "," type ":" String "}," раковина ": {" name ":" DoctorName "," тип ":" Строка "}}, {" источник ": {" имя ":" FacilityId "," тип ":" Строка "}," приемник ": {" имя ":" FacilityId "," тип ":" Строка "} }, { "источник": { "name": "FacilityName", "type": "String"}, "раковина": {"name": "FacilityName", "type": "String"}}, {"source": {"name": "Название компании", "тип": "Строка"}, "приемник": {"имя": "Название компании", "тип": "Строка"}}, {"источник": {"имя": "Номер билета", "тип": "Строка"}, "приемник": {"имя": "Номер билета", "тип": "Строка"}}, {"источник": {"имя": "TransactionDateOfEntry", "тип": "String"}, "сток": {"name": "TransactionDateOfEntry", "type": "String"}}, {"source": {"name": "InternalCode", "type": "String"} , "сток": {"имя": "Внутренний код", "тип": "Строка"}}, {"источник": {"имя": "Внешний код", "тип": "Строка"}, "приемник" : {"name": "ExternalCode", "type": "String"}}, {"source": {"name": "Description", "type": "String"}, "раковина": {"name ":" Описание "," тип ":" Строка "}}, {" источник ": {" имя ":" Комиссия "," тип ":" Строка "}," приемник ": {" имя ":" Комиссия "," тип ":" Строка "}}, {" источник ": {" имя ":" Единицы "," тип ":" Строка "}," раковина ": {" имя ":" Единицы "," тип ":" String "}}, {" s ource ": { "name": "AREffect", "type": "String"}, "ink ": {" name ":" AREffect "," type ":" String "}}, {" source ": {" name ": "Действие", "тип": "Строка"}, "раковина": {"имя": "Действие", "тип": "Строка"}}, {"источник": {"имя": "Группа страхования", "тип": "Строка"}, "раковина": {"имя": "Группа страхования", "тип": "Строка"}}, {"источник": {"имя": "Плательщик", "тип": "String"}, "раковина": {"name": "Плательщик", "type": "String"}}, {"source": {"name": "PayerType", "type": "String"} , "раковина": {"имя": "PayerType", "тип": "Строка"}}, {"источник": {"имя": "PatBalance", "тип": "Строка"}, "раковина" : {"name": "PatBalance", "type": "String"}}, {"source": {"name": "InsBalance", "type": "String"}, "раковина": {"name ":" InsBalance "," type ":" String "}}, {" source ": {" name ":" Charges "," type ":" String "}," раковина ": {" name ":" Charges "," тип ":" Строка "}}, {" источник ": {" имя ":" Платежи "," тип ":" Строка "}," приемник ": {" имя ":" Платежи "," тип ":" String "}}, {" source ": {" name ":" Настройки ", "тип": "Строка"}, "слив": {"имя": "Корректировки", "тип": "Строка"}}, {"источник": {"имя": "TransferAmount", "тип": "String"}, "раковина": {"name": "TransferAmount", "type": "String"}}, {"source": {"name": "FiledAmount", "type": "String"} , "сток": {"имя": "FiledAmount", "тип": "Строка"}}, {"источник": {"имя": "Контрольный номер", "тип": "Строка"}, "приемник" : {"name": "CheckNumber", "type": "String"}}, {"source": {"name": "CheckDate", "type": "String"}, "раковина": {"имя ":" CheckDate "," type ":" String "}}, {" source ": {" name ":" Created "," type ":" String "}," раковина ": {" name ":" Created "," тип ":" Строка "}}, {" источник ": {" имя ":" ClientTag "," тип ":" Строка "}," приемник ": {" имя ":" ClientTag "," тип ":" String "}}]}}," inputs ": [{" referenceName ":" PAR_Source_DS "," type ":" DatasetReference "}]," output ": [{" referenceName ":" PAR_Sink_DS "," type ":" DatasetReference "}]}]," annotations ": []}}

Поток данных конвейера (LandWithFlow) {" name ":" WriteData "," pr operties ": {" type ":" MappingDataFlow "," typeProperties ": {" sources ": [{" dataset ": {" referenceName ":" PAR_Source_DS »," type ":" DatasetReference "}," name ":" GetData "}]," стоки ": [{" набор данных ": { "referenceName": "PAR_Sink_DS", "type": "DatasetReference"}, "name": "WriteData"}], "transformations": [], "script": "source (output (\ n \ t \ tRecordAction as строка, \ n \ t \ tUniqueId как строка, \ n \ t \ tType как строка, \ n \ t \ tTypeDescription как строка, \ n \ t \ tPatientId как строка, \ n \ t \ tPatientVisitId как строка, \ n \ t \ tVisitDateOfService как строка, \ n \ t \ tVisitDateOfEntry как строка, \ n \ t \ tDoctorId как строка, \ n \ t \ tDoctorName как строка, \ n \ t \ tFacilityId как строка, \ n \ t \ tFacilityName как строка , \ n \ t \ tCompanyName как строка, \ n \ t \ tTicketNumber как строка, \ n \ t \ tTransactionDateOfEntry как строка, \ n \ t \ tInternalCode как строка, \ n \ t \ tExternalCode как строка, \ n \ t \ tDescription как строка, \ n \ t \ tFee как строка, \ n \ t \ tUnits как строка, \ n \ t \ tAREffect как строка, \ n \ t \ tAction как строка, \ n \ t \ tInsuranceGroup как строка, \ n \ t \ tPayer как строка, \ n \ t \ tPayerType как строка, \ n \ t \ tPatBalance как строка, \ n \ t \ tInsBalance как строка, \ n \ t \ tЗаряжается как строка, \ n \ t \ tPayments как строка, \ n \ t \ tAdjustments как строка, \ n \ t \ tTransferAmount как строка, \ n \ t \ tFiledA смонтировать как строку, \ n \ t \ tCheckNumber как строку, \ n \ t \ tCheckDate как строку, \ n \ t \ tCreated as string, \ n \ t \ tClientTag как строку \ n \ t), \ n \ tallowSchemaDrift: true, \ n \ tvalidateSchema: false, \ n \ twildcardPaths: ['data.csv']) ~> GetData \ nGetData приемник (ввод (\ n \ t \ tRecordAction как строка, \ n \ t \ tUniqueId как строка, \ n \ t \ tВведите как строку, \ n \ t \ tTypeDescription как строку, \ n \ t \ tPatientId как строку, \ n \ t \ tPatientVisitId как строку, \ n \ t \ tVisitDateOfService как строку, \ n \ t \ tVisitDateOfEntry как строка, \ n \ t \ tDoctorId как строка, \ n \ t \ tDoctorName как строка, \ n \ t \ tFacilityId как строка, \ n \ t \ tFacilityName как строка, \ n \ t \ tCompanyName как строка, \ n \ t \ tTicketNumber как строка, \ n \ t \ tTransactionDateOfEntry как строка, \ n \ t \ tInternalCode как строка, \ n \ t \ tExternalCode как строка, \ n \ t \ tDescription как строка, \ n \ t \ tFee как строка, \ n \ t \ tUnits as string, \ n \ t \ tAREffect as string, \ n \ t \ tAction as string, \ n \ t \ tInsuranceGroup as string, \ n \ t \ tPayer as string, \ n \ t \ tPayerType как строка, \ n \ t \ tPatBalance как строка, \ n \ t \ tInsBalance как строка, \ n \ t \ tCharges как строка, \ n \ t \ tPayments как строка, \ n \ t \ tAdjustments as string, \ n \ t \ tTransferAmount как строка, \ n \ t \ tFiledAmount как строка, \ n \ t \ tCheckNumber как строка, \ n \ t \ tCheckDate как строка, \ n \ t \ tСоздано как строка, \ n \ t \ tClientTag как строка, \ n \ t \ tFileName как строка, \ n \ t \ tПрактикуется как строка \ n \ t), \ n \ tallowSchemaDrift: true, \ n \ tvalidateSchema: false, \ n \ tdeletable: false, \ n \ tinsertable: true, \ n \ tupdateable: false, \ n \ tupsertable: false, \ n \ tformat: 'table', \ n \ tpreSQLs: ['TRUNCATE TABLE PatientAR'], \ n \ tmapColumn (\ n \ t \ tRecordAction, \ n \ t \ tUniqueId, \ n \ t \ tType, \ n \ t \ tTypeDescription, \ n \ t \ tPatientId, \ n \ t \ tPatientVisitId, \ n \ t \ tVisitDateOfService, \ n \ t \ tVisitDateOfEntry, \ n \ t \ tDoctorId, \ n \ t \ tDoctorName, \ n \ t \ tFacilityId, \ n \ tFacilityId, \ n \ t , \ n \ t \ tCompanyName, \ n \ t \ tTicketNumber, \ n \ t \ tTransactionDateOfEntry, \ n \ t \ tInternalCode, \ n \ t \ tExternalCode, \ n \ t \ tDescription, \ n \ t \ tFee, \ n \ t \ tUnits, \ n \ t \ tAREffect, \ n \ t \ tAction, \ n \ t \ tInsuranceGroup, \ n \ t \ tPayer, \ n \ t \ tPayerType, \ n \ t \ tPatBalance, \ n \ t \ tInsBalance, \ n \ t \ tCharges, \ n \ t \ tPayments, \ n \ t \ tAdjustments, \ n \ t \ tTransferAmount, \ n \ t \ tFiledAmount, \ n \ t \ tCheckNumber, \ n \ t \ tCheckDate, \ n \ t \ tCreated, \ n \ t \ tClientTag \ n \ t), \ n \ tskipDuplicateMapInputs: true, \ n \ tskipDuplicateMapOutputs: true) ~> WriteData "}}}

1 Ответ

0 голосов
/ 27 мая 2020

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

Наш сценарий - это просто копирование из таблиц источника в пункт назначения 13 на основе пункта where. Теперь у нас есть две операции копирования, которые занимают 1,5 минуты. Итак, я подумал, что можно создать поток данных и сделать один источник и два приемника. Но это занимает от 5 до 8 минут в зависимости от времени запуска кластера. Надеюсь, мы получим ответ.

...