Event Grid 数据连接

事件网格引入管道用于侦听 Azure 存储,并在订阅事件发生时更新 Azure 数据资源管理器,使其提取信息。 Azure 数据资源管理器提供通过 Azure 事件网格订阅从 Azure 存储(Blob 存储和 ADLSv2)持续引入 Blob 创建或重命名通知,并通过 Azure 事件中心将这些通知流式传输到 Azure 数据资源管理器。

Event Grid 引入管道经过几个步骤。 在 Azure 数据资源管理器 中创建目标表,将特定格式的数据引入到该表中。 然后在 Azure 数据资源管理器 中创建事件网格数据连接。 事件网格数据连接需要知道事件路由信息,例如要将数据发送到的表和表映射。 还可以指定引入设置,这些设置描述要引入的数据、目标表和映射。 可以生成示例数据并上传 blob 或重命名 blob 以测试连接。 在引入后删除 blob。

可以通过 Azure 门户、使用 数据引入向导、使用 C# 或 Python 以编程方式,或使用 Azure 资源管理器模板来管理“事件网格”引入。

有关 Azure 数据资源管理器 中数据引入的常规信息,请参阅 Azure 数据资源管理器 数据引入概述。

事件网格数据连接身份验证机制

  • 基于托管标识的数据连接(推荐):基于托管标识的数据连接是连接到数据源的最安全方式。 它可对从数据源提取数据的能力进行完全控制。

    使用托管标识设置事件网格数据连接需要以下步骤和权限:

    1. 请确保在源数据存储帐户的 Azure 订阅上分配 EventGrid 参与者 角色。
    2. 将一个托管标识添加到群集。
    3. 向该托管标识授予对数据源的权限。 要从 Azure 存储提取数据,托管标识必须至少具有对 Azure 存储帐户的存储 Blob 数据读取者权限。
    4. 在事件中心向托管标识授予权限。 要从事件中心提取 Blob 通知,托管标识必须具有对 Azure 事件中心的Azure 事件中心 Data Receiver权限。
    5. 在目标数据库上设置托管标识策略。
    6. 创建使用托管标识身份验证的数据连接来提取数据。

    说明

    • 事件中心使用者组对于每个使用者来说必须独一无二。 为每个 Azure 数据资源管理器数据连接创建专用使用者组。

    注意

    • 如果从数据源中删除托管标识权限,则数据连接将不再有效,并且无法从数据源中提取数据。
    • 如果在流式传输 blob 通知的现有事件中心命名空间上禁用本地身份验证,则必须对数据连接使用托管标识身份验证并正确配置资源。 有关详细信息,请参阅已知的事件网格问题。
  • 基于密钥的数据连接:如果未为数据连接指定托管标识身份验证,则连接会自动默认为基于密钥的身份验证。 基于密钥的连接使用资源连接字符串(如 Azure事件中心连接字符串)提取数据。 Azure 数据资源管理器 获取指定资源的连接字符串,并安全地保存它。 该连接字符串之后用于从数据源提取数据。

    注意

    如果密钥被轮换,则数据连接将不再有效,并且无法从数据源中提取数据。 若要解决此问题,请更新或重新创建数据连接。

数据格式

  • 请参阅支持的格式。
  • 请参阅支持的压缩格式。
    • 原始的未压缩数据大小应该是 blob 元数据的一部分,否则 Azure 数据资源管理器 会对其进行估算。 每个文件的摄取未压缩大小限制为 6 GB。

      说明

      可以为 Azure 存储帐户中的 BlobStorage、StorageV2 或 Data Lake Storage Gen2 设置 Event Grid 通知订阅。

数据引入属性

可以通过 blob 元数据指定 blob 引入过程的引入属性。 可以设置以下属性:

属性 说明
rawSizeBytes 原始(未压缩的)数据的大小。 对于 Avro/ORC/Parquet,此值是应用特定于格式的压缩之前的大小。 请通过将此属性设置为未压缩数据大小(以字节为单位)来提供原始数据大小。
kustoDatabase 目标数据库的名称,区分大小写。 默认情况下,数据将引入到与数据连接关联的目标数据库中。 使用此属性重写默认数据库,并将数据发送到其他数据库。 为此,必须先将连接设置为多数据库连接。
kustoTable 现有目标表的区分大小写名称。 覆盖在 Data Connection 窗格上设置的 Table。
kustoDataFormat 数据格式。 覆盖在“Data Connection”窗格上设置的“Data format”。
kustoIngestionMappingReference 要使用的现有引入映射关系的名称。 覆盖在“Data Connection”窗格上设置的“Column mapping”。
kustoIgnoreFirstRecord 如果设置为 true,则 Kusto 将忽略 Blob 的第一行。 在表格格式数据(CSV、TSV 或类似格式)中使用时,将忽略标题。
kustoExtentTags 字符串,表示将附加到生成的范围的标记。
kustoCreationTime 替代 blob 的 盘区创建时间,格式为 ISO 8601 字符串。 用于回填。

事件路由

在与群集建立数据连接时,请指定要将摄取的数据发送到何处的路由。 默认路由是发送到与目标数据库关联的连接字符串中指定的目标表。 数据的默认路由也称为静态路由。 可以使用事件数据属性为数据指定备用路由。

将事件数据路由到备用数据库

默认已禁用将数据路由到备用数据库。 若要将数据发送到其他数据库,必须先将连接设置为多数据库连接。 可以在 Azure 门户、C#、Python 或 ARM 模板中执行此操作。 用于允许数据库路由的用户、组、服务主体或托管标识在群集上必须至少具有 “参与者”角色和写入权限。 有关详细信息,请参阅为 Azure 数据资源管理器 创建事件网格数据连接。

