数据工厂自定义 Activity,通过网关连接到本地数据源

Data Factory Custom Activity, connect to onPremise data source via gateway

我将直接从我的问题开始:是否可以通过数据管理网关连接到 Azure 数据工厂自定义 Activity 中的本地数据集?

用例:

我有一个本地 FTP 服务器,上面有多个文件,应该定期将其复制到 Azure Blob 存储。必须上传哪些文件的决定应基于自定义触发器。因此,我正在构建数据工厂自定义 activity,而不是普通副本 activity。服务器只能通过数据管理网关访问

我创建了一个 FTPServer 类型的链接服务和一个 FileShare 数据集。这是我在自定义 Activity 管道中用作输入的。

在我的自定义 activity 中,我现在想要连接到输入数据集并获取 ftp 服务器中文件夹的内容。在这里我没有前进。我不知道如何连接到 ftp 服务器。这是我坚持的代码元素:

public IDictionary<string, string> Execute(IEnumerable<LinkedService> linkedServices,IEnumerable<Dataset> datasets,
                                           Activity activity,IActivityLogger logger)
{
    Dataset inputDataset = datasets.Single(dataset => dataset.Name == activity.Inputs.Single().Name);

    FileShareDataset inputTypeProperties = inputDataset.Properties.TypeProperties as FileShareDataset;

    FtpServerLinkedService inputLinkedService = linkedServices.First(linkedService =>
    linkedService.Name == 
    inputDataset.Properties.LinkedServiceName).Properties.TypeProperties
    as FtpServerLinkedService;


    ***//HERE CONNECTION TO FTPSERVER VIA GATEWAY***
}

Microsoft.Azure.Management.DataFactories.Models 中有多个网关 类,但我找不到使用它们的方法。对我来说,自定义 activity 似乎不支持数据管理网关?如果那是正确的,是否还有其他一些方法,比如在自定义 activity 中创建一个副本 activity 或类似的东西?还是唯一可能的解决方案是通过 WebRequest 直接连接到 FTP-Server?

直接从答案开始:没有:-)

您将遇到的问题是执行自定义 activity 代码的上下文。一旦您创建了 class 来完成一些工作,编译后的 DLL 将被放置在 blob 存储中(并压缩)。请记住,ADF 只是调用其他 Azure 服务的编排工具,它有自己的 none 计算。因此,它指示 Azure Batch 服务从 blob 存储中获取 DLL 并执行代码。这意味着应用程序实际上在 Batch Service 计算池中的虚拟机上运行。因此,执行基本上与 ADF 断开连接,并且不知道诸如数据管理网关 (DMG) 之类的事情。

就是说,我理解这里的困惑,因为自定义 activity 可以检查和使用来自 ADF 链接服务(您上面的代码)配置的值。但不是 DMG。您真正想要的是自定义 activity class 以编程方式在它(批处理服务 VM)和您的本地网络之间建立 VPN 连接,然后通过隧道执行一些代码。再次与 ADF 断开连接。这在 Azure 中当然是不允许的。为一个标准的虚拟机和虚拟专用网络设置一个VPN就够糟糕的了!

那么,怎么办?我的建议是使用带有 DMG 的普通 ADF 副本 activity 来首先将所有内容放入 blob 存储中。将其称为您的 IN 文件夹。一旦有了第二个 ADF 管道并使用自定义 activity 到 inspect/sort 数据。将其称为您的 CLEAN 文件夹。最后传递给下游服务。

或者,获取自定义 activity 直接点击 FTP 站点,而不用 DMG 稀释数据流。

希望对您有所帮助。