【问题标题】:Amazon Redshift: `ActiveStatementsExceededException` (how to do INSERTs concurrently)Amazon Redshift:`ActiveStatementsExceededException`(如何同时执行 INSERT)
【发布时间】:2021-12-11 23:26:27
【问题描述】:

我有一个 Kinesis 集群,它通过 Lambda 将数据推送到 Amazon Redshift。

目前我的 lambda 代码如下所示:

client = boto3.client('redshift-data')
for tx in txs:
    query = # prepare an INSERT query here

    resp = client.execute_statement(
        ClusterIdentifier=redshift_cluster_id,
        Database=redshift_db,
        DbUser=redshift_user,
        Sql=query
    )

问题在于,一旦我尝试扩大 kinesis(更多分片)或 lambda(从单个分片并发处理) - 我就会明白:

[ERROR] ActiveStatementsExceededException: An error occurred (ActiveStatementsExceededException) when calling the ExecuteStatement operation: Active statements exceeded the allowed quota (200).
Traceback (most recent call last):
  File "/opt/python/lib/python3.8/site-packages/codeguru_profiler_agent/aws_lambda/profiler_decorator.py", line 52, in profiler_decorate
    return function(event, context)
  File "/opt/python/lib/python3.8/site-packages/codeguru_profiler_agent/aws_lambda/lambda_handler.py", line 91, in call_handler
    return handler_function(event, context)
  File "/var/task/lambda_function.py", line 71, in lambda_handler
    resp = client.execute_statement(
  File "/var/runtime/botocore/client.py", line 386, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/var/runtime/botocore/client.py", line 705, in _make_api_call
    raise error_class(parsed_response, operation_name)

从 AWS 文档中,我收集到这意味着我正在尝试并行运行太多 execute_statements。

我该如何解决这个问题?使用 Redshift 的唯一方法是通过批处理记录并将它们全部插入在一起吗?

【问题讨论】:

  • 你真的不能使用这样的插入来更新红移——它太慢了,除非你的音量非常低。您需要将批处理写入 s3,然后使用 readshift 批量加载进程。

标签: python amazon-web-services aws-lambda amazon-redshift amazon-kinesis


【解决方案1】:

您的代码中的注释让我暂停 - “query = # 在此处准备一个 INSERT 查询”。这似乎意味着您正在将 S3 数据读入 Lambda 并将这些数据插入 Redshift。如果是这样,这不是一个好的模式。

首先,Redshift 期望通过 COPY(或 Spectrum 或 ...)而不是通过 INSERT 将数据引入集群。这将在 Redshift 中产生管理事务的问题,并造成巨大的浪费或磁盘空间/对 VACUUM 的需求。将数据放入 Redshift 的 INSERT 方法是一种反模式,即使是中等大小的数据也不应该这样做。

更普遍的担忧是数据移动阻抗不匹配。 Kinesis 是大量独立的数据流和生成小文件的代码。 Redshift 是一个大型数据库,适用于大型数据段。以一种错过设计目标的方式不匹配这些工具将使它们中的任何一个性能都很差。您需要通过将 S3 批处理到 Redshift 来匹配数据要求。这意味着在单个 COPY 命令中将许多 S3 文件复制到 Redshift。这可以通过清单或 S3 中的“目录”结构来完成。 “从 S3 路径复制所有内容......”这个将数据复制到 Redshift 的过程可以在每个时间间隔(2 或 5 或 10 分钟)运行一次。因此,您希望 Kinesis Lambda 在 S3 中组织数据(或添加到清单),以便可以收集“批次”的 S3 文件以执行 COPY。这样可以一次将大量 S3 文件(它的首选数据大小)带入 Redshift,并且还可以大大减少您的执行 API 调用。

现在,如果您设置了一个非常大的 Kinesis 管道并且数据非常大,则需要考虑另一个数据移动“偏好”。这仅在您每分钟移动大量数据时才重要。这种额外的偏好适用于 S3。 S3 作为对象存储意味着“查找”请求的对象键会占用大量时间。大约 0.5 秒。因此读取一千个 S3 对象将需要 500 个(总共)500 秒的键查找时间。 Redshift 将并行向 S3 发出请求,集群中的每个切片一个,因此其中一些时间是并行的。如果正在读取的文件大小为 1KB,则在 S3 查找完成后,数据的数据传输大约需要 1.25 秒。全部的。这一次也是并行的,但您可以看到查找与传输花费了多少时间。为了从 S3 中获得最大带宽以读取许多文件,这些文件的大小需要为 1GB(根据我的经验,100MB 是可以的)。您可以查看是否要每分钟将数百万个文件从 Kinesis 提取到 Redshift 中,您将需要一个流程来将许多小文件组合成更大的文件,以避免 S3 的这种危险。由于您使用 Lambda 作为 Kinesis 阅读器,我希望您还没有达到这个数据速率,但是如果您希望扩展到非常大的规模,那么关注这个问题是件好事。

仅仅因为工具具有高带宽并不意味着它们可以通过管道连接在一起。带宽有多种样式。

【讨论】:

  • 如果您真正的意思是“实时”(直到秒),那么 OLAP DB 不会提供完整的解决方案。这些对于海量数据来说非常有用,但在“准备”数据方面会产生一些成本,因此可以在这种规模下快速分析它。我之前为客户设置的是一种混合方法,当他们同时需要“实时”和“大量历史”时。首先,我会查看 Kinesis Analytics,看看它是否可以提供您正在寻找的实时分析。它是有限的,所以仔细审查。然后,您可以通过多种方式将 Kinesis Analytics 与 Redshift 合并。或者...
  • Kinesis Analytics 会在数据流经流时查看数据,但如果您可以等待数据在 S3 中生效,那么您可以使用 Redshift Spectrum 在“较旧”时查询“最近”数据数据在 Redshift 中是原生的。这样,只有少量查询的数据在 Spectrum 中,而大部分在 Redshift(本地)表中。然后可以使用视图来组合数据。每个时间间隔(小时、天)的数据都被带入 Redshift,从 Spectrum 查询的数据量减少。
  • 一种新的方法是使用 Redshift 联合查询。最近的数据可能在具有更高(但足够高)数据​​写入率的 RDS Postgres 中。然后可以将“旧”数据移动到 Redshift(每天?)。
  • 我不清楚您的要求。当我使用假设时,请持保留态度。 Athena 非常适合低成本的偶尔查询。这似乎不是您的使用模式,因此我建议单独使用 Redshift 和 Redshift Spectrum 而不是 Athena 来处理更高的工作负载。 Athena 和 Spectrum 都可以在数据写入 S3 后立即访问数据,因此它们的数据时效性相同。如果您的查询率很高,Athena 可能会因为您为每次查询付费而变得昂贵。由于旧数据被带入 Redshift,因此 Spectrum 只有少数数据,因此这种组合速度更快。
  • 将 Redshift Spectrum 数据与 Redshift 原生数据结合起来很简单,因为您只需要创建一个跨越内部和外部表的视图。您查询视图,Redshift 负责合并。由于可能存在一些重叠,因此您的视图需要在视图中包含 WHERE 子句,以确保不会从两者中读取相同的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 2017-05-29
  • 2013-02-16
  • 2014-01-30
相关资源
最近更新 更多