ConsumeKinesis

文档中心 › 组件索引 › ConsumeKinesis

ConsumeKinesis Processor

类型全限定名:cn.org.acal.lynxus.processors.aws.kinesis.ConsumeKinesis

所属 Bundle:cn.org.acal.lynxus:lynxus-aws-kinesis-nar:2.11.8

描述

从 Amazon Kinesis 数据流中消费记录。使用基于 DynamoDB 的检查点机制 以在重启后可靠恢复。 注意:当分片被拆分或多个分片被合并时,此处理器将同时从 子分片和父分片中消费。它不会等待父分片完全消费完毕 再读取子分片,因此在拆分或合并边界处不保证记录的顺序。

标签

amazonawskinesisconsumestreamrecord

属性

下表中,加粗的属性为必填项;其余为可选项。表格同时标注默认值、是否支持表达式语言,以及是否为敏感属性(值会被加密)。

名称默认值可选值描述
Stream Name要使用的 Kinesis 流的名称。
Application NameKinesis 应用程序的名称。用作检查点存储的 DynamoDB 表名。\ 当消费者类型为增强扇出时,此值也用作注册消费者 \ 名称。此值对流应该是唯一的。
AWS Credentials Provider Service控制器服务 API:
AwsCredentialsProviderService
cn.org.acal.lynxus-lynxus-aws-service-api-nar-2.11.8
用于获取 AWS 凭证提供程序的Controller Service。
Regionus-west-2
  • Africa (Cape Town) — AWS Region Code : af-south-1
  • Asia Pacific (Hong Kong) — AWS Region Code : ap-east-1
  • Asia Pacific (Hyderabad) — AWS Region Code : ap-south-2
  • Asia Pacific (Jakarta) — AWS Region Code : ap-southeast-3
  • Asia Pacific (Malaysia) — AWS Region Code : ap-southeast-5
  • Asia Pacific (Melbourne) — AWS Region Code : ap-southeast-4
  • Asia Pacific (Mumbai) — AWS Region Code : ap-south-1
  • Asia Pacific (New Zealand) — AWS Region Code : ap-southeast-6
  • Asia Pacific (Osaka) — AWS Region Code : ap-northeast-3
  • Asia Pacific (Seoul) — AWS Region Code : ap-northeast-2
  • Asia Pacific (Singapore) — AWS Region Code : ap-southeast-1
  • Asia Pacific (Sydney) — AWS Region Code : ap-southeast-2
  • Asia Pacific (Taipei) — AWS Region Code : ap-east-2
  • Asia Pacific (Thailand) — AWS Region Code : ap-southeast-7
  • Asia Pacific (Tokyo) — AWS Region Code : ap-northeast-1
  • AWS European Sovereign Cloud (Germany) — AWS Region Code : eusc-de-east-1
  • aws global region — AWS Region Code : aws-global
  • AWS GovCloud (US-East) — AWS Region Code : us-gov-east-1
  • AWS GovCloud (US-West) — AWS Region Code : us-gov-west-1
  • aws-cn global region — AWS Region Code : aws-cn-global
  • aws-iso global region — AWS Region Code : aws-iso-global
  • aws-iso-b global region — AWS Region Code : aws-iso-b-global
  • aws-iso-e global region — AWS Region Code : aws-iso-e-global
  • aws-iso-f global region — AWS Region Code : aws-iso-f-global
  • aws-us-gov global region — AWS Region Code : aws-us-gov-global
  • Canada (Central) — AWS Region Code : ca-central-1
  • Canada West (Calgary) — AWS Region Code : ca-west-1
  • China (Beijing) — AWS Region Code : cn-north-1
  • China (Ningxia) — AWS Region Code : cn-northwest-1
  • EU ISOE West — AWS Region Code : eu-isoe-west-1
  • Europe (Frankfurt) — AWS Region Code : eu-central-1
  • Europe (Ireland) — AWS Region Code : eu-west-1
  • Europe (London) — AWS Region Code : eu-west-2
  • Europe (Milan) — AWS Region Code : eu-south-1
  • Europe (Paris) — AWS Region Code : eu-west-3
  • Europe (Spain) — AWS Region Code : eu-south-2
  • Europe (Stockholm) — AWS Region Code : eu-north-1
  • Europe (Zurich) — AWS Region Code : eu-central-2
  • Israel (Tel Aviv) — AWS Region Code : il-central-1
  • Mexico (Central) — AWS Region Code : mx-central-1
  • Middle East (Bahrain) — AWS Region Code : me-south-1
  • Middle East (UAE) — AWS Region Code : me-central-1
  • South America (Sao Paulo) — AWS Region Code : sa-east-1
  • US East (N. Virginia) — AWS Region Code : us-east-1
  • US East (Ohio) — AWS Region Code : us-east-2
  • US ISO East — AWS Region Code : us-iso-east-1
  • US ISO WEST — AWS Region Code : us-iso-west-1
  • US ISOB East (Ohio) — AWS Region Code : us-isob-east-1
  • US ISOB West — AWS Region Code : us-isob-west-1
  • US ISOF EAST — AWS Region Code : us-isof-east-1
  • US ISOF SOUTH — AWS Region Code : us-isof-south-1
  • US West (N. California) — AWS Region Code : us-west-1
  • US West (Oregon) — AWS Region Code : us-west-2
  • Use Custom Region — 用户定义的区域,可以是非 AWS 区域,和/或来自表达式语言(Expression Language)
