了解 Azure 流分析的输出

本文将介绍适用于 Azure 流分析作业的不同类型的输出。 输出可帮助存储和保存流分析作业的结果。 使用输出数据,可进一步进行业务分析和数据的数据仓储。

设计流分析查询时,使用 INTO 子句引用输出的名称。 可针对每个作业使用单个输出,如果需要,也可通过在查询中提供多个 INTO 子句,针对每个流式处理作业使用多个输出。

要创建、编辑和测试流分析作业输出,可使用 Azure 门户Azure PowerShell.Net APIREST APIVisual Studio

部分输出类型支持分区,并且输出批大小可变化以优化吞吐量。

SQL 数据库

可以将 Azure SQL 数据库用作本质上为关系型数据的输出,也可以将其用于所依赖的内容在关系数据库中托管的应用程序。 流分析作业将写入到 Azure SQL 数据库的现有表中。 请注意表架构必须与字段及其正从作业输出的类型完全匹配。 Azure SQL 数据仓库也可以通过 SQL 数据库输出选项指定为输出。 下表列出了属性名称和用于创建 SQL 数据库输出的属性说明。

属性名称 说明
输出别名 该名称是在查询中使用的友好名称,用于将查询输出定向到此数据库。
数据库 数据库的名称(正在向该数据库发送输出)。
服务器名称 SQL 数据库服务器名称。
用户名 具有写入数据库权限的用户名。
密码 用于连接到数据库的密码。
将写入输出的表名称。 表名称区分大小写,并且该表架构应与字段数量以及作业输出正在生成的字段类型完全匹配。

Note

目前,流分析中的作业输出支持 Azure SQL 数据库产品/服务。 但是,不支持附加了数据库,运行 SQL Server 的 Azure 虚拟机。 这在将来的版本中可能会有所改变。

Blob 存储

Blob 存储提供了一种经济高效且可缩放的解决方案,用于在云中存储大量非结构化数据。 有关 Azure Blob 存储及其用法的简介,请参阅如何使用 Blob 处的文档。

下表列出了用于创建 blob 输出的属性名称及其说明。

属性名称 说明
输出别名 该名称是在查询中使用的友好名称,用于将查询输出定向到此 blob 存储。
存储帐户 存储帐户的名称(正在向该存储帐户发送输出)。
存储帐户密钥 与存储帐户关联的密钥。
存储容器 容器对存储在 Azure Blob 服务中的 blob 进行逻辑分组。 将 blob 上传到 Blob 服务时,必须为该 blob 指定一个容器。
路径模式 可选。 用于编写指定容器中的 blob 的文件路径模式。
在路径模式中,可以选择使用数据时间变量的一个或多个实例指定 blob 写入的频率:
{date}、{time}

如果注册预览版,则可以从事件数据中指定一个自定义 {field} 名称来作为 blob 的分区依据,其中字段名称为字母数字,可以包含空格、连字符和下划线。 对自定义字段的限制包括以下内容:
  • 不区分大小写(不区分列“ID”和列“id”)
  • 不允许嵌套字段(在作业查询中改用别名来“平展”字段)
  • 不能使用表达式作为字段名称
示例:
  • 示例 1:cluster1/logs/{date}/{time}
  • 示例 2:cluster1/logs/{date}
  • 示例 3(预览版):cluster1/{client_id}/{date}/{time}
  • 示例 4(预览版):cluster1/{myField},其中查询为:SELECT data.myField AS myField FROM Input;

文件命名将遵循以下约定:
{路径前缀模式}/schemaHashcode_Guid_Number.extension
示例输出文件:
  • Myoutput/20170901/00/45434_gguid_1.csv
  • Myoutput/20170901/01/45434_gguid_1.csv

日期格式 可选。 如果在前缀路径中使用日期令牌,可以选择组织文件所采用的日期格式。 示例:YYYY/MM/DD
时间格式 可选。 如果在前缀路径中使用时间令牌,可指定组织文件所采用的时间格式。 目前唯一支持的值是 HH。
事件序列化格式 输出数据的序列化格式。 支持 JSON、CSV 和 Avro。
编码 如果是 CSV 或 JSON 格式,则必须指定一种编码格式。 目前只支持 UTF-8 这种编码格式。
分隔符 仅适用于 CSV 序列化。 流分析支持大量的常见分隔符以对 CSV 数据进行序列化。 支持的值为逗号、分号、空格、制表符和竖线。
格式 仅适用于 JSON 序列化。 分隔行指定了通过新行分隔各个 JSON 对象,从而格式化输出。 数组指定输出会被格式化为 JSON 对象的数组。 仅当作业停止或流分析移动到下个时间段时,才关闭此数组。 一般而言,最好使用分隔行 JSON,因为在继续写入输出文件时,无需任何特殊处理。

