事件网格数据连接

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

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

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

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

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

  • 基于托管标识的数据连接(推荐):基于托管标识的数据连接是连接到数据源的最安全方式。 它完全控制从数据源提取数据的能力。 使用托管标识设置事件网格数据连接需要执行以下步骤:

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

    注意

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

    注意

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

数据格式

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

      注意

      可以在 BlobStorageStorageV2Data Lake Storage Gen2 的 Azure 存储帐户上设置事件网格通知订阅。

引入属性

可以通过 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 数据资源管理器创建事件网关数据连接

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

警告

如果指定了备用数据库,而未将连接设置为多数据库数据连接,则会导致引入失败。

将事件数据路由到备用表

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

  • 表名称
  • 数据格式
  • mapping

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

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

此外,可以指定目标数据库。 事件网格数据连接是在特定数据库的上下文中创建的。 因此,此数据库是数据连接的默认数据库路由。 若要将数据发送到其他数据库,请设置“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 事件网格将激活重试机制。 如果此重试发送失败,事件网格可以使用“死信”过程将未送达的事件发送给存储帐户。 有关详细信息,请参阅事件网格消息传递和重试

重命名 blob

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

注意

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

使用存储生命周期删除 blob

Azure 数据资源管理器在引入后不会删除 blob。 请使用 Azure Blob 存储生命周期来管理你的 blob 删除。 建议将 blob 保留三到五天。

已知事件网格问题

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

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

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

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

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

使用 Azure 数据资源管理器导出用于事件网格引入的文件时,请注意:

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

从自定义组件模拟存储事件

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