使用 Amazon S3 存储桶前缀传输数据 - Amazon Data Firehose
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Amazon S3 存储桶前缀传输数据

在创建使用 Amazon S3 作为目的地的 Firehose 流时,您必须指定 Amazon S3 存储桶,Firehose 将在该存储桶中传输数据。您可以使用 Amazon S3 存储桶前缀来组织存储在 S3 存储桶中的数据。Amazon S3 存储桶前缀类似于目录,可让您将类似的对象分组在一起。

通过动态分区,您的分区数据将传输到指定的 Amazon S3 前缀。如果未启用动态分区,则可以选择为 Firehose 流指定 S3 存储桶前缀。但是,如果选择启用动态分区,则必须指定 S3 存储桶前缀,Firehose 要向该存储桶传输分区数据。

在启用动态分区的每个 Firehose 流中,S3 存储桶前缀值由基于该 Firehose 流的指定分区键的表达式组成。再次使用上面的数据记录示例,您可以构建以下 S3 前缀值,该值由基于上面定义的分区键的表达式组成:

"ExtendedS3DestinationConfiguration": { "BucketARN": "arn:aws:s3:::my-logs-prod", "Prefix": "customer_id=!{partitionKeyFromQuery:customer_id}/ device=!{partitionKeyFromQuery:device}/ year=!{partitionKeyFromQuery:year}/ month=!{partitionKeyFromQuery:month}/ day=!{partitionKeyFromQuery:day}/ hour=!{partitionKeyFromQuery:hour}/" }

Firehose 会在运行时系统估算上述表达式。将匹配相同计算的 S3 前缀表达式的记录分组到一个数据集中。然后,Firehose 将每个数据集传输到计算的 S3 前缀。向 S3 传输数据集的频率由 Firehose 流缓冲区设置决定。因此,本示例中的记录将传输到以下 S3 对象键:

s3://my-logs-prod/customer_id=1234567890/device=mobile/year=2019/month=08/day=09/hour=20/my-delivery-stream-2019-08-09-23-55-09-a9fa96af-e4e4-409f-bac3-1f804714faaa

对于动态分区,您必须在 S3 存储桶前缀中使用以下表达式格式:!{namespace:value},其中命名空间可以是 partitionKeyFromQuerypartitionKeyFromLambda,也可以是两者。如果使用内联解析为源数据创建分区键,则必须指定一个 S3 存储桶前缀值,该值由以下格式指定的表达式组成:"partitionKeyFromQuery:keyID"。如果使用 Amazon Lambda 函数为源数据创建分区键,则必须指定一个 S3 存储桶前缀值,该值由以下格式指定的表达式组成:"partitionKeyFromLambda:keyID"

注意

您也可以使用 Hive 样式格式指定 S3 存储桶前缀值,例如 customer_id=!{partitionKeyFromQuery:customer_id。

有关更多信息,请参阅 Creating an Amazon Firehose streamCustom Prefixes for Amazon S3 Objects 中的“Choose Amazon S3 for Your Destination”。

向 Amazon S3 传输数据时添加新的行分隔符

您可以启用新行分隔符,在传输到 Amazon S3 的对象的记录之间添加新行分隔符。这对解析 Amazon S3 中的对象很有帮助。在对聚合数据应用动态分区时,这也特别有用,因为作为解析过程的一部分,多记录解聚(必须先应用于聚合数据,然后才能对其进行动态分区)会从记录中删除新行。