问:什么是 Kinesis Streams?

Kinesis Streams 是一种完全托管的流数据服务。您可以将成千上万个来源中的各种类型数据 (比如点击流、应用程序日志和社交媒体) 连续添加到 Kinesis 流中。只需数秒,您的 Kinesis 应用程序即可读取和处理流中的数据。

问:Kinesis Streams 可代我管理哪些内容?

Kinesis Streams 可管理在数据吞吐量层面流式处理您的数据所需的基础设施、存储、网络和配置。对于数据流,您无需担心预置、部署和持续的硬件维护、软件维护或其他服务维护。此外,Kinesis Streams 还可以跨 AWS 地区的三个设施同步复制数据,为您提供高可用性和数据持久性。

问:Kinesis Streams 有什么作用?

Kinesis Streams 可用于从数据创建器快速移出数据,然后不断处理数据。这是因为,它可以在将数据发送到数据存储之前先转换数据、实时提取指标和进行分析,也可以派生更复杂的数据流以供进一步处理。以下是使用 Kinesis Streams 的典型情景:

  • 加速引入日志和数据源:您可以将数据创建器设为在数据生成后立即将数据推送到 Kinesis 流中,无需等待批量处理数据,从而防止因数据创建器出现故障而导致数据丢失。例如,系统和应用程序日志可以连续添加到流中,并能在数秒内得到处理。
  • 实时指标和报告:您可以从 Kinesis 流数据中实时提取指标并生成报告。例如,您的 Kinesis 应用程序可以在数据流入时处理系统和应用程序日志的指标和报告,而无需等待接收批量数据。
  • 实时数据分析:通过 Kinesis Streams,您可以进行实时流数据分析。例如,您可以将点击流添加到 Kinesis 流中,并将 Kinesis 应用程序设为实时进行分析,这样您就可以在数分钟 (而不是数小时或数日) 内获得数据解析。
  • 复杂的流处理:您可以创建 Kinesis 应用程序和数据流的有向无环图 (DAG)。在此情景中,一个或多个 Kinesis 应用程序可将数据添加到另一个 Kinesis 流中,以供进一步处理,从而形成流处理的后续阶段。

问:如何使用 Kinesis Streams?

注册 Amazon Web Services 后,可按以下步骤开始使用 Kinesis Streams:

问:Kinesis Streams 有哪些限制?

通过增加流内分片的数量,可以无限扩展 Kinesis 流的吞吐量。然而,您在使用 Kinesis Streams 时需要注意特定限制:

  • 流中的记录自添加之时起 24 小时内可使用。
  • 一个记录内的数据 Blob 的大小上限 (Base64 编码前的数据负载) 为 1MB。
  • 每个分片每秒最多可支持 1000 个 PUT 记录。

有关其他 API 等级限制的更多信息,请参阅 Kinesis Streams 限制

问:Kinesis Streams 与 Amazon SOS 有何区别?

Kinesis Streams 允许实时处理大数据流。它提供记录排序,以及按多个 Kinesis 应用程序的顺序读取和/或重放记录的功能。Kinesis Client Library (KCL) 能够将给定分区键的所有记录都提供给同一记录处理器,这样就可以更轻松地构建从同一 Kinesis 流读取数据的多个应用程序 (例如,用于执行计数、汇总和筛选)。

Amazon Simple Queue Service (Amazon SQS) 提供可靠且高度可扩展的托管队列,用于存储在计算机之间传输的消息。借助 Amazon SQS,您可以在分布式应用程序组件之间轻松移动数据,并构建单独处理消息的应用程序(带消息级确认/失败语义),如自动工作流。

问:我何时应使用 Kinesis Streams,何时应使用 Amazon SQS?