当使用 blob 存储作为输出时,在以下情况下 blob 中创建一个新文件:

  • 如果文件超出了允许的最大块数(目前为 50,000) 可达到允许的最大块数,但不能达到允许的最大 blob 大小。 例如,如果输出率很高,你可以看到每个块,更多字节和文件大小大于。 当输出率不足时,每个块都有较少的数据,且文件大小较小。
  • 如果在输出中,架构更改,并且输出格式需要固定的架构(CSV 和 Avro)。
  • 如果作业重新启动,可选择在外部由用户停止或启动,或在内部进行系统维护或错误恢复。
  • 如果完全分区查询,为每个输出分区创建新文件。
  • 如果用户删除文件或存储帐户的容器。
  • 如果了输出,则使用路径前缀模式分区的时间,当查询移动到下一个小时,则使用新 blob。
  • 如果按自定义字段对输出进行分区,则每个分区键都会创建新的 blob(如果不存在)。
  • 如果按照自定义字段对输出进行分区(其中分区键基数超过 8000),则可能每个分区键创建一个新的 blob。

事件中心

Azure 事件中心服务是具有高扩展性的发布-订阅事件引入器。 事件中心每秒可收集数百万个事件。 当流分析作业的输出将要成为另一个流式处理作业的输入时,可以将事件中心用作输出。

将事件中心数据流配置成输出时,需要使用几个参数。

属性名称 说明
输出别名 该名称是在查询中使用的友好名称,用于将查询输出定向到此事件中心。
事件中心命名空间 事件中心命名空间是包含一组消息传递实体的容器。 创建新的事件中心后,还创建了时间中心命名空间。
事件中心名称 事件中心输出的名称。
事件中心策略名称 可以在事件中心的“配置”选项卡上创建的共享访问策略。每个共享访问策略具有名称、所设权限以及访问密钥。
事件中心策略密钥 用于对事件中心命名空间的访问权限进行身份验证的共享访问密钥。
分区键列 [可选] 此列包含事件中心输出的分区键。
事件序列化格式 输出数据的序列化格式。 支持 JSON、CSV 和 Avro。
编码 对于 CSV 和 JSON,目前只支持 UTF-8 这种编码格式。
分隔符 仅适用于 CSV 序列化。 流分析支持大量的常见分隔符以对 CSV 格式的数据进行序列化。 支持的值为逗号、分号、空格、制表符和竖线。
格式 仅适用于 JSON 序列化。 分隔行指定了通过新行分隔各个 JSON 对象,从而格式化输出。 数组指定输出会被格式化为 JSON 对象的数组。 仅当作业停止或流分析移动到下个时间段时,才关闭此数组。 一般而言,最好使用分隔行 JSON,因为在继续写入输出文件时,无需任何特殊处理。

表存储

Azure 表存储提供了具有高可用性且可大规模缩放的存储,因此应用程序可以自动缩放以满足用户需求。 表存储是世纪互联推出的 NoSQL 键/属性存储,适用于对架构的约束较少的结构化数据。 Azure 表存储可用于持久地存储数据,方便进行高效的检索。

下表列出了属性名称和用于创建表输出的属性说明。

属性名称 说明
输出别名 该名称是在查询中使用的友好名称,用于将查询输出定向到此表存储。
存储帐户 存储帐户的名称(正在向该存储帐户发送输出)。
存储帐户密钥 与存储帐户关联的访问密钥。
表名称 表的名称。 如果表不存在,则创建新表。
分区键 包含分区键的输出列的名称。 分区键是某个给定表中分区的唯一标识符,分区键构成了实体主键的第一部分。 分区键是一个最大为 1 KB 的字符串值。
行键 包含行键的输出列的名称。 行键是某个给定分区中实体的唯一标识符。 行键构成了实体主键的第二部分。 行键是一个最大为 1 KB 的字符串值。
批大小 批处理操作的记录数。 默认值 (100) 对大部分作业来说都已足够。 有关修改设置的详细信息,请参阅表批处理操作规范

服务总线队列

服务总线队列为一个或多个竞争使用方提供先入先出 (FIFO) 消息传递方式。 通常情况下,接收方会按照消息添加到队列中的临时顺序来接收并处理消息,并且每条消息仅由一个消息使用方接收并处理。

下表列出了用于创建队列输出的属性名称及其说明。

