AWS Glue - 如何从 S3 抓取 Kinesis Firehose 输出文件夹

AWS Glue - how to crawl a Kinesis Firehose output folder from S3

我有一个我认为应该是 AWS Glue 相对简单的用例,但我在弄清楚如何实施它时遇到了很多麻烦。

我有一个 Kinesis Firehose 作业将流数据转储到 S3 存储桶中。这些文件由一系列离散的 Web 浏览事件组成,表示为具有不同结构的 JSON 个文档(例如,一个文档可能有字段 'date' 但没有字段 'name',而另一个可能有'name' 但不是 'date').

我希望对这些文件进行 运行 每小时 ETL 作业,具体细节与手头的事情无关。

我正在尝试 运行 S3 数据目录爬虫,我 运行 遇到的问题是 Kinesis 输出格式不是 本身,有效 JSON,这让我感到莫名其妙。相反,它是由换行符分隔的一堆 JSON 文档。爬虫可以自动识别和解析JSON个文件,但是不能解析this.

我考虑过将 lambda 函数写入 'fix' Firehose 文件,由它在存储桶上的创建触发,但对于 应该 整齐地组合在一起。

另一种选择是完全绕过数据目录并在 Glue 脚本本身中进行必要的转换,但我不知道如何开始。

我错过了什么吗?是否有更简单的方法来解析 Firehouse 输出文件,或者,如果失败,绕过对爬虫的需要?

提前祝贺和感谢

能否从 firehose 创建的 json 文件中粘贴几行?我 运行 Kinesis Streams 生成的 json 文件上的爬虫,它能够成功解析它。

您在创建 Firehose 作业时是否也尝试了 "convert record format"?您可以在那里指定 JSONSerDe 或 Glue 目录来解析您的数据。

听起来你在描述 Kinesis Firehose 的行为,即根据一些缓冲(时间和大小)设置连接多个传入记录,然后将记录作为单个对象写入 S3。 Firehose Data Delivery

如果工作负载将包含大量记录,则将多个记录分批放入单个文件很重要,因为处理来自 S3 的许多小文件的性能(和 S3 成本)可能达不到最佳水平。

AWS Glue Crawlers 和 ETL 作业支持处理 'JSON line' (newline delimited JSON) 格式。

如果爬虫未能 运行 请包括日志或错误详细信息(如果可能,爬虫 运行 持续时间,以及创建和更新的 table 数量。

我见过一个爬虫失败的例子,因为被爬文件的差异迫使它进入 table-per-file 模式,并且它达到了 table 数量的限制秒。 AWS Glue Limits

我设法解决了这个问题;基本上,问题是并非每个 JSON 文档都具有相同的底层结构。

我编写了一个 lambda 脚本作为 Kinesis 进程的一部分,通过在必要时添加 NULL 字段,强制每个文档进入相同的结构。然后爬虫能够正确解析生成的文件并将它们映射到单个 table.

为我解决这个问题的方法是在发送到 firehose 的每个有效负载的末尾添加一个换行符字段“/n”。

msg_pkg = (str(json_response) + '\n').encode('utf-8')
record = {'Data': msg_pkg}
put_firehose('agg2-na-firehose', record

因为显然 Hive JSON SerDe 是用于处理 json 数据的默认设置。完成此操作后,我能够抓取 json 数据并在 Athena 中读取它。