服务所在的 AWS 区域
Custom Region自定义区域,例如 AWS 兼容服务提供商的区域
支持表达式语言:是(仅使用环境/系统变量求值)
Consumer TypeENHANCED_FAN_OUT
  • Shared Throughput — 消费者与其他消费者共享读取吞吐量限制
  • Enhanced Fan-Out — 消费者被授予具有较低延迟的专用读取吞吐量
从 Amazon Kinesis 流读取记录的策略。
Processing StrategyFLOW_FILE
  • FLOW_FILE — 为每个消费的 Kinesis Record 写入一个 FlowFile
  • LINE_DELIMITED — 写入一个 FlowFile,包含多个以行分隔符分隔的已消费 Kinesis Records
  • RECORD — 写入一个 FlowFile,包含多个使用 Record Reader 和 Record Writer 处理的已消费 Kinesis Records
  • DEMARCATOR — 写入一个 FlowFile,包含多个以可配置的分隔符(demarcator)分隔的已消费 Kinesis Records
处理 Kinesis Records 并将序列化输出写入 FlowFiles 的策略。
Record Reader控制器服务 API:
RecordReaderFactory
cn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8
用于解析从 Kinesis 接收的数据的Record Reader。
Record Writer控制器服务 API:
RecordSetWriterFactory
cn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8
用于序列化记录的Record Writer。
Output StrategyUSE_VALUE
  • Use Content as Value — 仅将 Kinesis Record 值写入 FlowFile 记录。
  • Use Wrapper — 将 Kinesis Record 值和元数据写入 FlowFile 记录。
  • Inject Metadata — 将 Kinesis Record 值写入 FlowFile 记录并添加包含元数据的子记录。
用于将 Kinesis 记录输出到 FlowFile 记录的格式。
Message Demarcator指定当处理策略为 DEMARCATOR 时用于在单个 FlowFile 中分隔多个 Kinesis 消息的字符串(解释为 UTF-8)。
Initial Stream PositionTRIM_HORIZON
  • Trim Horizon — 从分片中最后一条未修剪的记录开始读取。
  • Latest — 从分片中最新记录之后的位置开始读取。
  • At Timestamp — 开始读取具有指定时间戳的记录。
处理器应开始读取的流中的位置。
Stream Position Timestamp流中开始读取 Kinesis 记录的时间戳位置。 必须采用 ISO 8601 格式。
Max Records Per Request100每个 GetRecords 调用检索的最大记录数。 最大值为 10,000。
Max Batch Duration5 sec在提交会话和检查点之前,在单次调用中花费消费记录的最长时间。
Max Batch Size10 MB在提交会话和检查点之前,在单次调用中要消费的最大数据量。
Endpoint Override URLKinesis 和 DynamoDB 客户端的可选端点覆盖 URL。
Proxy Configuration Service控制器服务 API:
ProxyConfigurationService
cn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8
指定代理配置 Controller Service 来代理网络请求。

关系 (Relationships)

名称描述自动终止
success从 Kinesis 成功读取并解析记录时创建的 FlowFiles否

写入的 FlowFile 属性

