分布式展示数据收集架构

我有一个用node.js编写的web应用程序,分布在多个负载平衡的Web服务器中,用于我正在开发的广告技术项目。 我正在设法弄清楚如何最好地收集和分发所投放的广告展示次数的日志数据,以便日后可以分析这些数据。

我们决定将数据存储在Apache Avro格式中,我们将使用Apache Spark处理数据。 我们selectAvro是因为我们要访问数据的方式,而且看起来是最合适的。

目前我有一个Kinesis Firehosestream设置,我使用Node.js的AWS-SDK发送有关每个展示的Avro数据,然后最终存储在S3中。 问题Kinesis把我发送给它的所有文件连接到它写入到S3的每个批处理中,所以如果我把它configuration成每隔300秒写一次,那么它将排队所有的Avro文件,连接它们,然后把它们写到S3。 由于合并在一起,生成的文件不再是有效的Avro文件。

也许这会更好,如果我只是将原始的JSON数据发送到Kinesisstream,然后让另一个应用程序将JSON数据转换成Avro? 有一种烦人的做法,就是为了中间数据处理而编写另一个服务,而我将不得不使用我的转换服务协调对源数据格式的更改。

有更好的方法吗?

Kinesisstream可以工作,但是正如你所说的可能需要大量的工作,然后你需要一个运行24x7x365的服务来使用这个stream。

我和你做了一个非常相似的处理(尽pipe我没有使用AVRO),但是我的消防水桶上有一个S3事件通知,所以每次救火pipe道写出一个新文件,一个Lambda函数被调用,清理,我需要做的是将数据转换成最终的格式,以便最终由另一个系统加载,然后将其写回到另一个单独的位置。

根据不同的连锁消防事件对你来说,与AVRO需要什么不同,这可能只是一个小小的转变,因为你已经在编写nodejs编写Lambda nodejs函数来转换数据应该是非常容易的。