属性名称 说明
输出别名 该名称是在查询中使用的友好名称,用于将查询输出定向到此服务总线队列。
服务总线命名空间 服务总线命名空间是包含一组消息传递实体的容器。
队列名称 服务总线队列的名称。
队列策略名称 在创建队列时,还可以在“队列配置”选项卡上创建共享的访问策略。每个共享访问策略具有名称、所设权限以及访问密钥。
队列策略密钥 用于验证对服务总线命名空间的访问权限的共享访问密钥
事件序列化格式 输出数据的序列化格式。 支持 JSON、CSV 和 Avro。
编码 对于 CSV 和 JSON,目前只支持 UTF-8 这种编码格式
分隔符 仅适用于 CSV 序列化。 流分析支持大量的常见分隔符以对 CSV 格式的数据进行序列化。 支持的值为逗号、分号、空格、制表符和竖线。
格式 仅适用于 JSON 类型。 分隔行指定了通过新行分隔各个 JSON 对象,从而格式化输出。 数组指定输出会被格式化为 JSON 对象的数组。

分区数基于服务总线 SKU 和大小。 分区键是每个分区的唯一整数值。

服务总线主题

服务总线队列提供的是从发送方到接收方的一对一通信方法,而服务总线主题提供的则是一对多形式的通信。

下表列出了用于创建表输出的属性名称及其说明。

属性名称 说明
输出别名 该名称是在查询中使用的友好名称,用于将查询输出定向到此服务总线主题。
服务总线命名空间 服务总线命名空间是包含一组消息传递实体的容器。 创建新的事件中心后,还创建了服务总线命名空间
主题名称 主题是消息传递实体,类似于事件中心和队列。 设计用于从多个不同的设备和服务收集事件流。 在创建主题时,还会为其提供特定的名称。 发送到主题的消息在创建订阅后才会提供给用户,因此请确保主题下存在一个或多个订阅
主题策略名称 创建主题时,还可以在“主题配置”选项卡上创建共享的访问策略。每个共享访问策略具有名称、所设权限以及访问密钥。
主题策略密钥 用于验证对服务总线命名空间的访问权限的共享访问密钥
事件序列化格式 输出数据的序列化格式。 支持 JSON、CSV 和 Avro。
编码 如果是 CSV 或 JSON 格式,则必须指定一种编码格式。 目前只支持 UTF-8 编码格式
分隔符 仅适用于 CSV 序列化。 流分析支持大量的常见分隔符以对 CSV 格式的数据进行序列化。 支持的值为逗号、分号、空格、制表符和竖线。

分区数基于服务总线 SKU 和大小。 分区键是每个分区的唯一整数值。

Azure Cosmos DB

Azure Cosmos DB 是一种多区域分布的多模型数据库服务,它提供中国范围内不设限的弹性缩放、丰富查询和自动索引(经由与架构无关的数据模型)、可靠的低延迟及行业领先的综合 SLA。

Note

目前,Azure 流分析仅支持使用 SQL API 连接到 CosmosDB。 尚不支持使用其他 Azure Cosmos DB API。 如果使用其他 API 将 Azure 流分析指向 创建的 Azure Cosmos DB 帐户,则可能无法正确存储数据。

下表描述了用于创建 Azure Cosmos DB 输出的属性。

属性名称 说明
输出别名 用于在流分析查询中引用此输出的别名。
接收器 Cosmos DB
导入选项 选择“从订阅中选择 Cosmos DB”或“手动提供 Cosmos DB 设置”。
帐户 ID Cosmos DB 帐户的名称或终结点 URI。
帐户密钥 Cosmos DB 帐户的共享访问密钥。
数据库 Cosmos DB 数据库名称。
集合名称模式 要使用的集合的集合名称或其模式。
可以使用可选的 {partition} 令牌(其中分区从 0 开始)构造集合名称格式。 两个示例:
1. MyCollection - 必须存在一个名为“MyCollection”的集合。
2.MyCollection{partition} - 基于分区依据列。
分区依据列集合必须存在 -“MyCollection0”、“MyCollection1”、“MyCollection2”等。
分区键 可选。 仅当你在集合名称模式中使用 {partition} 令牌时,才需要此项。
分区键是输出事件中字段的名称,该字段用于指定跨集合分区输出的键。
对于单个集合输出,可使用任何任意输出列。 例如 PartitionId。
文档 ID 可选。 输出事件中的字段的名称,该字段用于指定插入或更新操作所基于的主键。

Azure Functions

Azure Functions 是一个无服务器计算服务,使用它可以按需运行代码,而无需显式预配或管理基础结构。 它允许实现由 Azure 或第三方服务中出现的事件所触发的代码。 Azure Functions 响应触发的这一功能使其成为 Azure 流分析的自然输出。 此输出适配器允许用户将流分析连接到 Azure Functions,并运行脚本或一段代码来响应各种事件。