我们建议将 Kinesis Streams 用于具有类似以下要求的使用案例:

  • 将相关记录路由到同一记录处理器(如同流式处理 MapReduce)。例如,当给定键的所有记录都被路由到同一记录处理器时,计数和汇总将更加简单。
  • 记录排序。例如,您希望将日志数据从应用程序主机传输到处理/归档主机,同时保持日志报表的顺序不变。
  • 多个应用程序能够同时使用同一个流。例如,您让一个应用程序更新实时控制面板,并让另一个应用程序归档数据。您希望这两个应用程序分别同时使用同一个流中的数据。
  • 在数小时后能够以同一顺序使用记录。例如,您拥有一个账单应用程序,而审计应用程序晚账单应用程序数小时运行。由于 Kinesis Streams 最多可存储数据 24 小时,因此您最多可以在账单应用程序运行后的 24 小时内运行审计应用程序。

我们建议您对具有以下类似要求的使用案例使用 Amazon SQS:

  • 消息收发语义(如消息级确认/失败)和可见性超时。例如,您拥有一个工作项目队列,同时希望单独跟踪每个项目的成功完成情况。Amazon SQS 跟踪确认/失败情况,因此应用程序无需保留持续的检查点/光标。在配置的可见性超时后,Amazon SQS 会删除已确认的消息,并重新提交失败的消息。
  • 单个消息延迟。例如,您拥有一个作业队列,同时需要安排带延迟的各个作业。通过 Amazon SQS,您可将各个消息配置为具有最多 15 分钟的延迟。
  • 动态增加读取时间的并发性/吞吐量。例如,您拥有一个工作队列,同时希望添加更多阅读器,直到储备清除。通过 Kinesis Streams,您可以扩展到足够数量的分片 (但请注意,您需要提前预置足够的分片)。
  • 充分利用 Amazon SQS 的透明扩展功能。例如,由于业务的偶尔负载尖峰或自然增长,您会缓存请求和负载变化。由于每个缓存的请求可以单独处理,因此 Amazon SQS 可以透明扩展以处理负载,无需提供任何配置说明。

:什么是分片?

分片是 Kinesis 流的基本吞吐量单位。一个分片的吞吐量为每秒输入 1 MB 数据和每秒输出 2 MB 数据,并且每秒最多可支持 1000 个 PUT 记录。您需要在创建流时指定所需的分片数量。例如,您可以创建具有两个分片的流。此流的吞吐量为每秒输入 2 MB 数据和每秒输出 4MB 数据,并且每秒最多支持 2000 个 PUT 记录。通过重新分片,您可以根据数据吞吐量的变化,在流中动态添加分片或从中移除分片。

问:什么是记录?

记录是存储在 Kinesis 流中的数据单元。记录由序列号分区键和数据 Blob 组成。数据 Blob 是数据创建器向流中添加的相关数据,大小上限(Base64 编码前的数据负载)为 1 MB。

问:什么是分区键?

分区键用于分离出记录,并将其路由至流的不同分片。分区键由您的数据创建器在向 Kinesis 流时指定。例如,假设一个流有两个分片 (分片 1 和分片 2)。您可以将数据创建器配置为使用两个分区键 (键 A 和键 B),将所有带键 A 的记录添加到分片 1 中,并将所有带键 B 的记录添加到分片 2 中。

问:什么是序列号?

序列号是各个记录的唯一标识符。当数据创建器调用 PutRecordPutRecords 操作向 Kinesis 流添加数据时,Kinesis Streams 会分配序列号。同一分区键对应的序列号通常会随着时间的推移而逐渐增加;各个 PutRecordPutRecords 请求之间的间隔时间越长,序列号就会越大。

 

 

 

 

 


问:如何创建 Kinesis 流?

注册 Amazon Web Services 后,您可以通过 Kinesis Streams 管理控制台CreateStream 操作创建 Kinesis 流。

问:如何确定我的 Kinesis 流的吞吐量?

