了解 Amazon S3 对象的自定义前缀
传输到 Amazon S3 的对象遵循 <evaluated prefix><suffix> 的名称格式。您可以指定包含在运行时进行估算的表达式的自定义前缀。您指定的自定义前缀将覆盖的默认前缀 yyyy/MM/dd/HH。
您可以在自定义前缀中使用以下形式的表达式:!{namespace:,其中 value}namespace 可以是以下形式之一,如以下各部分所述。
-
firehose -
timestamp -
partitionKeyFromQuery -
partitionKeyFromLambda
如果前缀以斜杠结束,则在 Amazon S3 存储桶中将显示为文件夹。有关更多信息,请参阅 Amazon Data FirehoseDeveloper Guide 中的 Amazon S3 Object Name Format。
timestamp 命名空间
此命名空间的有效值是作为有效 Java DateTimeFormatter!{timestamp:yyyy} 的计算结果为 2018。
在计算时间戳时,Firehose 将使用所写入 Amazon S3 对象中包含的最早记录的大致到达时间戳。
默认情况下,时间戳按 UTC 时间。但是,您可以指定偏好的时区。例如,如果您想使用日本标准时间而不是 UTC,则可以在 Amazon Web Services 管理控制台 或 API 参数设置(CustomTimeZone)中将时区配置为亚洲/东京。要查看支持的时区列表,请参阅 Amazon S3 Object Name Format。
如果您在同一前缀表达式中多次使用 timestamp 命名空间,则每个实例的计算结果为同一时刻。
firehose 命名空间
您可以将两个值用于此命名空间:error-output-type 和 random-string。下表介绍了其使用方法。
| 转换 | 描述 | 示例输入 | 示例输出 | 备注 |
|---|---|---|---|---|
error-output-type |
根据 Firehose 流的配置和失败原因,计算结果为下列字符串之一:{processing-failed、AmazonOpenSearchService-failed、splunk-failed、format-conversion-failed、http-endpoint-failed}。 如果您在同一表达式中多次使用它,则每个实例的计算结果为同一错误字符串。 |
myPrefix/result=!{firehose:error-output-type}/!{timestamp:yyyy/MM/dd} |
myPrefix/result=processing-failed/2018/08/03 |
error-output-type 值只能在 ErrorOutputPrefix 字段中使用。 |
random-string |
计算结果为 11 个字符的随机字符串。如果您在同一表达式中多次使用它,则每个实例的计算结果为一个新的随机字符串。 |
myPrefix/!{firehose:random-string}/ |
myPrefix/046b6c7f-0b/ |
您可以将它用于这两种前缀类型。 您可以将此字符串放在格式字符串的开头以获取随机前缀,若想使用 Amazon S3 获得极高的吞吐量,此操作有时十分必要。 |
partitionKeyFromLambda 和 partitionKeyFromQuery 命名空间
对于动态分区,您必须在 S3 存储桶前缀中使用以下表达式格式:!{namespace:value},其中命名空间可以是 partitionKeyFromQuery 或 partitionKeyFromLambda,也可以是两者。如果使用内联解析为源数据创建分区键,则必须指定一个 S3 存储桶前缀值,该值由以下格式指定的表达式组成:"partitionKeyFromQuery:keyID"。如果使用 Amazon Lambda 函数为源数据创建分区键,则必须指定一个 S3 存储桶前缀值,该值由以下格式指定的表达式组成:"partitionKeyFromLambda:keyID"。有关更多信息,请参阅 Creating an Amazon Firehose stream 中的“Choose Amazon S3 for Your Destination”。
语义规则
以下规则适用于 Prefix 和 ErrorOutputPrefix 表达式。
-
对于
timestamp命名空间,将计算未包含在单引号内的任何字符。换句话说,将按字面意思处理值字段中使用单引号进行转义的任何字符串。 -
如果指定的前缀不包含时间戳名称空间表达式,则 Firehose 会将该表达式
!{timestamp:yyyy/MM/dd/HH/}追加到Prefix字段中的值。 -
序列
!{只能出现在!{namespace:表达式中。value} -
仅当
ErrorOutputPrefix未包含任何表达式时,Prefix才能为空。在这种情况下,Prefix的计算结果为<specified-prefix>yyyy/MM/DDD/HH/,ErrorOutputPrefix计算结果为<specified-prefix><error-output-type>yyyy/MM/DDD/HH/。DDD表示一年中的某天。 -
如果您为
ErrorOutputPrefix指定一个表达式,则您必须包含至少一个!{firehose:error-output-type}实例。 -
Prefix无法包含!{firehose:error-output-type}。 -
Prefix和ErrorOutputPrefix在计算后都不能超过 512 个字符。 -
如果目标位置是 Amazon Redshift,则
Prefix不能包含表达式并且ErrorOutputPrefix必须为空。 -
当目的地是 Amazon OpenSearch Service 或 Splunk,并且未指定
ErrorOutputPrefix时,Firehose 将对失败的记录使用Prefix字段。 -
当目标位置是 Amazon S3 时,Amazon S3 目标配置中的
Prefix和ErrorOutputPrefix将分别用于成功记录和失败记录。如果使用 Amazon CLI 或 API,则可使用ExtendedS3DestinationConfiguration指定具有自己的Prefix和ErrorOutputPrefix的 Amazon S3 备份配置。 -
当您使用 Amazon Web Services 管理控制台 并将目的地设置为 Amazon S3 时,Firehose 会将目的地配置中的
Prefix和ErrorOutputPrefix分别用于成功记录和失败记录。如果使用表达式指定前缀,则必须指定错误前缀,包括!{firehose:error-output-type}。 -
当通过 Amazon CLI、API 或 Amazon CloudFormation 使用
ExtendedS3DestinationConfiguration时,如果您指定S3BackupConfiguration,则 Firehose 不提供默认ErrorOutputPrefix。 -
在创建 ErrorOutputPrefix 表达式时,不能使用
partitionKeyFromLambda和partitionKeyFromQuery命名空间。
示例前缀
| 输入 | 计算的前缀 [2018 年 8 月 27 日上午 10:30(UTC)] |
|---|---|
|
|
|
|
|
输入无效:当 Prefix 包含表达式时,ErrorOutputPrefix 不能为空 |
|
|
|
|
|
|
|
|