我有一个用 node.js 编写的 Web 应用程序,分布在多个负载平衡的 Web 服务器中,用于我正在处理的广告技术项目。我正在尝试找出如何最好地收集和分发广告展示次数的日志数据,以便稍后分析这些数据。
我们决定以 Apache Avro 格式存储数据,并将使用 Apache Spark 来处理数据。我们选择 Avro 是因为我们要访问数据的方式,而且它似乎是最合适的。
目前,我有一个 Kinesis Firehose 流设置,并使用适用于 Node.js 的 AWS-SDK 发送有关每次展示的 Avro 数据,然后最终存储在 S3 中。问题 Kinesis 会连接我发送给它的每批写入 S3 的所有文件 - 因此,如果我将其配置为每 300 秒写入一次,那么它将对所有 Avro 文件进行排队,连接它们,然后将它们写入S3。生成的文件不再是有效的 Avro 文件,因为它们已合并在一起。
如果我只是将原始 JSON 数据发送到 Kinesis 流,然后让另一个应用程序将 JSON 数据转换为 Avro,也许会更好?不过,必须为中间数据处理编写另一个服务有点烦人,而且我必须使用我的转换服务协调对源数据格式的更改。
有更好的方法吗?
请您参考如下方法:
Kinesis 流可以工作,但正如您所说,可能需要做很多工作才能满足您的需求,然后您需要一个 24x7x365 运行的服务来使用该流。
我进行了与您非常相似的处理(尽管我没有使用 AVRO),但我的 firehose 存储桶上有一个 S3 事件通知,因此每次 firehose 写出一个新文件时,都会调用一个 Lambda 函数来执行少量清理工作,以便将数据转换为最终格式以供另一个系统最终加载,然后将其写回到另一个单独的位置。
根据串联的 Firehose 事件对您的不同程度以及 AVRO 的需求,这可能只是一个较小的转换,并且由于您已经在 Nodejs 中进行编码,因此编写 Lamba Nodejs 函数来转换数据对您来说应该非常容易。