有哪些选项可以处理来自Kinesis流的时间序列数据

时间:2016-05-10 09:03:45

标签: amazon-web-services aws-lambda amazon-kinesis amazon-kcl

我需要处理来自AWS Kinesis流的数据,该流从设备收集事件。必须每秒调用处理函数,并在最后10秒内收到所有事件。

说,我有两个设备A和B将事件写入流。 我的程序名称为MyFunction,并采用以下参数:

  • DEVICEID
  • 一段时间的数据

如果我在10:00:00开始处理(并且在过去10秒内已经为设备A和B累积了事件) 然后我需要打两个电话:

  • MyFunction(А,{设备A的事件从09:59:50到10:00:00})
  • MyFunction(B,{设备B从09:59:50到10:00:00的事件}}

在下一秒,10:00:01

  • MyFunction(А,{设备A的事件从09:59:51到10:00:01})
  • MyFunction(B,{设备B从09:59:51到10:00:01的事件}}

等等。

看起来累积从设备接收的所有数据的最简单方法就是将它存储在临时缓冲区中(当然只有最后10秒),所以我想先尝试一下。

保持这种基于内存的缓冲区最方便的方法是创建一个基于Java Kinesis Client Library(KCL)的应用程序。

我还考虑过基于AWS Lambda的解决方案,但看起来不可能将内存中的数据保存为lambda。 Lambda的另一个选择是拥有2个函数,第一个必须将所有数据写入DynamoDB,第二个函数每秒调用一次以处理从db而不是从内存中获取的数据。 (所以这个选项要复杂得多)

所以我的问题是:实现此类处理的其他选项是什么?

1 个答案:

答案 0 :(得分:1)

所以,你正在做的事情被称为"窗口操作" (或"窗口计算")。有多种方法可以实现这一点,就像你说缓冲是最好的选择。

  • 在内存缓存系统中:Ehcache,Hazelcast

累积缓存系统中的数据并选择适当的驱逐策略(在您的情况下为10分钟)。然后进行分组求和运算并计算输出。

  • 在内存数据库中:Redis,VoltDB

就像缓存系统一样,您可以使用数据库架构。 Redis可能是有益的和有状态的。如果您使用VoltDB或此类SQL系统,则调用" sum()"或" avg()"操作会更容易。

可以使用Spark进行计数。您可以尝试使用Elastic MapReduce(EMR),这样您就可以继续使用AWS生态系统,并且可以更轻松地进行集成。