如何扇出AWS kinesis流?

时间:2016-10-15 11:26:03

标签: amazon-web-services amazon-kinesis

我想扇出/链接/复制输入AWS Kinesis流到N个新的Kinesis流,这样写入输入Kinesis的每条记录都会出现在N个流中的每个流中。 / p>

是否有 AWS服务或开源解决方案

如果有现成的解决方案,我宁愿不编写代码来执行此操作。 AWS Kinesis firehose是无解决方案,因为它无法输出到kinesis。也许是AWS Lambda解决方案,如果运行起来不会太昂贵?

2 个答案:

答案 0 :(得分:17)

有两种方法可以实现扇出Amazon Kinesis流

  • 使用 Amazon Kinesis Analytics 将记录复制到其他流
  • 触发 AWS Lambda 功能将记录复制到另一个流

选项1:使用Amazon Kinesis Analytics扇出

您可以使用Amazon Kinesis Analytics从现有流生成新流。

来自Amazon Kinesis Analytics documentation

  

Amazon Kinesis Analytics应用程序持续实时读取和处理流数据。您使用SQL编写应用程序代码来处理传入的流数据并生成输出。然后,Amazon Kinesis Analytics 将输出写入已配置的目标

Amazon Kinesis Analytics flow diagram

Application Code部分提到扇出:

  

您还可以编写彼此独立运行的SQL查询。例如,您可以编写两个查询相同应用程序内部流的SQL语句,但将输出发送到不同的应用程序内部流

我设法实现如下:

  • 创建了三个流:input,output1,output2
  • 创建了两个Amazon Kinesis Analytics应用程序:copy1,copy2

Amazon Kinesis Analytics SQL应用程序如下所示:

CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM"
(log VARCHAR(16));

CREATE OR REPLACE PUMP "COPY_PUMP1" AS
  INSERT INTO "DESTINATION_SQL_STREAM"
    SELECT STREAM "log" FROM "SOURCE_SQL_STREAM_001";

此代码创建(将其视为连续选择语句),从input流中选择并输出到output1流。我创建了另一个输出到output2流的相同应用程序。

为了测试,我将数据发送到input流:

#!/usr/bin/env python

import json, time
from boto import kinesis

kinesis = kinesis.connect_to_region("us-west-2")
i = 0

while True:
  data={}
  data['log'] =  'Record ' + str(i)
  i += 1
  print data
  kinesis.put_record("input", json.dumps(data), "key")
  time.sleep(2)

我让它运行一段时间,然后使用以下代码显示输出:

from boto import kinesis

kinesis = kinesis.connect_to_region("us-west-2")
iterator = kinesis.get_shard_iterator('output1', 'shardId-000000000000', 'TRIM_HORIZON')['ShardIterator']
records = kinesis.get_records(iterator, 5)
print [r['Data'] for r in records['Records']]

输出结果为:

[u'{"LOG":"Record 0"}', u'{"LOG":"Record 1"}', u'{"LOG":"Record 2"}', u'{"LOG":"Record 3"}', u'{"LOG":"Record 4"}']

我再次为output2运行它,显示了相同的输出。

选项2:使用AWS Lambda

如果您要分散到许多流,则可以使用更有效的方法来创建AWS Lambda函数:

    Amazon Kinesis流记录
  • 触发
  • 将记录写入多个Amazon Kinesis'输出'流

您甚至可以让Lambda函数根据命名约定(例如任何名为app-output-*的流)自行发现输出流。

答案 1 :(得分:1)

亚马逊实验室有一个github回购提供使用lambda的扇出。 https://github.com/awslabs/aws-lambda-fanout。另请阅读https://medium.com/retailmenot-engineering/building-a-high-throughput-data-pipeline-with-kinesis-lambda-and-dynamodb-7d78e992a02d上的“将同步Lambda调用转换为异步调用”,这对于构建真正的异步处理至关重要。