以 Kinesis Firehose 输出格式将 DynamoDB 数据传输到 S3

DynamoDB data to S3 in Kinesis Firehose output format

Kinesis data firehose 有一种默认格式,可以将文件添加到 S3 存储桶中的单独分区,如下所示:s3://bucket/prefix/yyyy/MM/dd/HH/file.extension

我创建了事件流以​​使用 Firehose 将数据从 DynamoDB 转储到 S3。中间有一个转换 lambda,将 DDB 记录转换为 TSV 格式(制表符分隔)。
所有这些都添加到已经包含大量数据的现有 table 上。我需要将现有数据从 DynamoDB 回填到 S3 存储桶,以保持格式与现有 Firehose 输出样式的奇偶校验。

我试过的解决方法 :
第 1 步:使用 DDB 导出功能将 Table 导出到 S3。使用 Glue 爬虫创建数据目录 Table.
第 2 步:使用 Athena 的 CREATE TABLE AS SELECT 查询来模仿由中间 Lambda 完成的转换并将该输出存储到 S3 位置。
第 3 步:但是,Athena CTAS 应用无法取消的默认压缩。所以我写了一个 Glue Job,它从以前的 table 读取并写入另一个 S3 位置。此作业还负责添加基于 year/month/day/hour 的分区,就像使用 Firehose 的格式一样,并写入解压缩的 S3 制表符分隔格式文件。

但是,问题在于 Glue 创建的 Hive 样式分区如下所示: s3://bucket/prefix/year=2021/month=02/day=02/。我需要改为匹配流水块样式的 S3 分区。 我正在寻找一种方法来帮助实现这一目标。找不到使用 Glue 添加块样式分区的方法。我的另一种方法是,使用 AWS CLI S3 mv 命令将所有这些数据移动到具有正确文件名的单独文件夹中,该文件名不干净且未优化。

留下我最终实施的解决方案,以防它对任何人有帮助。

我创建了一个 Lambda 并在此存储桶上添加了 S3 事件触发器。 Lambda 完成了将文件从 Hive-style 分区的 S3 文件夹移动到结构正确的 block-style S3 文件夹的工作。

Lambda 使用了 boto3 s3Client 的 Copy 和 delete 函数来实现相同的功能。 它就像一个魅力,即使我喜欢> 10 ^ 6个输出文件分成不同的分区。