名称描述
aws.kinesis.stream.name从中读取记录的 Kinesis Stream 的名称
aws.kinesis.shard.id从中读取记录的分片 ID
aws.kinesis.partition.keyFlowFile 中最后一个 Kinesis 记录的分区键
aws.kinesis.first.sequence.numberFlowFile 中第一个 Kinesis 记录的序列号
aws.kinesis.first.subsequence.numberFlowFile 中第一个 Kinesis 记录的子序列号
aws.kinesis.last.sequence.numberFlowFile 中最后一个 Kinesis 记录的序列号
aws.kinesis.last.subsequence.numberFlowFile 中最后一个 Kinesis 记录的子序列号
aws.kinesis.approximate.arrival.timestamp.ms与 Kinesis 记录或 FlowFile 中的记录关联的大致到达时间戳
mime.type将 mime.type 属性设置为Record Writer指定的 MIME 类型(如果已配置)
record.count写入 FlowFile 的记录数
record.error.messageRecord Reader或Record Writer遇到错误消息(如果已配置)
kinesis.millis.behind我们落后流尾有多远,以毫秒为单位

状态管理

该组件不存储状态。

受限 (Restricted)

该组件不受限。

输入要求

该组件不允许有传入连接。

系统资源考量

资源描述
CPUThe processor uses additional CPU resources when consuming data from Kinesis.
NETWORKThe processor will continually poll for new Records.
MEMORYRecords are fetched from Kinesis in the background and buffered in memory until they can be written to FlowFiles. Up to 200 fetch responses may be buffered per shard for both Shared Throughput and Enhanced Fan-Out. Each Shared Throughput response can contain up to the value of 'Max Records Per Request' records (default 100) and up to 10 MB, so the theoretical maximum is 20,000 records or approximately 2 GB per shard at default settings. Each Enhanced Fan-Out push event can hold up to roughly 2 MB, for a theoretical maximum of approximately 400 MB per shard. In practice the buffer is typically much smaller because fetch threads block when the queue is full and most responses are well below the maximum size.

详细说明

ConsumeKinesis

ConsumeKinesis 所需的 IAM 权限

必须为 AWS Credentials Provider Service 中配置的 IAM 角色或用户添加 以下权限。

仅当 Metrics Publishing 设为 CloudWatch 时才需要 CloudWatch 权限。

