我有一个用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会更好?但是,为了进行中间数据处理,我必须编写另一项服务,并且我必须使用我的转换服务协调对源数据格式的更改。
有更好的方法吗?
答案 0 :(得分:1)
Kinesis流可以工作,但是正如你所说的那样,或许需要大量的工作来满足您的需求,然后您需要一个24x7x365运行的服务来使用流。
我做了一个非常类似的处理(虽然我没有使用AVRO),但是我的firehose存储桶上有一个S3事件通知,所以每次firehose写出一个新文件时,会调用一个Lambda函数来执行我需要进行少量清理,以便将数据转换为最终格式,以便由另一个系统最终加载,然后将其写回另一个单独的位置。
取决于连接的firehose事件对你的不同,与AVRO需要的不同,这可能只是一个小的转换,因为你已经在nodejs中编写一个Lamba nodejs函数来转换数据对你来说应该很容易