Kinesis 流的吞吐量由流内的分片数量而定。请按照下列步骤操作,估计流需要的初始分片数量。请注意,通过重新分片功能,您可以动态调整流内的分片数量。

  1. 估计写入流的记录的平均大小,以 KB 为单位,四舍五入为最接近的 1 KB。(average_data_size_in_KB)
  2. 估计每秒写入流的记录数量。(number_of_records_per_second)
  3. 确定分别同时使用流数据的 Kinesis 应用程序的数量。(number_of_consumers)
  4. 计算传入写入带宽 (KB) (incoming_write_bandwidth_in_KB),这相当于 average_data_size_in_KB 乘以 number_of_records_per_seconds
  5. 计算传出读取带宽 (KB) (outgoing_read_bandwidth_in_KB),这相当于 incoming_write_bandwidth_in_KB 乘以 number_of_consumers

然后,您可以使用以下公式计算数据流需要的初始分片数量 (number_of_shards):

number_of_shards = max (incoming_write_bandwidth_in_KB/1000, outgoing_read_bandwidth_in_KB/2000)

问:我可为 Kinesis 流请求的最小吞吐量是多少?

Kinesis 流的吞吐量按分片单位扩展。单个分片是流的最小吞吐量,即每秒输入的数据为 1MB,每秒输出的数据 2MB。

问:我可为 Kinesis 流请求的最大吞吐量是多少?

Kinesis 流的吞吐量可无限扩展。默认情况下,每个账户可为每个地区配置 10 个分片。您可以使用 Kinesis Streams 限制表单为单个地区请求超过 10 个分片。

问:记录大小会对我的 Kinesis 流的吞吐量造成什么影响?

分片提供 1 MB/秒的数据输入速率,同时每秒最多支持 1000 个 PUT 记录。因此,如果记录大小不到 1 KB,则分片的实际数据输入速率将小于 1 MB/秒,受每秒 PUT 记录数上限的限制。

 

 

 

 


:如何向我的 Kinesis 流添加数据?

您可以通过 PutRecordPutRecords 操作或 Kinesis Producer Library (KPL) 将数据添加到 Kinesis 流中。

问:PutRecord 和 PutRecords 之间有何区别?

PutRecord 操作可以在一次 API 调用中添加一个数据记录,而 PutRecords 操作则可以在一次 API 调用中添加多个数据记录。更多有关 PutRecordPutRecords 操作的信息,请参加 PutRecord  PutRecords

问:Kinesis Producer Library (KPL) 是什么?

Kinesis Producer Library (KPL) 是一种易于使用且高度可配置的库,可帮助您向 Kinesis 流中添加数据。KPL 具有简单可靠的异步接口,这样您就可以快速实现非常高的创建器吞吐量,同时最大限度地减少客户端资源的使用。

问:我可以使用什么编程语言或平台访问 Kinesis Streams API?

Amazon Web Services 软件开发工具包中包含 Kinesis Streams API。要获取 Amazon Web Services 软件开发工具包的编程语言或平台列表,请参阅适用于 Amazon Web Services 的工具

问:Kinesis Producer Library (KPL) 采用什么编程语言?

Kinesis Producer Library (KPL) 的核心是采用 C++ 模块构建的,并可以使用最新的 C++ 编译器将其编译为在任意平台上运行。此库目前采用 Java 接口。我们期待添加对其他编程语言的支持。

 

问:如果数据创建器向流中添加数据时超出 Kinesis 流的容量限制,会怎么样?

Kinesis 流的容量限制由流内的分片数量而定。数据吞吐量或 PUT 记录数量可能会导致超出容量限制。超过容量限制后,输入数据调用将以 ProvisionedThroughputExceeded 例外被拒绝。如果这是因流的输入数据速率的临时增加所致,则使用数据创建器重试会最终完成请求。如果这是因流的输入数据速率的持续增加所致,则应增加流内的分片数量,从而为输入数据调用提供持续成功所需的足够容量。在这两种情况下,Amazon CloudWatch 指标都能让您了解数据流输入数据速率的变化,以及 ProvisionedThroughputExceeded 例外的出现。

