我认为应该是AWS Glue的一个相对简单的用例,但是我在确定如何实现它方面遇到很多麻烦。
我有一个Kinesis Firehose作业,将流数据转储到S3存储桶中。这些文件由一系列离散的Web浏览事件组成,这些事件表示为具有不同结构的JSON文档(因此,一个文档可能具有字段“ date”而不是字段“ name”,而另一个文档可能具有“ name”但没有“ date” )。
我希望每小时在这些文件上运行ETL作业,其细节与手头的事情无关。
我正在尝试运行S3数据目录搜寻器,遇到的问题是Kinesis输出格式不是本身,即有效的JSON,这对我来说实在令人困惑。相反,它是一堆由换行符分隔的JSON文档。搜寻器可以自动识别和解析JSON文件,但无法解析。
我曾想过要编写一个lambda函数来“修复” Firehose文件,这是由在存储桶中创建文件触发的,但是听起来很便宜,因为两个文件应该整齐地配合在一起。
另一个选择是完全绕开数据目录并在Glue脚本本身中进行必要的转换,但是我不知道如何开始。 我错过了什么吗?有没有更简单的方法来解析Firehouse输出文件,或者失败了,从而无需使用搜寻器? 预先加油并感谢
答案 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中读取它。