【问题标题】:Architecture for distributed impression data collection分布式印象数据收集架构
【发布时间】:2016-03-01 19:43:12
【问题描述】:

我有一个用 node.js 编写的网络应用程序,分布在几个负载平衡的网络服务器中,用于我正在从事的一个广告技术项目。我正在尝试找出如何最好地收集和分发广告展示的日志数据,以便以后分析数据。

我们决定以 Apache Avro 格式存储数据,并且我们将使用 Apache Spark 来处理数据。我们选择 Avro 是因为我们要访问数据的方式,而且它似乎是最合适的。

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

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

有更好的方法吗?

【问题讨论】:

    标签: node.js amazon-web-services apache-spark avro amazon-kinesis


    【解决方案1】:

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

    我的处理过程与您非常相似(尽管我没有使用 AVRO),但我的 firehose 存储桶上有一个 S3 事件通知,所以每次 firehose 写出一个新文件时,都会调用一个 Lambda 函数来执行我需要做少量的清理工作以将数据转换为最终格式以供另一个系统最终加载,然后将其写回另一个单独的位置。

    根据串联的 firehose 事件对您的不同,与 AVRO 的需要相比,这可能只是一个小的转换,因为您已经在 nodejs 中编写了一个 Lamba nodejs 函数来转换数据,这对您来说应该很容易.

    【讨论】:

      猜你喜欢
      • 2015-02-09
      • 2020-08-05
      • 1970-01-01
      • 1970-01-01
      • 2022-01-27
      • 1970-01-01
      • 2016-01-21
      • 2010-12-13
      • 1970-01-01
      相关资源
      最近更新 更多