来自流分析的 Azure Blob 存储和 Data Lake Gen2 输出
Azure Data Lake Storage Gen2 使 Azure 存储成为在 Azure 上构建企业数据湖的基础。 Data Lake Storage Gen2 设计为处理多个 PB 量级的信息,同时保持数百 GB 的吞吐量。 你可以使用它轻松管理海量数据。 Data Lake Storage Gen2 的一个基本部分是向 Azure Blob 存储添加分层命名空间。
Blob 存储提供了一种经济高效且可扩展的解决方案,用于在云中存储大量非结构化数据。 有关 Blob 存储及其用法的简介,请参阅使用 Azure 门户上传、下载和列出 blob。
注意
有关特定于 Avro 和 Parquet 格式的行为的信息,请参阅概述中的相关部分。
输出配置
下表列出了用于创建 blob 或 Data Lake Storage Gen2 输出的属性名称及其说明。
属性名称 | 说明 |
---|---|
输出别名 | 查询中使用的友好名称,用于将查询输出定向到此 blob。 |
存储帐户 | 存储帐户的名称(正在向该存储帐户发送输出)。 |
存储帐户密钥 | 与存储帐户关联的密钥。 |
容器 | 存储在 Blob 存储中的 blob 的逻辑分组。 将 blob 上传到 Blob 存储时,必须为该 blob 指定一个容器。 动态容器名称是可选的。 它只支持容器名称中的一个动态 {field} 。 字段必须存在于输出数据中,并遵循容器名称策略。字段数据类型必须为 string 。 要使用多个动态字段,或将静态文本与动态字段组合,可以在查询中使用内置的字符串函数(如 CONCAT 和 LTRIM 等)定义它。 |
事件序列化格式 | 输出数据的序列化格式。 支持 JSON、CSV、Avro 和 Parquet。 |
写入模式 | 写入模式控制 Azure 流分析写入输出文件的方式。 仅当写入模式为“一次”时,才会进行“刚好一次”交付。 有关详细信息,请参阅下一部分。 |
分区列 | 可选。 从输出数据到分区的 {field} 名称。 仅支持一个分区列。 |
路径模式 | 用于写入指定容器中的 blob 的文件路径模式。 在路径模式中,可选择使用使用日期和时间变量的一个或多个实例来指定写入 Blob 的频率:{date}、{time}。 请注意,如果写入模式为“一次”,则需要同时使用 {date} 和 {time}。 可以使用自定义 blob 分区从事件数据中指定一个自定义 {field} 名称来对 blob 进行分区。 字段名称是字母数字,并且可以包含空格、连字符和下划线。 对自定义字段的限制包括以下内容:
通过此功能可以在路径中使用自定义日期/时间格式说明符配置。 一次只能指定一个自定义日期和时间格式,并用 {datetime:<specifier>} 关键字括起来。 <specifier> 允许的输入为 yyyy、MM、M、dd、d、HH、H、mm、m、ss 或 s。 可以在路径中多次使用 {datetime:<specifier>} 关键字以构成自定义的日期/时间配置。 示例:
创建的文件夹结构的时间戳遵循 UTC 而不是本地时间。 System.Timestamp 是用于所有基于时间的分区的时间。 文件命名采用以下约定: {路径前缀模式}/schemaHashcode_Guid_Number.extension 此处的 Guid 表示分配给为写入 blob 文件而创建的内部编写器的唯一标识符。 该数字表示 blob 块的索引。 示例输出文件:
有关此功能的详细信息,请参阅 Azure 流分析自定义 blob 输出分区。 |
日期格式 | 如果在前缀路径中使用日期令牌,可以选择组织文件所采用的日期格式。 示例:YYYY/MM/DD |
时间格式 | 如果在前缀路径中使用时间令牌,可指定组织文件所采用的时间格式。 |
最小行数 | 每批的最小行数。 对于 Parquet,每个批处理都将创建一个新文件。 当前默认值为 2000 行,允许的最大值为 10000 行。 |
最长时间 | 每批的最长等待时间。 在此时间后,即使不满足最小行数要求,也会将该批写入输出。 当前默认值为 1 分钟,允许的最大值为 2 小时。 如果 Blob 输出具有路径模式频率,则等待时间不能超过分区时间范围。 |
编码 | 如果使用 CSV 或 JSON 格式,则必须指定编码格式。 目前只支持 UTF-8 这种编码格式。 |
分隔符 | 仅适用于 CSV 序列化。 流分析在 CSV 数据序列化中支持许多常见分隔符。 支持的值为逗号、分号、空格、制表符和竖线。 |
格式 | 仅适用于 JSON 序列化。 分隔行指定通过新行分隔各个 JSON 对象,从而格式化输出。 如果选择“行分隔”,则读取 JSON 时,一次读取一个对象。 整个内容本身将不是有效的 JSON。 数组指定输出会被格式化为 JSON 对象的数组。 仅当作业停止或流分析移动到下个时间段时,才关闭此数组。 一般而言,最好使用分隔行 JSON,因为在继续写入输出文件时,无需任何特殊处理。 |
“刚好一次”交付(公共预览版)
在读取任何流式输入时,端到端“刚好一次”交付意味着处理后的数据将写入 Data Lake Storage Gen2 输出一次,而不会重复。 启用该功能后,流分析作业可保证自最后一次输出起,由用户发起的重启不会丢失数据,也不会产生重复输出。 这样就无需实现重复数据删除逻辑并排查该逻辑的相关问题,从而简化了流式处理管道。
写入模式
流分析可通过两种方式写入 Blob 存储或 Data Lake Storage Gen2 帐户。 一种方法是在结果传入时将结果追加到同一文件或追加到一系列文件。 另一种方法是在时间分区的所有数据都可用后写入时间分区的所有结果。 当写入模式为“一次”时,会启用“刚好一次”交付。
Delta Lake 没有写入模式选项。 但是,Delta Lake 输出也通过使用 Delta 日志提供“刚好一次”保证。 它不需要时间分区,并且会根据用户定义的批处理参数持续写入结果。
注意
如果不想使用“刚好一次”交付预览功能,请选择在结果到达时进行附加操作。
配置
若想要 Blob 存储或 Data Lake Storage Gen2 帐户接收“刚好一次”交付,则需要配置以下设置:
- 针对“写入模式”,选择“时间分区的所有结果可用后写入一次”。
- 提供指定了
{date}
和{time}
的路径模式。 - 指定日期格式和时间格式。
限制
- 不支持子流。
- 路径模式为必需属性,并且必须同时包含
{date}
和{time}
。 不允许使用动态自定义{field}
名称。 详细了解自定义路径模式。 - 如果作业启动时间为最后一次输出之前或之后的自定义时间,则存在文件被覆盖的风险。 例如,若时间格式设置为“HH”,则将每小时生成一次文件。 如果在上午 8 点 15 分停止作业,并在上午 8 点 30 分重启作业,则上午 8 点到 9 点之间生成的文件仅涵盖上午 8 点 30 分到上午 9 点的数据。 上午 8 点到 8 点 15 分的数据会因为被覆盖而丢失。
Blob 输出文件
当使用 Blob 存储作为输出时,在以下情况下会在 blob 中创建一个新文件:
- 文件超出了允许的最大块数(目前为 50,000)。 可达到允许的最大块数,但不能达到允许的最大 blob 大小。 例如,如果输出率很高,则可以看到每个块的字节更多,并且文件大小会更大。 输出率较低时,每个块都有较少的数据,且文件大小较小。
- 输出中出现架构更改,输出格式需要固定的架构(CSV、Avro 或 Parquet)。
- 作业重启时,可选择在外部由用户停止或启动,或在内部进行系统维护或错误恢复。
- 对查询进行完全分区,并且为每个输出分区创建新文件。 它源自使用
PARTITION BY
或兼容性级别 1.2 中引入的本机并行化。 - 用户删除存储帐户的文件或容器。
- 使用路径前缀模式对输出进行时间分区,并且在查询移动到下一个小时时使用新的 Blob。
- 按自定义字段对输出进行分区,并为每个分区键创建新的 Blob(如果 Blob 不存在)。
- 按照自定义字段对输出进行分区(其中分区键基数超过 8,000),并为每个分区键创建一个新的 Blob。
分区
对于分区键,请在路径模式中使用事件字段中的 {date}
和 {time}
标记。 选择日期格式,例如 YYYY/MM/DD
、DD/MM/YYYY
或 MM-DD-YYYY
。 HH
用于时间格式。 可以通过单个自定义事件属性 {fieldname}
或 {datetime:\<specifier>}
对 blob 输出进行分区。 输出编写器的数量与可完全并行化的查询的输入分区一致。
输出批大小
有关最大消息大小,请参阅 Azure 存储限制。 最大 blob 块大小为 4 MB,最大 blob 块计数为 50,000。
限制
- 如果在路径模式中使用左斜线符号
/
(例如/folder2/folder3
),则会创建空文件夹,并且这些文件夹在存储资源管理器中不可见。 - 在不需要新 blob 文件的情况下,流分析会追加到同一文件。 如果将 Azure 事件网格之类的 Azure 服务配置为在 blob 文件更新时触发,可能会导致生成额外的触发器。
- 默认情况下,流分析会追加到 blob。 当输出格式为 JSON 数组时,它将在关闭时或者在输出移到下一个时间分区(适用于按时间分区的输出)时完成文件。 在某些情况下(例如不纯粹的重启),JSON 数组的右中括号 (
]
) 会缺失。