服务 操作 资源(ARN) 用途
Amazon Kinesis Data Streams DescribeStream
DescribeStreamSummary
RegisterStreamConsumer
ConsumeKinesis 将处理数据的 Kinesis 数据流。
arn:aws:kinesis:{Region}:{Account}:stream/{Stream Name}
在尝试读取记录之前,消费者会检查数据流是否存在、是否处于活动状态、以及分片是否包含在数据流中。向分片注册消费者。
Amazon Kinesis Data Streams GetRecords
GetShardIterator
ListShards
ConsumeKinesis 将处理数据的 Kinesis 数据流。
arn:aws:kinesis:{Region}:{Account}:stream/{Stream Name}
从分片读取记录。
Amazon Kinesis Data Streams SubscribeToShard
DescribeStreamConsumer
ConsumeKinesis 将处理数据的 Kinesis 数据流。仅在使用增强型扇出(EFO)消费者时添加此操作。
arn:aws:kinesis:{Region}:{Account}:stream/{Stream Name}/consumer/*
为增强型扇出(EFO)消费者订阅分片。
Amazon DynamoDB CreateTable
DescribeTable
UpdateTable
Scan
GetItem
PutItem
UpdateItem
DeleteItem
租约表(ConsumeKinesis 在 DynamoDB 中创建的元数据表)。
arn:aws:dynamodb:{Region}:{Account}:table/{Application Name}
ConsumeKinesis 管理在 DynamoDB 中创建的租约表需要这些操作。
Amazon DynamoDB CreateTable
DescribeTable
Scan
GetItem
PutItem
UpdateItem
DeleteItem
工作线程指标和协调器状态表(ConsumeKinesis 在 DynamoDB 中创建的元数据表)。
arn:aws:dynamodb:{Region}:{Account}:table/{Application Name}-WorkerMetricStats
arn:aws:dynamodb:{Region}:{Account}:table/{Application Name}-CoordinatorState
ConsumeKinesis 管理 DynamoDB 中的工作线程指标和协调器状态元数据表需要这些操作。
Amazon DynamoDB Query 租约表上的全局二级索引。
arn:aws:dynamodb:{Region}:{Account}:table/{Application Name}/index/*
ConsumeKinesis 读取在 DynamoDB 中创建的租约表的全局二级索引需要此操作。
Amazon CloudWatch PutMetricData * 向 CloudWatch 上传用于监控应用的指标。使用星号(*)是因为 CloudWatch 中没有 PutMetricData 操作所针对的特定资源。

以下是 ConsumeKinesis 的示例策略文档。

{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kinesis:DescribeStream",
                "kinesis:DescribeStreamSummary",
                "kinesis:RegisterStreamConsumer",
                "kinesis:GetRecords",
                "kinesis:GetShardIterator",
                "kinesis:ListShards"
            ],
            "Resource": [
                "arn:aws:kinesis:{Region}:{Account}:stream/{Stream Name}"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "kinesis:SubscribeToShard",
                "kinesis:DescribeStreamConsumer"
            ],
            "Resource": [
                "arn:aws:kinesis:{Region}:{Account}:stream/{Stream Name}/consumer/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:CreateTable",
                "dynamodb:DescribeTable",
                "dynamodb:UpdateTable",
                "dynamodb:GetItem",
                "dynamodb:UpdateItem",
                "dynamodb:PutItem",
                "dynamodb:DeleteItem",
                "dynamodb:Scan"
            ],
            "Resource": [
                "arn:aws:dynamodb:{Region}:{Account}:table/{Application Name}"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:CreateTable",
                "dynamodb:DescribeTable",
                "dynamodb:GetItem",
                "dynamodb:UpdateItem",
                "dynamodb:PutItem",
                "dynamodb:DeleteItem",
                "dynamodb:Scan"
            ],
            "Resource": [
                "arn:aws:dynamodb:{Region}:{Account}:table/{Application Name}-WorkerMetricStats",
                "arn:aws:dynamodb:{Region}:{Account}:table/{Application Name}-CoordinatorState"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:Query"
            ],
            "Resource": [
                "arn:aws:dynamodb:{Region}:{Account}:table/{Application Name}/index/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricData"
            ],
            "Resource": "*"
        }
    ]
}

注意: 请把 ARN 中的 "{Region}"、"{Account}"、"{Stream Name}" 和 "{Application Name}" 分别替换为你的 AWS 区域、AWS 账号、Kinesis 数据流 名称,以及 ConsumeKinesis 的 Application Name 属性。

消费者类型

不同消费者类型的对比(引自 Amazon Kinesis Streams 文档):

特性 无增强型扇出的共享吞吐量消费者 增强型扇出消费者
读取吞吐量 每个分片固定总计 2 MB/秒。如果有多个消费者从同一分片读取,它们共享这一吞吐量,从分片获得的吞吐量总和不超过 2 MB/秒。 随消费者注册使用增强型扇出而扩展。每个注册使用增强型扇出的消费者在每个分片上独立获得最高 2 MB/秒 的读取吞吐量,与其他消费者无关。
消息传播延迟 如果只有一个消费者从流中读取,平均约 200 毫秒;有五个消费者时,平均值升至约 1000 毫秒。 无论是一个还是五个消费者,通常平均 70 毫秒。
成本 不适用 存在数据检索成本和消费者-分片小时成本。更多信息参见 Amazon Kinesis Data Streams 定价。

记录处理

当 Processing Strategy 属性设为 RECORD 时,ConsumeKinesis 以 Record 模式运行。该模式下,Processor 使用配置的 Record Reader 从 Kinesis 流读取记录,并使用配置的 Record Writer 写入 FlowFile。

Processor 会尝试把相同 schema 的多条记录批量放入单个 FlowFile, 以优化创建的 FlowFile 数量。

Schema 变更

ConsumeKinesis 支持动态变化的 Kinesis 记录 schema。当遇到带有新 schema 的记录时,当前打开的 FlowFile 会被关闭,并为新 schema 创建 新的 FlowFile。得益于此,即使记录 schema 发生变化,该 Processor 也能保持单个 Shard 内的记录顺序。

请注意,该 Processor 依赖 Record Reader 为每条记录提供正确的 schema。使用带 schema 推断的 Reader 可能产生大量不同的 schema, 导致过度创建 FlowFile。如果关注性能,建议使用带预定义 schema 或 schema registry 的 Reader。

输出策略

该 Processor 通过 Output Strategy 属性提供多种把 Kinesis 记录 转换为 FlowFile 的策略:

  • Use Content as Value(默认)只把 Kinesis 记录的值写入 FlowFile。
  • Use Wrapper 把 Kinesis Record 的值和元数据写入 FlowFile 记录的独立字段。
  • Inject Metadata 把 Kinesis Record 的值写入 FlowFile 记录,并为其添加一个包含元数据的子记录。

写入的元数据包含以下字段:

  • stream: 记录所来源的 Kinesis 流的名称。
  • shardId: 记录所来源分片的标识符。
  • sequenceNumber: 记录的序列号。
  • subSequenceNumber: 记录的子序列号,在多个较小记录聚合为单个 Kinesis 记录时使用。如果记录不属于批次,该值为 0。
  • shardedSequenceNumber: 序列号和子序列号的组合。可用于在分片内唯一标识一条记录。
  • partitionKey: 记录的分区键。
  • approximateArrival: 记录的近似到达时间戳(自纪元以来的毫秒数)。

选择 Use Wrapper 时使用的记录 schema 如下(Avro 格式):

{
  "type": "record",
  "name": "lynxusRecord",
  "namespace": "cn.org.acal.lynxus",
  "fields": [
    {
      "name": "value",
      "type": [
        {
          < 由 Record Reader 为 Kinesis 消息确定的字段 >
        },
        "null"
      ]
    },
    {
      "name": "kinesisMetadata",
      "type": [
        {
          "type": "record",
          "name": "metadataType",
          "fields": [
            { "name": "stream", "type": ["string", "null"] },
            { "name": "shardId", "type": ["string", "null"] },
            { "name": "sequenceNumber", "type": ["string", "null"] },
            { "name": "subSequenceNumber", "type": ["long", "null"] },
            { "name": "shardedSequenceNumber", "type": ["string", "null"] },
            { "name": "partitionKey", "type": ["string", "null"] },
            { "name": "approximateArrival", "type": [ { "type": "long", "logicalType": "timestamp-millis" }, "null" ] }
          ]
        },
        "null"
      ]
    }
  ]
}

选择 "Inject Metadata" 时使用的记录 schema 如下(Avro 格式):

{
  "type": "record",
  "name": "lynxusRecord",
  "namespace": "cn.org.acal.lynxus",
  "fields": [
    < 由 Record Reader 为 Kinesis 消息确定的字段 >,
    {
      "name": "kinesisMetadata",
      "type": [
        {
          "type": "record",
          "name": "metadataType",
          "fields": [
            { "name": "stream", "type": ["string", "null"] },
            { "name": "shardId", "type": ["string", "null"] },
            { "name": "sequenceNumber", "type": ["string", "null"] },
            { "name": "subSequenceNumber", "type": ["long", "null"] },
            { "name": "shardedSequenceNumber", "type": ["string", "null"] },
            { "name": "partitionKey", "type": ["string", "null"] },
            { "name": "approximateArrival", "type": [ { "type": "long", "logicalType": "timestamp-millis" }, "null" ] }
          ]
        },
        "null"
      ]
    }
  ]
}

选择 Use Wrapper 策略时,JsonRecordSetWriter 输出的 FlowFile 内容示例:

[
  {
    "value": {
      "address": "1234 First Street",
      "zip": "12345",
      "account": {
        "name": "Acme",
        "number": "AC1234"
      }
    },
    "kinesisMetadata" : {
      "stream" : "stream-name",
      "shardId" : "shardId-000000000000",
      "sequenceNumber" : "123456789",
      "subSequenceNumber" : 3,
      "shardedSequenceNumber" : "12345678900000000000000000003",
      "partitionKey" : "123",
      "approximateArrival" : 1756459596788
    }
  }
]

选择 Inject Metadata 策略时,JsonRecordSetWriter 输出的 FlowFile 内容示例:

[
  {
    "address": "1234 First Street",
    "zip": "12345",
    "account": {
      "name": "Acme",
      "number": "AC1234"
    },
    "kinesisMetadata" : {
      "stream" : "stream-name",
      "shardId" : "shardId-000000000000",
      "sequenceNumber" : "123456789",
      "subSequenceNumber" : 3,
      "shardedSequenceNumber" : "12345678900000000000000000003",
      "partitionKey" : "123",
      "approximateArrival" : 1756459596788
    }
  }
]