若要指定备用数据库,请设置 Database引入属性。

警告

指定备用数据库而不将连接设置为多数据库数据连接会导致引入失败。

将事件数据路由到备用表

设置到 Azure 数据资源管理器 群集的 blob 存储连接时,请指定目标表属性:

  • 表名称
  • 数据格式
  • 映射

还可以使用 blob 元数据指定每个 blob 的目标表属性。 数据将按照引入属性指定的方式动态路由。

以下示例演示如何在上传之前在 Blob 元数据上设置引入属性。 多个 Blob 被路由到不同的表中。

此外,可以指定目标数据库。 Event Grid 数据连接是在特定数据库的上下文中创建的。 因此,该数据库是此数据连接的默认路由数据库。 若要将数据发送到其他数据库,请设置“KustoDatabase”引入属性设置,并将数据连接设置为多数据库数据连接。 默认已禁用将数据路由到另一数据库(不允许)。 设置与数据连接的数据库不同的数据库引入数据属性,且不允许将数据路由到多个数据库(将该连接设置为多数据库数据连接),将导致引入数据失败。

有关更多信息,请参阅上传 Blob。

var container = new BlobContainerClient("<storageAccountConnectionString>", "<containerName>");
await container.CreateIfNotExistsAsync();
var blob = container.GetBlobClient("<blobName>");
// Blob is dynamically routed to table `Events`, ingested using `EventsMapping` data mapping
await blob.SetMetadataAsync(
    new Dictionary<string, string>
    {
        { "rawSizeBytes", "4096" }, // the uncompressed size is 4096 bytes
        { "kustoTable", "Events" },
        { "kustoDataFormat", "json" },
        { "kustoIngestionMappingReference", "EventsMapping" },
        { "kustoDatabase", "AnotherDB" }
    }
);
await blob.UploadAsync(BinaryData.FromString(File.ReadAllText("<filePath>")));

上传多个 blob

可以从本地文件创建 blob,将摄取属性设置到 blob 元数据,然后上传它。 如需示例,请参阅使用事件网格数据连接。

说明

  • 强烈建议使用 BlockBlob 生成数据,因为使用 AppendBlob 可能会导致意外行为。
  • 使用 Azure Data Lake Gen2 存储 SDK 需要使用 CreateFile 上传文件,最后使用 Flush 并将 close 参数设置为 true。 有关 Data Lake Gen2 SDK 正确用法的详细示例,请参阅使用事件网格数据连接。
  • 启用了分层命名空间功能的存储帐户不支持在CopyBlob操作后触发数据摄取。
  • 如果事件中心终结点未确认收到事件,Azure 事件网格将激活重试机制。 如果此重试传递失败,事件网格可以通过死信处理机制将未送达的事件传递到存储帐户。 有关详细信息,请参阅事件网格消息传递和重试。
  • 不建议使用“OpenWrite”API 写入 Blob,因为它会触发空 Blob 的通知并导致空 blob 错误。 此外,仅刷新流一次,以防止重复通知和多次引入同一 blob。

重命名 blobs

使用 ADLSv2 时,可以通过重命名 blob 来触发 blob 引入到 Azure 数据资源管理器 的过程。 例如,请参阅重命名 blob。

说明

  • 可以在 ADLSv2 中重命名目录,但这不会触发 blob renamed 事件,也不会触发对目录内 blob 的引入处理。 若要通过重命名引入 blob 数据,请直接重命名所需的 blob。
  • 如果在创建数据连接时,或者在手动创建事件网格资源时将筛选器定义为跟踪特定主题,则这些筛选器将应用于目标文件路径。

使用存储生命周期删除 blob

引入后,Azure 数据探查器中内置的逻辑不会删除 Blob。 请使用 Azure Blob 存储生命周期来管理你的 blob 删除。 建议将 blob 保留三到五天。

已知 Event Grid 问题

在没有本地身份验证的情况下工作

如果在包含用于流式传输通知的事件中心的事件中心命名空间上禁用了本地身份验证,请使用以下步骤来确保使用托管标识正确地将数据从存储传输到事件中心:

  1. 将系统分配的托管标识分配给存储帐户的事件网格系统主题。 有关详细信息,请参阅为系统主题启用托管标识。
  2. 向其分配事件中心上的Azure 事件中心数据发送者角色,以授予托管标识发送权限。 有关详细信息,请参阅在目标上向 Azure 角色添加标识。
  3. 确保事件网格订阅使用托管标识传递事件。 有关详细信息,请参阅创建使用标识的事件订阅。

此外,将事件网格数据连接配置为使用托管标识身份验证,以便 Azure 数据资源管理器 可以从事件中心接收通知。

在从 Azure 数据资源管理器 导出的文件上设置事件网格引入数据

使用 Azure 数据资源管理器导出用于 Event Grid 引入过程的文件时,请注意:

  • 如果提供给导出命令的连接字符串或提供给外部表的连接字符串是 ADLS Gen2 格式的连接字符串(例如 abfss://filesystem@accountname.dfs.core.chinacloudapi.cn),但没有为分层命名空间启用存储帐户,则不会触发事件网格通知。
  • 如果没有为分层命名空间启用该帐户,则连接字符串必须使用 Blob 存储格式(例如 https://accountname.blob.core.chinacloudapi.cn)。 即使使用 ADLS Gen2 连接字符串,导出也可以按预期工作,但是不会触发通知,并且 Event Grid 引入也无法工作。

模拟来自自定义组件的 Storage 事件

使用自定义组件模拟 Azure 存储事件时,模拟事件必须严格遵守 Azure Blob 存储事件架构,因为 Azure 数据资源管理器将放弃事件网格 SDK 无法分析的事件。