发布于: Jun 21, 2022

2019 年 2 月,Amazon Web Services 宣布了 Amazon Kinesis Data Firehose 的一项称为“Amazon S3 对象自定义前缀”新功能。它允许客户为传输数据记录的 Amazon S3 对象的前缀指定自定义表达式。 之前,Kinesis Data Firehose 仅允许指定部分文字前缀。新支持的前缀可以与静态日期格式的前缀结合使用,以创建固定格式的输出文件夹。 客户要求具有灵活性,Amazon Web Services 聆听客户意见并进行改进和交付此项服务。Kinesis Data Firehose 最常用于消费来自流处理源(如应用程序或物联网设备)的流式事件数据它消费了数据后,数据通常存储在数据湖中,因此可以处理并最终查询数据。 在 Amazon S3 上存储数据时,最佳实践是对相关数据进行分区或分组,并将它们存储在同一文件夹中。 这样就可以筛选分区数据并控制每个查询扫描的数据量,从而提高性能并降低成本。

分组数据的一个常用方法是按日期分组。 Kinesis Data Firehose 会根据日期自动对数据进行分组,并将其存储到 Amazon S3 上的相应文件夹中。 但是,Amazon S3 中的文件夹命名与 Apache Hive 命名规则不兼容。这使得使用 Amazon Web Services Glue 爬网程序进行编目并使用大数据工具进行分析时变得比较复杂。

本博文讨论了一项新功能,该功能允许自定义 Kinesis Data Firehose 命名 Amazon S3 中输出文件夹的方式。它介绍了自定义前缀的工作原理、预期用例,并附带按步就搬的操作说明。

在以前,Kinesis Data Firehose 采用 YYYY/MM/DD/HH 格式创建基于 UTC 格式 的静态文件夹结构。然后,在将对象写入 Amazon S3 之前,将其添加到前缀。 例如,如果您提供的前缀为“mydatalake/”,则生成的文件夹层次结构将为“mydatalake/2019/02/09/13”。 但是,为了与 Hive 命名规则兼容,文件夹结构应遵循“/partitionkey=partitionvalue”格式。 如果能使用此命名规则,可以通过 Amazon Web Services Glue 爬网程序轻松编目数据,从而生成正确的分区名称。

也可以使用其他管理分区的方法,例如在 Amazon Athena 上运行 MSCK REPAIR TABLE 或在 Amazon EMR 上运行 Apache Hive,这样可以通过单个语句添加所有分区。 此外,您可以使用其他基于日期的分区模式,如“/dt=2019-02-09-13/”,而不是将日期扩展到文件夹中。 这将有助于减少随着表项目的增加而需要维护的S3分区总数。通过这种方式还可以简化范围查询。 提供指定自定义前缀的功能,无需额外的 ETL 步骤即可将数据放入正确的文件夹结构中,从而缩短洞察时间。

注意:此新功能不允许使用来自事件数据中的任何日期或时间戳值,也不能在事件中使用任何其他任意值。Kinesis Data Firehose 使用名为 ApproximateArrivalTimestamp 的内部时间戳字段。 每个数据记录包括在流成功接收并存储记录时设置的 ApproximateArrivalTimestamp(采用 UTC)。这通常称为服务器端时间戳。Kinesis Data Firehose 根据配置的缓冲提示缓冲传入记录,并将它们传输到 Amazon S3 目标的 Amazon S3 对象。Amazon S3 中产生的对象可能包含多个记录,每个记录具有不同的 ApproximateArrivalTimestamp。 在评估时间戳时,Kinesis Data Firehose 使用对象中最老的 ApproximateArrivalTimestamp 记录。

借助 Kinesis Data Firehose,还可以在传输、Amazon Web Services Lambda 转换或格式转换失败时将记录传送到不同错误输出位置。在以前,错误输出位置无法配置,根据传输失败的类型系统自动决定。在此版本中可以配置错误输出位置 (ErrorOutputPrefix)。这项新功能的一个好处是,可以将失败的记录分成日期分区文件夹,以便于再处理。

那么如何指定自定义前缀和 ErrorOutputPrefix? 可使用 : !{namespace:value} 形式的表达式,其中命名空间可以是 firehose 或 timestamp。该值可以是“random-string”或“error-output-type”(对于 firehose 命名空间),也可以是日期模式(对于 Java DateTimeFormatter 格式的时间戳命名空间)。在单个表达式中,您可以使用两个名称空间的组合,但 !{firehose: error-output-type} 只能在 ErrorOutputPrefix 中使用。有关更多信息和示例,请参阅 Amazon S3 对象的自定义前缀。

相关文章