问:在 PutRecordPutRecords 调用期间,什么数据会计入 Kinesis 流的数据吞吐量?

数据 Blob分区键和流名称是 PutRecordPutRecords 调用的必要参数。数据 Blob 的大小 (进行 Base64 编码之前) 和分区键会计入 Kinesis 流的数据吞吐量 (由流内的分片数量而定)。


:什么是 Kinesis 应用程序?

Kinesis 应用程序是一种能读取和处理 Kinesis 流中数据的数据使用器。您可以使用 Kinesis Streams APIKinesis Client Library (KCL) 构建应用程序。

问:什么是 Kinesis Client Library (KCL)?

适用于 Java | Python | Ruby | Node.js | .NET 的 Kinesis Client Library (KCL) 是一种预建库,可帮助您轻松构建 Kinesis 应用程序,用于读取和处理 Kinesis 流中的数据。KCL 可以处理各种复杂问题,如适应流量的变化、平衡流数据负载、协调分布式服务和以容错方式处理数据,从而使您能够在专注业务逻辑的同时构建应用程序。

问:Kinesis Connector Library 是什么?

Kinesis Connector Library 是一个预建库,可帮助您轻松将 Kinesis Streams 与其他 AWS 服务和第三方工具集成。使用 Kinesis Connector Library 时,也需要使用适用于 Java | Python | Ruby | Node.js | .NET 的 Kinesis Client Library (KCL)。此库最新版本中的连接器可方便您与 Amazon DynamoDBAmazon S3Elasticsearch 集成。此库还包括各种类型的示例连接器,外加可运行示例的 Apache Ant 生成文件。

问:Kinesis Storm Spout 是什么?

Kinesis Storm Spout 是一个预建库,可帮助您轻松将 Kinesis Streams 与 Apache Storm 集成。最新版本的 Kinesis Storm Spout 可从 Kinesis 流中提取数据,然后将其作为元组发送出去。您将此 Spout 添加到 Storm 拓扑中,以将 Kinesis Streams 作为一种可靠、可扩展、流捕获、存储以及重播服务来使用。

问:Kinesis Client Library (KCL)、Kinesis Connector Library 和 Kinesis Storm Spout 可使用什么编程语言?

目前,Kinesis Client Library (KCL) 可使用 JavaPythonRubyNode.js.NETKinesis Connector LibraryKinesis Storm Spout 当前可使用 Java。我们期待添加对其他编程语言的支持。

问:我是否必须对我的 Kinesis 应用程序使用 Kinesis Client Library (KCL)?

不是,您还可以使用 Kinesis Streams API 构建 Kinesis 应用程序。但是,我们建议您使用适用于 Java | Python | Ruby | Node.js | .NET 的 Kinesis Client Library (KCL) (如果适用),因为它会执行与分布式流处理相关联的繁重任务,可以帮助您更加高效地开发应用程序。

问:Kinesis Client Library (KCL) 如何与 Kinesis 应用程序交互?

适用于 Java | Python | Ruby | Node.js | .NET 的 Kinesis Client Library (KCL) 作为 Kinesis Streams 和 Kinesis 应用程序之间的中间程序。KCL 使用 IRecordProcessor 接口与您的应用程序进行通信。应用程序实施此接口,同时 KCL 使用此接口中的方法调用应用程序代码。

有关如何使用 KCL 构建应用程序的更多信息,请参阅使用 Kinesis Client Library 为 Kinesis Streams 开发消费者应用程序

:什么是 Kinesis Client Library (KCL) 生成的工作程序和记录处理器?

Kinesis 应用程序可以有多个应用程序实例,而工作程序则是映射到各个应用程序实例的处理单元。记录处理器是处理 Kinesis 流内分片的数据的处理单元。一个工作程序可映射到一个或多个记录处理器。一个记录处理器映射到一个分片,并从该分片处理记录

