我认为应该是AWS Glue的一个相对简单的用例,但我在确定如何实现它时遇到了很多麻烦。
我有一个Kinesis Firehose作业将流数据转储到S3存储桶中。这些文件由一系列离散的Web浏览事件组成,表示为具有不同结构的JSON文档(因此,例如,一个文档可能具有字段'date'而不是字段'name',而另一个可能具有'name'但不是'date' )。
我希望在这些文件上运行每小时的ETL工作,其具体细节与手头的问题无关。
我正在尝试运行S3数据目录爬虫,而我遇到的问题是Kinesis输出格式本身不是有效的JSON,这对我来说简直莫名其妙。相反,它是由换行符分隔的一堆JSON文档。爬网程序可以自动识别和解析JSON文件,但无法解析此问题。
我想过编写一个lambda函数来“修复”Firehose文件,这是由它在存储桶上创建引发的,但它听起来像是一个廉价的解决方案,可以整齐地放在一起。
另一个选择是完全绕过数据目录并在Glue脚本本身进行必要的转换,但我不知道如何开始这个。
我错过了什么吗?是否有更简单的方法来解析Firehouse输出文件,或者失败,绕过了对爬虫的需求?
欢呼并提前感谢
听起来你正在描述Kinesis Firehose的行为,它是根据一些缓冲(时间和大小)设置连接多个传入记录,然后将记录作为单个对象写入S3。 Firehose Data Delivery
如果工作负载将包含大量记录,则将多个记录批处理到单个文件中非常重要,因为从S3处理许多小文件的性能(和S3成本)可能不是最佳的。
AWS Glue Crawlers和ETL作业确实支持“JSON line”(newline delimited JSON)格式的处理。
如果爬网程序未能运行,请包括日志或错误详细信息(如果可能,请包括爬网程序运行持续时间以及创建和更新的表的数量。
我看到一个爬虫在一个实例中失败,在这个实例中,被爬网文件的差异迫使它进入每个文件的表模式,并且它达到了表数量的限制。 AWS Glue Limits
你可以从firehose创建的json文件中粘贴几行吗?我在Kinesis Streams生成的json文件上运行了爬虫,它能够成功解析它。
您是否在创建Firehose作业时尝试“转换记录格式”?在那里,您可以指定JSONSerDe或Glue目录来解析数据。
我设法解决了这个问题;基本上问题是并非每个JSON文档都具有相同的底层结构。
我写了一个lambda脚本作为Kinesis进程的一部分,通过在必要时添加NULL字段强制每个文档进入相同的结构。然后,爬网程序能够正确解析生成的文件并将它们映射到单个表。
为我解决这个问题的方法是在发送到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中读取它。