发送有关在Azure Data Lake Gen 1中创建新文件的事件

时间:2019-05-17 14:14:59

标签: azure event-handling azure-functions webhooks azure-data-lake

将新文件添加到第1代Azure数据湖后,我想向外部NIFI流发送事件或通知。

任何人都可以使用该用例或对此用例有任何信息吗?

4 个答案:

答案 0 :(得分:5)

嘿,这是一个很好的问题,不幸的是,目前还没有可以挂起的现成事件,但是我找到了一种使用诊断日志的方法。

所以这个想法很简单

  1. 在ADLSv1上设置诊断日志,以将日志流式传输到事件中心
  2. 事件中心
  3. 上触发逻辑应用以获取新功能

enter image description here


因此要在ADLSv1上设置诊断日志

  1. 转到ADLSv1上的诊断设置

enter image description here

  1. 添加诊断设置

enter image description here

  1. 设置指向事件中心的链接

enter image description here


现在设置逻辑应用程序

  1. 开放逻辑应用设计器

enter image description here

  1. 添加事件中心触发器(假定存在名为stackdemohub的中心)

enter image description here

  1. 添加过滤器数组操作

enter image description here

3.1。设置从到表达式

triggerBody()?['ContentData']['records']

3.2。将右侧条件设置为“创建”,左侧条件字段设置为表达式

item()['operationName']
  1. 添加for-each循环并通过过滤器数组步骤传递主体

enter image description here

  1. 保存并运行

5.1。您将看到逻辑应用程序成功执行

enter image description here

您会在列表中找到新文件

enter image description here

如您所见,我上传的文件之一是演示文件夹中的MarketplaceCharge.json。

每个事件都是这样

{
    "time": "2019-09-18T07:48:20.342Z",
    "resourceId": "/SUBSCRIPTIONS/2BCB9F3D-3F6B-4345-A49E-86D3141C7F73/RESOURCEGROUPS/STACKDEMO/PROVIDERS/MICROSOFT.DATALAKESTORE/ACCOUNTS/STACKDEMO",
    "category": "Requests",
    "operationName": "create",
    "resultType": "201",
    "callerIpAddress": "::ffff:111.222.333.444",
    "correlationId": "93faafd5-dfa2-4432-91f8-c7f360d80655",
    "identity": "adam@marczak.io",
    "properties": {
      "HttpMethod": "PUT",
      "Path": "/webhdfs/v1/demo/MarketplaceCharges.json",
      "RequestContentLength": 0,
      "ClientRequestId": "288c654f-0948-4468-8e92-b158cc265c54",
      "StartTime": "2019-09-18T07:48:20.264Z",
      "EndTime": "2019-09-18T07:48:20.334Z",
      "UserId": "8162E212-E32B-443C-8F13-1CDA7B264DDB"
    }
}

您将通过文件路径 /webhdfs/v1/demo/MarketplaceCharges.json

获得价值

我在ADLSv1上创建了3个文件,并按预期在循环中获得了3个项目

enter image description here

现在,您可以使用此事件信息执行任何操作,并在需要时将其发送给您。


结束语时,由于逻辑应用程序的规模并不便宜,您可能希望将逻辑应用程序更改为功能应用程序

[FunctionName("EventHubTriggerCSharp")]
public static void Run([EventHubTrigger("stackdemo", Connection = "EventHubConnectionAppSetting")] EventData[] eventHubMessages, ILogger log)
{
    foreach (var message in eventHubMessages)
    {
        // parse items and do something
    }
}

对于较大的文件,还要另外一个重要说明,请确保在此过程中增加一些延迟,因为创建的请求类型是文件出现在存储中时,即使文件仍在复制中。在这种情况下,还会发生其他“附加”事件。

答案 1 :(得分:0)

尽管Azure数据湖存储(ADLS)第2代是基于Azure Blob存储构建的,但有两个known issues and differences已记录。

由于存在这些差异,我相信我们无法使用可用于Blob存储或事件网格的现有绑定。

例如,您仍然可以具有由计时器触发的功能,并使用ADLS v2 REST API来读取/更新文件。

答案 2 :(得分:0)

我通过使用Azure Data Lake Gen 2找到了解决此问题的方法,我们可以触发不同类型的事件,例如“ Azure函数”,并使该函数将通知发送到刚添加到NIFI流中的文件的路径,从诸如“ ListenHttp或HandleHttpRequest”处理器之类的侦听器处理器开始。之后,我们可以使用任何处理器从您的存储中提取该文件。

答案 3 :(得分:0)

这也可以使用以下方法解决:

  • 创建一个新的功能应用程序并关联一个Blob触发功能(与事件-Microsoft.Storage.BlobCreated相关联)
  • 事件处理程序(即函数app函数的主体)将触发您的代码将主题写入EventHub
  • 在NiFi中创建新流,并使用GetAzureEventHub接收来自目标名称空间的消息