1

我有一个用node.js编写的web应用程序,分布在我正在开发的一个广告技术项目的多个负载平衡Web服务器中。我试图找出如何最好地收集和分发所投放广告展示的日志数据,以便稍后分析数据。分布式展示数据收集的体系结构

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

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

也许这会更好,如果我只是将原始JSON数据发送到Kinesis流,然后让另一个应用程序将JSON数据转换成Avro?很烦人的是,必须为中间数据处理编写另一项服务,但我必须通过转换服务协调对源数据格式的更改。

有没有更好的方法?

回答

1

Kinesis流可以工作,但正如你所说的可能需要很多工作,然后你需要一个运行24x7x365的服务来使用流。

我和你做了一个非常类似的处理(尽管我没有使用AVRO),但是我在我的firehose桶中有一个S3事件通知,所以每次firehose写出一个新文件,一个Lambda函数被调用我需要做的少量清理工作,以便将数据转化为最终格式,以便最终由另一个系统加载,然后将其写回另一个单独的位置。

根据连锁消防事件对你有多不同,与AVRO需要什么不同,这可能只是一个小小的转换,并且由于你已经在nodejs中编写了一个Lambda nodejs函数来转换数据应该很容易您。