启动时,应用程序会调用适用于 Java | Python | Ruby | Node.js | .NET 的 Kinesis Client Library (KCL),以实例化工作程序。此调用将为应用程序提供带配置信息的 KCL,如流名称和 AWS 凭证。此调用还会传输对 IRecordProcessorFactory 实施的引用。必要时,KCL 使用此工厂来新建记录处理器,从而处理流中的数据。KCL 使用 IRecordProcessor 接口与这些记录处理器通信。

问:Kinesis Client Library (KCL) 如何持续跟踪 Kinesis 应用程序正在处理的数据记录?

适用于 Java | Python | Ruby | Node.js | .NET 的 Kinesis Client Library (KCL) 会自动为每个 Kinesis 应用程序创建一个 Amazon DynamoDB 表,以跟踪和维护状态信息,如重新分片事件和序列号检查点。DynamoDB 表与应用程序共用同一名称,因此您需要确保您的应用程序名称不与同一地区内同一账户下的任何现有 DynamoDB 表冲突。

假设与同一应用程序名称相关联的所有工作程序在同一 Kinesis 流中一起运行。如果您运行同一应用程序代码的其他实例,但使用不同的应用程序名称,则 KCL 会将第二个实例视为也在同一流上运行的完全独立应用程序。

请注意,除了与 Kinesis Streams 关联的成本之外,还将对账户收取与 Amazon DynamoDB 表关联的费用。

有关 KCL 如何跟踪应用程序状态的更多信息,请参阅跟踪 Kinesis 应用程序状态

问:我如何使用 Kinesis Client Library (KCL) 自动扩展我的 Kinesis 应用程序的处理容量?

您可为您的 Kinesis 应用程序创建多个实例,并让这些应用程序实例与属于 Auto Scaling 组的一组 Amazon EC2 实例交叉运行。尽管处理需求增长,但是运行您应用程序实例的 Amazon EC2 实例将自动实例化。适用于 Java | Python | Ruby | Node.js | .NET 的 Kinesis Client Library (KCL) 将为此新实例生成工作程序,并将记录处理器从超载的现有实例自动移动到此新实例。

问:为何我的 Kinesis 流内有数据,而 GetRecords 调用却返回空结果?

一个可能的原因是,当前分片迭代器指定的位置没有任何记录。即使您使用 TRIM_HORIZON 作为分片迭代器类型,也会发生这种情况。Kinesis 流表示连续的数据流。您应在一个循环中调用 GetRecords 操作,记录将在分片迭代器前进到记录存储的位置时返回。

 

问:如果 Kinesis 应用程序从流读取数据时超出 Kinesis 流的容量限制,会怎么样?

Kinesis 流的容量限制由流内的分片数量而定。数据吞吐量或读取数据调用的数量可能会导致超出容量限制。超过容量限制时,读取数据调用将以 ProvisionedThroughputExceeded 例外被拒绝。如果这是因流的输出数据速率的临时增加所致,则使用 Kinesis 应用程序重试会最终完成请求。如果这是因流的输出数据速率的持续增加所致,则应增加流内的分片数量,从而为读取数据调用提供持续成功所需的足够容量。在这两种情况下,Amazon CloudWatch 指标都可让您了解数据流输出数据速率的变化,以及 ProvisionedThroughputExceeded 例外的出现。


问:如何更改 Kinesis 流的吞吐量?

通过调整流内的分片数量 (重新分片),您可以更改 Kinesis 流的吞吐量。重新分片操作分为两种:分片拆分和分片合并。在分片拆分中,一个分片被分为两个分片,这会增加流的吞吐量。在分片合并中,两个分片被合并为一个分片,这会减少流的吞吐量。有关 Kinesis Streams 重新分片的更多信息,请参阅对流进行重新分片

