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

时间:2018-09-24 22:00:54

标签: amazon-s3 aws-glue amazon-kinesis-firehose

我认为应该是AWS Glue的一个相对简单的用例,但是我在确定如何实现它方面遇到很多麻烦。

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

我希望每小时在这些文件上运行ETL作业,其细节与手头的事情无关。

我正在尝试运行S3数据目录搜寻器,遇到的问题是Kinesis输出格式不是本身,即有效的JSON,这对我来说实在令人困惑。相反,它是一堆由换行符分隔的JSON文档。搜寻器可以自动识别和解析JSON文件,但无法解析。

我曾想过要编写一个lambda函数来“修复” Firehose文件,这是由在存储桶中创建文件触发的,但是听起来很便宜,因为两个文件应该整齐地配合在一起。

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

我错过了什么吗?有没有更简单的方法来解析Firehouse输出文件,或者失败了,从而无需使用搜寻器?

预先加油并感谢

4 个答案:

答案 0 :(得分:2)

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

如果工作负载将包含大量记录,则将多个记录批处理到单个文件中非常重要,因为处理S3中的许多小文件的性能(和S3成本)可能不是最佳选择。

AWS Glue Crawlers和ETL作业确实支持处理“ JSON行”(newline delimited JSON)格式。

如果搜寻器无法运行,请提供日志或错误详细信息(如果可能,搜寻器的运行时间以及创建和更新的表数。

我已经看到一个搜寻器在以下情况下发生故障:正在搜寻的文件中的差异迫使该搜寻器进入每个文件一个表的模式,并且达到了表数的限制。 AWS Glue Limits

答案 1 :(得分:0)

您能从firehose创建的json文件中粘贴几行吗?我在Kinesis Streams生成的json文件上运行了搜寻器,它能够成功解析它。

创建Firehose作业时,您是否还尝试过“转换记录格式”?您可以在此处指定JSONSerDe或Glue目录来解析数据。

答案 2 :(得分:0)

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

我在Kinesis进程中编写了一个lambda脚本,该脚本通过在必要时添加NULL字段来将每个文档强制为相同的结构。然后,搜寻器可以正确地解析生成的文件并将它们映射到单个表中。

答案 3 :(得分:0)

为我解决的问题是在发送到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中读取它。