任何人在使用 AWS kinesis 流、lambda 和 firehose 时都遇到过数据丢失的情况?

Posted

技术标签:

【中文标题】任何人在使用 AWS kinesis 流、lambda 和 firehose 时都遇到过数据丢失的情况?【英文标题】:Anyone experienced data lost when using AWS kinesis streams, lambda and firehose? 【发布时间】:2017-12-08 03:46:10 【问题描述】:

我目前正在向 aws kinesis 流发送一系列 xml 消息,我一直在不同的项目中使用它,所以我非常有信心这个位有效。然后我编写了一个 lambda 来处理从 kinesis 流到 kinesis firehose 的事件:

import os
import boto3
import base64

firehose = boto3.client('firehose')


def lambda_handler(event, context):
    deliveryStreamName = os.environ['FIREHOSE_STREAM_NAME']

    # Send record directly to firehose
    for record in event['Records']:
        data = record['kinesis']['data']

        response = firehose.put_record(
            DeliveryStreamName=deliveryStreamName,
            Record='Data': data
        )
        print(response)

我已将 kinesis 流设置为 lamdba 触发器,并将批量大小设置为 1,起始位置为 LATEST。

对于 kinesis firehose,我有以下配置:

Data transformation*: Disabled
Source record backup*: Disabled
S3 buffer size (MB)*: 10
S3 buffer interval (sec)*: 60
S3 Compression: UNCOMPRESSED
S3 Encryption: No Encryption
Status: ACTIVE
Error logging: Enabled

我发送了 162 个事件,并从 s3 读取它们,我设法得到的最多是 160 个,而且通常更少。我什至试图等待几个小时,以防重试发生奇怪的事情。

任何人都有使用 kinesis-> lamdba -> firehose 的经验,并且遇到过丢失数据的问题吗?

【问题讨论】:

你有没有想过这个问题?我自己也有类似的问题 【参考方案1】:

从我在这里看到的情况来看,当您将数据发布到 Kinesis Stream(不是 FireHose)时,很可能会丢失项目。

由于您在写入 FireHose 时使用了put_record,因此它将引发异常并且在这种情况下将重试 lambda。 (检查该级别是否存在故障是有意义的)。

所以考虑到我可能会假设记录在到达 Kinesis 流之前就丢失了。 如果您使用put_records 方法将项目发送到 Kinesis 流,则不能保证所有记录都会发送到流(由于超出写入吞吐量或内部错误),某些记录可能无法发送。在这种情况下,您的代码应该重新发送失败的记录子集(这里是 Java example,抱歉我找不到 Python 的)。

【讨论】:

以上是关于任何人在使用 AWS kinesis 流、lambda 和 firehose 时都遇到过数据丢失的情况?的主要内容,如果未能解决你的问题,请参考以下文章

使用 AWS Java DynamoDB 流 Kinesis 适配器处理 DynamoDB 流

AWS Typescript CDK,尝试将 kinesis 流作为来源添加到 firehose

Aws云形成模板:如何为Kinesis资源提供保留期?

AWS CDK 中的哪个类可以选择为 Kinesis 传输流配置动态分区

解释 Kinesis 分片迭代器 - AWS Java 开发工具包

Spark Streaming 集成 AWS Kinesis