View a markdown version of this page

数据传输疑难解答 - Amazon Kinesis Data Streams

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

数据传输疑难解答

使用本节来解决数据传输的常见问题。

交付停留在 “创建” 状态

当您创建交付时,它将在配置资源时进入创建状态。配置通常在几分钟内完成。如果交付在 CREATING 中停留很长一段时间或过渡到 FAILED,则可能是配置错误造成的。

DescribeChannel致电查看当前状态和状态原因。常见原因包括:

  • IAM 角色 ARN 无效或角色策略中的权限不足。

  • 目标 Amazon S3 存储桶不存在或位于其他区域。

  • 无法解析架构注册表中的 AWS Glue 架构 ARN。

交付处于失败状态

您无法恢复位ChannelStatus于FAILED(退货方DescribeChannel)的配送。从中读取ChannelStatusReason字段DescribeChannel以确定根本原因。修复潜在问题,删除失败的交付,然后使用更正的配置重新创建。

数据新鲜度高

该DataFreshness指标衡量的是最古老的未交付记录的年龄。较高的值表示交付落后于摄取。常见原因:

  • 目标表的分区数过高会增加元数据开销。

  • 许多小提交导致的表元数据增长会降低提交吞吐量。

  • 低流吞吐量加上低新鲜度设置会导致频繁的小规模交付。

解决方案:对于 Apache Iceberg 上的流媒体表,启用 Amazon S3 表维护(压缩和快照到期)以管理元数据增长。对于低吞吐量流,增加该DataFreshnessInSeconds值以允许在每个交付周期中批处理更多数据。

最严格的数据新鲜度设置需要最低的持续数据流吞吐量,这样每个周期都能积累足够的数据,以实现高效传输和在线压缩。如果您的直播产生的吞吐量低于该吞吐量,请使用更高的DataFreshnessInSeconds值。

失败记录大于零

当失败记录指标为非零时(DeliveryToS3.FailedRecordCount对于 Amazon S3 传输或DeliveryToIceberg.FailedRowCount流表传输),记录将发送到死信队列而不是目的地。

对于 Apache Iceberg 上的直播桌:

  • 架构不匹配 — 记录不符合注册的架构。

  • 缺少必填字段 — 不可为空的列在记录中没有值。

  • 不使用 GSR_JSON 格式的 AWS Glue 架构注册表序列化器,生产者必须使用 AWS Glue 架构注册表生成器库。

对于一般用途的 Amazon S3 存储桶:

  • 格式不匹配 — 记录格式与配置的输入格式不匹配。

解决方法:检查死信队列条目以获取详细的错误信息。查看交付 CloudWatch 日志,查看具体的解析或验证错误。修复生产者发送符合要求的记录。

目的地没有显示任何数据

如果交付处于 “活动” 状态,但目的地没有显示任何数据,则最常见的原因是:

  • 权限问题 — IAM 角色无法写入目标。检查 CloudWatch 日志中是否AccessDenied存在错误。

  • 输出密钥前缀不匹配(通用 Amazon S3 存储桶)— 如果您的s3:PutObject权限范围限于前缀arn:aws:s3:::my-bucket/data*,例如,则输出密钥模板生成的密钥必须以开头。data/不匹配会导致每次写入都被拒绝。

  • 缺少表权限(流式传输表)— 当您使用客户管理的 AWS KMS 密钥加密目标表时,请验证服务执行角色除其他s3tables操作之外还包括s3tables:PutTableEncryption在内。没有它,CreateTable成功但表加密失败,永远不会创建表,也不会传送任何数据。

  • 缺少日志记录权限 — 如果服务执行角色缺少logs:CreateLogStream和logs:PutLogEvents,则交付失败不会记录在 CloudWatch 日志中,这可能会使权限问题显示为静默故障。当没有日志时,请先验证日志权限。

  • 创建后没有新数据——交付不会回填流中的现有数据。只有在交付变为 “激活” 之后写入的记录才会被传送。

配送已暂停

当目的地不可用或不兼容时,配送进入暂停状态。常见原因:

  • Apache Iceberg 目标表上的直播表已删除。

  • Amazon S3 存储桶拥有者与预期的账户不匹配(所有权不匹配)。

  • 在目标表中检测到不兼容的分区列。

暂停配送无法恢复。您必须使用有效的目的地配置创建新的交付。

CloudWatch 日志中出现权限被拒绝错误

AccessDenied交付 CloudWatch 日志中的错误表明存在权限问题。常见原因:

  • 创建交付后,IAM 角色策略已修改。

  • Amazon S3 存储桶策略已更改为拒绝该角色的访问。

  • 该角色的信任策略不允许 Kinesis 数据流服务代入该角色。

  • 密 AWS KMS 钥策略拒绝对交付角色进行加密或解密访问。

查看并更正相关政策,然后确认配送已恢复。

我的直播无法配送

流媒体表和 Amazon S3 交付要求 Kinesis 数据流处于 On-Demand 标准或 On-Demand 优势容量模式。如果您的直播使用预置模式,则必须先将其切换到 On-Demand 模式,然后才能创建分发。

架构更改后交付停止

交付不支持架构演变。如果您在创建交付后在 S AWS Glue chema Registry 中更新架构,则使用新架构版本生成的记录可能无法通过验证并被路由到死信队列。

解决方法:在生产者处恢复架构更改,或者删除现有交付并使用更新的架构重新创建。

无法删除直播

ResourceInUseException当直播中有一个或多个活跃的交付时,DeleteStream请求会失败。直播附加交付后,无法将其删除。

解决方法:使用ListChannels(使用流过滤器)列出直播中的交付,使用删除每个分DeleteChannel发,然后删除该流。