问:我多久可以更改一次 Kinesis 流的吞吐量?更改一次需要多长时间?

分片拆分或分片合并等重新分片操作需要几秒钟。一次只能执行一个重新分片操作。因此,对于仅有一个分片的 Kinesis 流,拆分一个分片即可使吞吐量在几秒钟内翻倍。对于具有 1000 个分片的流,拆分 1000 个分片以使吞吐量翻倍则需 30000 秒(8.3 小时)。当需要额外吞吐量时,我们建议您提前增加流的吞吐量。

问:在我通过重新分区更改 Kinesis 流的吞吐量后,Kinesis Streams 是否仍然可用?

可以。执行重新分片以更改流的吞吐量期间,您可以继续添加数据,并读取 Kinesis 流中的数据。

问:如何监控我的 Kinesis 流的运行情况和性能?

Kinesis Streams 管理控制台会显示关键操作和性能指标,如 Kinesis 流的数据输入和输出的吞吐量。Kinesis Streams 还与 Amazon CloudWatch 集成,以便您可为流收集、查看和分析 CloudWatch 指标。有关 Kinesis Streams 指标的更多信息,请参阅使用 Amazon CloudWatch 监控 Kinesis Streams

问:如何管理和控制对 Kinesis 流的访问权限?

Kinesis Streams 与 AWS Identity and Access Management (IAM) 集成,让您能够安全控制对 AWS 服务和用户资源的访问权限。例如,您可以创建一个策略,仅允许特定用户或组向 Kinesis 流添加数据。有关流访问管理和控制的更多信息,请参阅使用 IAM 控制对 Kinesis Streams 资源的访问权限

问:如何记录为进行安全分析和运行故障排除而对 Kinesis 流进行的 API 调用?

Kinesis Streams 与 Amazon CloudTrail 集成,后者是记录您账户的 AWS API 调用并向您提供日志文件的服务。有关 API 调用日志记录和支持的 Kinesis Streams API 操作列表的更多信息,请参阅使用 Amazon CloudTrail 记录 Kinesis Streams API 调用

问:如何高效地管理 Kinesis 流以及与这些流相关的成本?

借助 Kinesis Streams,您可以标记 Kinesis 流,从而简化资源和成本的管理。标记是用户定义的标签,以键值对的形式表示,有助于组织 AWS 资源。例如,您可以使用成本中心标记流,从而基于成本中心对 Kinesis Streams 成本进行分类和跟踪。有关 Kinesis Streams 标签的更多信息,请参阅标记您的 Kinesis Streams


问:Kinesis Streams 如何收费?

Kinesis Streams 使用简单的按需付费定价结构。既无前期成本也没有最低费用,您只需为使用的资源付费。Kinesis Streams 成本涉及两个方面:

  • 每小时分片成本由 Kinesis 流内的分片数量而定。
  • PUT 负载单元成本由数据创建器向流中添加的 25KB 负载单元的数量而定。

有关 Kinesis Streams 成本的更多信息,请登录账单控制台

问:用 PutRecords 操作取代 PutRecord 操作后,我的 PUT 负载单元成本是否会发生变化?

PUT 负载单元费用是根据向 Kinesis 流中添加的 25KB 负载单元的数量计算得出的。无论使用的是 PutRecords 操作还是 PutRecord 操作,PUT 负载单元成本都不变。

问:除了 Kinesis Streams 费用之外,使用 Kinesis Streams 时是否还存在任何其他费用?

如果使用 Amazon EC2 运行 Kinesis 应用程序,则除了 Kinesis Streams 费用,还将对 Amazon EC2 资源收取费用。

Kinesis Client Library (KCL) 使用 Amazon DynamoDB 表跟踪记录处理的状态信息。如果为您的 Kinesis 应用程序使用 KCL,则除了 Kinesis Streams 费用,还将对 Amazon DynamoDB 资源收取费用。

请注意,以上是两种常见情况,并非所有情况。