Позвольте мне предсказать, что я новичок в приложениях логики и фабрике данных. В любом случае, в настоящее время я работаю над интеграцией, и одна из ее частей заключается в том, что мне нужно запустить конвейер в фабрике данных из приложений логики. Я успешно сделал это, часть один, которую я не могу понять, - это то, как передавать параметры в мой конвейер. Я попытался изменить JSON в разделах "параметры" и "триггеры", но пока не получил ни на что щелкнуть. Конвейер завершает работу, но только с параметрами по умолчанию.
Кому-нибудь удалось это сделать? Любая помощь приветствуется.
Возможно, мне придется поиграть с этим, возможно, используя действие HTTP в Logic Apps? В основном пытаюсь понять, действительно ли я могу использовать параметры в коннекторе ADF, что, похоже, я не смогу?
Да, действие Http должно работать
Привет, Майк, мне удалось сделать это с помощью комбинации функции Azure и приложения логики. Итак, я написал функцию, которая запускает конвейер, и с помощью .net SDK вы можете передавать параметры.
Привет, @DraganB, вы можете добавить некоторые детали / снимки экрана в качестве ответа, поскольку это может быть более полезным, чем комментарий. Спасибо.
@wBob вы можете проверить мой ответ и посмотреть, подходит ли он вам :)
как я сказал в комментарии, я создаю обходной путь с помощью лазурных функций. Функции Azure и приложение логики хорошо работают вместе. По этой ссылке вы можете увидеть, как создавать конвейеры и управлять ими с помощью .net. https://docs.microsoft.com/en-us/azure/data-factory/quickstart-create-data-factory-dot-net
Если у вас уже есть ADF и конвейер, вы просто хотите запустить его (с конвейерами), тогда вы можете просто
Dictionary<string, object> parameters = new Dictionary<string, object>
{
{"BoxSerialNumbers", req.BoxSerialNumbers},
{"StartDate", req.StartDate },
{"EndDate",req.EndDate },
{"Recipient", req.Recipient }
};//this is how you add initialaze parameters
var client = Authenticate(); //Authentication with azure
log.Info("Creating.");
CreateRunResponse runResponse = client.Pipelines.CreateRun(resourceGroup, dataFactoryName, "pipeline1", parameters);//run pipeline, you can do this async (it's better)
log.Info("Created.");
var response = new HttpResponseMessage();
if (client.PipelineRuns.Get(resourceGroup, dataFactoryName, runResponse.RunId).Status.Equals("InProgress"))
{
response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(runResponse.RunId, Encoding.UTF8)
};
}
else
{
response = new HttpResponseMessage(HttpStatusCode.BadRequest)
{
Content = new StringContent("Pipeline didn't started", Encoding.UTF8)//just some validation for function
};
}
return response;
public static DataFactoryManagementClient Authenticate()
{
var context = new AuthenticationContext("https://login.windows.net/" + tenantID);
ClientCredential cc = new ClientCredential(applicationID, authenticationKey);
AuthenticationResult result = context.AcquireTokenAsync("https://management.azure.com/", cc).Result;
ServiceClientCredentials cred = new TokenCredentials(result.AccessToken);
return new DataFactoryManagementClient(cred) { SubscriptionId = subscriptionID };
}
Таким образом, в запросе вы можете передать свои параметры из приложения логики, с помощью runId вы можете проверить статус. Затем в приложении логики достаточно простого HTTP-запроса для вызова этой функции. Надеюсь, это кому-то поможет.
Интересный подход - проголосовал за. NB. Microsoft только что опубликовала (11 мая 2018 г.) на сайте Отзыв о Logic Apps, что действие по запуску конвейера фабрики данных изначально из приложений логики достигло состояния «Завершено». Следите за тем, как это скоро появится в продукте, я полагаю!
@wBob таким образом мне удается передать параметры из нашего веб-приложения в фабрику данных и скрипт u sql. Кроме того, странно, что нет соединителя для u sql (хорошо, вы можете управлять этим также с помощью .net, но ...). В приложении логики он все еще находится в режиме предварительного просмотра, я думаю, они это изменят.
Я использовал решение DraganB, но подпись вызова на
CreateRunResponse runResponse = client.Pipelines.CreateRun(resourceGroup, dataFactoryName, "pipeline1", parameters);
изменилось. Незначительные правки делают эту работу безупречной:
CreateRunResponse runResponse = client.Pipelines.CreateRun(resourceGroup, dataFactoryName, "pipeline1", parameters: parameters);
Вот функция для всех, кому она нужна.
[FunctionName("DatafactoryShim")]
public async static Task<HttpResponseMessage> Run(
[HttpTrigger(AuthorizationLevel.Function, "post")]
HttpRequestMessage req,
ExecutionContext context,
TraceWriter log
)
{
string messageBody = await req.Content.ReadAsStringAsync();
BlobToDatalakeFactoryParameters postValues = JsonHelper.ToClass<BlobToDatalakeFactoryParameters>(messageBody);
Dictionary<string, object> parameters = new Dictionary<string, object>
{
{"blobContainer", postValues.BlobContainer},
{"blobFolder", postValues.BlobFolder },
{"relativeDatalakeFolder", postValues.RelativeDatalakeFolder },
{"modelType", postValues.ModelType }
}; //this is how you add initialaze parameters
var client = Authenticate(); //Authentication with azure
string resourceGroup = ConfigurationManager.AppSettings["resourceGroup"];
string dataFactoryName = ConfigurationManager.AppSettings["dataFactoryName"];
string pipelineName = ConfigurationManager.AppSettings["pipelineName"];
Console.WriteLine("Creating pipeline run...");
CreateRunResponse runResponse = client.Pipelines.CreateRunWithHttpMessagesAsync(
resourceGroup,
dataFactoryName,
pipelineName,
parameters: parameters).Result.Body;
Console.WriteLine("Pipeline run ID: " + runResponse.RunId);
var response = new HttpResponseMessage();
if (client.PipelineRuns.Get(ConfigurationManager.AppSettings["resourceGroup"],
ConfigurationManager.AppSettings["dataFactoryName"], runResponse.RunId).Status.Equals("InProgress"))
{
response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(runResponse.RunId, Encoding.UTF8)
};
}
else
{
response = new HttpResponseMessage(HttpStatusCode.BadRequest)
{
Content =
new StringContent("Pipeline didn't started", Encoding.UTF8) //just some validation for function
};
}
return response;
}
Вы можете использовать свойство body действия приложения логики «Создать прогон конвейера» для передачи параметров конвейеру. Как всегда, будьте осторожны, потому что это действие не только находится в предварительной версии, но я также не смог найти это решение ни в одной документации MS. Я просто сделал обоснованное предположение, основываясь на том, как отформатированы другие похожие действия.
Пример:
"Run_my_pipeline": {
"inputs": {
"host": {
"connection": {
"name": "@parameters('$connections')['azuredatafactory']['connectionId']"
}
},
"method": "post",
"body": {
"param1": "myParamValue",
"param2": "myParamValue"
},
"path": "...",
"queries": {
"x-ms-api-version": "2017-09-01-preview"
},
"authentication": "@parameters('$authentication')"
}
}
Обратите внимание, что после этого ответа действие Create A Pipeline Run добавило нестандартный параметр с именем «parameters». Этот параметр параметров транслируется в тот же объект тела, о котором я упоминал выше. Итак, этот ответ по-прежнему действителен, хотя теперь вы можете добавить объект body из представления портала. К сведению, это действие все еще находится в режиме предварительного просмотра.
Используете ли вы REST API для запуска конвейера фабрики данных? docs.microsoft.com/en-us/azure/data-factory/…. Это может быть полезно в вашем случае. Соединитель приложения логики не поддерживает параметры?