Azure 流分析通过 HTTP 触发器调用 Azure Functions。 提供具有以下可配置属性的新 Azure Functions 输出适配器:

属性名称 说明
函数应用 Azure Functions App 的名称
函数 Azure Functions App 中的函数的名称
如果想要使用其他订阅中的 Azure Function,则提供访问 Function 的密钥
最大批大小 此属性可用于设置将发送到 Azure 函数的每个输出批的最大大小。 默认情况下,此值为 256 KB
最大批数 顾名思义,此属性允许指定发送到 Azure Functions 的每个批中的最大事件数。 默认最大批数值为 100

当 Azure 流分析从 Azure Function 收到 413(http 请求实体过大)异常时,它将减小发送到 Azure Functions 的批的大小。 在 Azure 函数代码中,使用此异常以确保 Azure 流分析不会发送过大的批。 确保函数中使用的最大批次数和最大批次大小值与在流分析门户中输入的值一致。

另外,如果时间窗口中没有任何事件登录,则不生成任何输出。 因此,不会调用 computeResult 函数。 此行为与内置窗口化聚合函数一致。

分区

下表汇总了分区支持,以及每个输出类型的输出写入器数目:

输出类型 分区支持 分区键 输出写入器数目
Azure SQL 数据库 不适用。
Azure Blob 存储 在 Path 模式中使用事件字段中的 {date} 和 {time} 标记。 选择日期格式,例如 YYYY/MM/DD、DD/MM/YYYY、MM-DD-YYYY。 HH 用于时间格式。 在预览版中,可以通过单个自定义事件属性 {fieldname} 对 blob 输出进行分区。 按照完全可并行化的查询的输入分区。
Azure 事件中心 按分区对齐方式变化。
输出事件中心分区键与上游(上一个)查询步骤相同时,编写器的数量与输出事件中心分区的数量相同。 各编写器使用 EventHub 的 EventHubSender class 将事件发送到特定分区。
输出事件中心分区键与上游(上一个)查询步骤不相同时,编写器的数量与之前步骤中的分区数量不相同。 各编写器使用 EventHubClient SendBatchAsync class 将事件发送到所有输出分区。
Azure 表存储 任何输出列。 按照完全并行化的查询的输入分区。
Azure 服务总线主题 自动选择。 分区数基于服务总线 SKU 和大小。 分区键是每个分区的唯一整数值。 与输出主题中的分区数量相同。
Azure 服务总线队列 自动选择。 分区数基于服务总线 SKU 和大小。 分区键是每个分区的唯一整数值。 与输出队列中的分区数量相同。
Azure Cosmos DB 在 Collection 命名模式中使用 {partition} 标记。 {partition} 值基于查询中的 PARTITION BY 子句。 按照完全并行化的查询的输入分区。
Azure Functions 不适用。

输出批大小

Azure 流分析使用大小可变的批来处理事件和写入到输出。 通常流分析引擎不会一次写入一条消息,而是使用批来提高效率。 输入和输出事件速率都很高时,它会使用更大的批。 输出速率低时,使用较小的批来保证低延迟。

下表介绍了输出批处理的一些注意事项:

输出类型 最大消息大小 批大小优化
Azure SQL 数据库 每个单次批量插入最大行数 10000
每个单次批量插入最小行数 100
另请参阅 Azure SQL 限制
每个批最初都以最大批大小来批量插入,并可能会根据来自 SQL 的可重试错误将批拆分为二(直到达到最小批大小)。
Azure Blob 存储 参阅 Azure 存储限制 最大 Blob 块大小为 4 MB
最大 blob 块计数为 50000
Azure 事件中心 每个消息 256 KB
另请参阅事件中心限制
输入输出分区不相同时,每个事件会分别打包到 EventData 中,并按批发送(批的大小不得超出最大消息大小,高级 SKU 的最大消息大小为 1 MB)。
输入输出分区相同时,多个事件打包到单个 EventData,以最大消息大小发送。
Azure 表存储 参阅 Azure 存储限制 默认为每个单一事务 100 个实体,并且可根据需要配置为更小的值。
Azure 服务总线队列 每个消息 256 KB
另请参阅服务总线限制
每个消息单一事件
Azure 服务总线主题 每个消息 256 KB
另请参阅服务总线限制
每个消息单一事件
Azure Cosmos DB 请参阅 Azure Cosmos DB 限制 批大小和写入频率根据 CosmosDB 响应进行动态调整。
没有来自流分析的预先确定的限制。
Azure Functions 默认批大小为 246 KB。
默认事件计数每批为 100.
批大小是可配置的,可在流分析输出选项中增加或减少。

后续步骤