ConsumeKafka

文档中心 › 组件索引 › ConsumeKafka

ConsumeKafka Processor

类型全限定名:cn.org.acal.lynxus.kafka.processors.ConsumeKafka

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

描述

使用 Apache Kafka Consumer API 消费消息。Lynxus 的配套处理器用于发送消息

标签

KafkaGetRecordcsvavrojsonIngestIngressTopicPubSubConsume

属性

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

名称默认值可选值描述
Kafka Connection Service控制器服务 API:
KafkaConnectionService
cn.org.acal.lynxus-lynxus-kafka-service-api-nar-2.11.8
提供与 Kafka Broker 的连接以发布 Kafka 记录
Group IDKafka group.id 属性对应的 Kafka Consumer Group Identifier
Topic Formatnames
  • names — 主题是完整的主题名称或逗号分隔的名称列表
  • pattern — Topic 是一个符合 Java Pattern 语法的正则表达式
指定提供的主题是逗号分隔的名称列表还是单个正则表达式
Topics处理器从中消费 Kafka 记录的 Kafka 主题的名称或模式。 如果以逗号分隔,则可以提供多个。
支持表达式语言:是(仅使用环境/系统变量求值)
自动偏移重置latest
  • earliest — 自动将偏移量重置为最早的偏移量
  • latest — 自动将偏移量重置为最新的偏移量
  • none — 如果没有找到消费者组的先前偏移量,则向消费者抛出异常
当没有找到与 Kafka auto.offset.reset 属性对应的先前消费者偏移量时,应用自动偏移量配置
Commit Offsetstrue
  • true
  • false
指定此处理器在接收消息后是否应将偏移量提交到 Kafka。通常,此值应设置为 true,以便接收的消息不会被重复。但在某些场景中,我们可能希望避免提交偏移量,以便数据可以被处理并稍后由 PublishKafka 确认,从而提供精确一次语义。
Max Uncommitted Size在将 FlowFile 传输到输出关系之前,从 Kafka 消费记录的总大小上限。 指定时,会在达到 [Max Uncommitted Time] 之前,根据每条 Kafka 记录 序列化后的键和值的大小进行评估。
Max Uncommitted Time100 millis在将 FlowFile 传输到输出关系之前,从 Kafka 消费记录所花费的最长时间。 更长的时间可能产生更大的 FlowFile,并增加单条记录的处理延迟。
Header Name Pattern应用于 Kafka 记录标头名称的正则表达式模式,用于选择要写入 FlowFile 属性的标头值
Header Formatstring
  • String — 使用配置的 Header Encoding 字符集将头值解码为字符串。
  • Hex Encoded — 头值被解释为任意二进制数据,并编码为小写十六进制字符串
指定当写入 FlowFile 属性或记录字段时 Kafka 记录标头值如何表示
Header EncodingUTF-8读取 Kafka Record Header 值和写入 FlowFile 属性时应用的字符编码
Processing StrategyFLOW_FILE
  • FLOW_FILE — 为消费的每条 Kafka Record 写入一个 FlowFile
  • DEMARCATOR — 为消费的每批 Kafka Record 写入一个 FlowFile(可选地按 Kafka 键分组)
  • RECORD — 写入一个 FlowFile,其中包含使用 Record Reader 和 Record Writer 消费并处理的多条 Kafka Record
处理 Kafka 记录并将序列化输出写入 FlowFiles 的策略
Header Name Prefix写入 Kafka 记录标头值时应用于 FlowFile 属性名称的前缀。这有助于避免与保留的 FlowFile 属性名称(如 'uuid')冲突。例如,如果设置为 'kafka.header.',名为 'uuid' 的 Kafka 标头将被写为 'kafka.header.uuid'。
Record Reader控制器服务 API:
RecordReaderFactory
cn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8
用于传入 Kafka 消息的Record Reader
Record Writer控制器服务 API:
RecordSetWriterFactory
cn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8
用于序列化传出FlowFile的Record Writer
Output StrategyUSE_VALUE
  • Use Content as Value — 仅将 Kafka Record 值写入 FlowFile 记录。
  • Use Wrapper — 将 Kafka Record 的键、值、头和元数据写入 FlowFile 记录。(更多信息参见处理器的附加详细信息。)
  • Inject Metadata — 将 Kafka Record 值写入 FlowFile 记录,并向其添加一个包含键、头和元数据的子记录。(更多信息参见处理器的附加详细信息。)
  • Inject Offset — 将 Kafka Record 值写入 FlowFile 记录,并将 Kafka Record 偏移量写入名为 kafkaOffset 的字段
用于将 Kafka 记录输出到 FlowFile 记录中的格式。
Key Attribute Encodingutf-8
  • UTF-8 Encoded — 键被解释为 UTF-8 编码的字符串。
  • Hex Encoded — 键被解释为任意二进制数据,并编码为小写十六进制字符串
  • Do Not Add Key as Attribute — 键不会作为属性添加
包含 Kafka 记录密钥的已配置 FlowFile 属性值的编码。
Key Formatbyte-array
  • String — 将 Kafka ConsumerRecord 键格式化为 UTF-8 字符串。
  • Byte Array — 将 Kafka ConsumerRecord 键格式化为字节数组。
  • Record — 将 Kafka ConsumerRecord 键格式化为记录。
指定如何在输出 FlowFile 中表示 Kafka Record Key
Key Record Reader控制器服务 API:
RecordReaderFactory
cn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8
用于将 Kafka 记录键解析为记录的Record Reader
Message Demarcator由于 KafkaConsumer 以批处理方式接收消息,此处理器可以选择输出包含给定主题和分区的所有 Kafka 消息的单个批次的 FlowFile,此属性允许您提供一个字符串(解释为 UTF-8)用于分隔多个 Kafka 消息。这是一个可选属性,如果未提供,则收到的每条 Kafka 消息将产生一个单独的 FlowFile。要输入特殊字符(如'换行'),请使用 CTRL+Enter 或 Shift+Enter,具体取决于操作系统。
Separate By Keyfalse
  • true
  • false
启用此属性后,如果两个 Kafka 消息具有相同的键,则仅将两个消息添加到同一个 FlowFile 中。

关系 (Relationships)

名称描述自动终止
success包含一个或多个序列化 Kafka 记录的 FlowFiles否

写入的 FlowFile 属性

名称描述
record.count收到的记录数
mime.type由配置的Record Writer提供的 MIME 类型
kafka.count一批记录的FlowFile中的记录数
kafka.key如果存在且为单条消息时的消息键。键的编码方式取决于'键属性编码'属性的值
kafka.offset记录在分区中的偏移量或一批记录中偏移量的最小值
kafka.timestamp从主题消费的消息的时间戳或一批消息中时间戳的最小值。此时间戳的值取决于 'log.message.timestamp.type' kafka 代理配置(LOG_APPEND_TIME、CREATE_TIME、NO_TIMESTAMP_TYPE)
kafka.partition一条记录或一批记录的主题分区
kafka.topic一条记录或一批记录的主题
kafka.tombstone如果消费的消息是逻辑删除消息,则设置为 true
kafka.max.offset批量记录中Kafka偏移量的最大值

状态管理

该组件不存储状态。

受限 (Restricted)

该组件不受限。

输入要求

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

另请参阅

详细说明

ConsumeKafka

输出策略

该 Processor 提供多种输出策略(通过 Processor 属性 'Output Strategy' 配置),用于把 Kafka 记录转换为 FlowFile。

  • 'Use Content as Value'(默认)输出的 FlowFile 记录只包含 Kafka 记录的值。
  • 'Use Wrapper' 输出的 FlowFile 记录包含 Kafka 记录的键、值和 header,以及 Kafka 记录中的额外元数据。
  • 'Inject Metadata' 输出的 FlowFile 记录包含 Kafka 记录的值,其中添加了一个子记录字段,用于保存元数据、 header 和键信息。

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

{
  "type": "record",
  "name": "lynxusRecord",
  "namespace": "cn.org.acal.lynxus",
  "fields": [{
      "name": "key",
      "type": [{
          < Schema 由 Key Record Reader 决定,或根据 "Key Format" 属性为 "string" 或 "bytes"(详见下文) >
        }, "null"]
    },
    {
      "name": "value",
      "type": [
        {
          < Schema 由 Record Reader 决定 >
        },
        "null"
      ]
    },
    {
      "name": "headers",
      "type": [
        { "type": "map", "values": "string", "default": {}},
        "null"]
    },
    {
      "name": "metadata",
      "type": [
        {
          "type": "record",
          "name": "metadataType",
          "fields": [
            { "name": "topic", "type": ["string", "null"] },
            { "name": "partition", "type": ["int", "null"] },
            { "name": "offset", "type": ["int", "null"] },
            { "name": "timestamp", "type": ["long", "null"] }
          ]
        },
        "null"
      ]
    }
  ]
}

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

{
  "type": "record",
  "name": "lynxusRecord",
  "namespace": "cn.org.acal.lynxus",
  "fields": [
      < 由 Record Reader 为 Kafka 消息确定的字段 >,
    {
      "name": "kafkaMetadata",
      "type": [
        {
          "type": "record",
          "name": "metadataType",
          "fields": [
            { "name": "topic", "type": ["string", "null"] },
            { "name": "partition", "type": ["int", "null"] },
            { "name": "offset", "type": ["int", "null"] },
            { "name": "timestamp", "type": ["long", "null"] },
            {
              "name": "headers",
              "type": [ { "type": "map", "values": "string", "default": {}}, "null"]
            },
            {
              "name": "key",
              "type": [{
                < Schema 由 Key Record Reader 决定,或根据 "Key Format" 属性为 "string" 或 "bytes"(详见下文) >
              }, "null"]
            }
          ]
        },
        "null"
      ]
    }
  ]
}

如果 Output Strategy 属性设为 'Use Wrapper' 或 'Inject Metadata',会激活一个额外的 Processor 配置属性('Key Format')。该属性用于指定 Kafka 记录的键应如何写入 FlowFile。'Key Format' 的可选值如下:

  • 'Byte Array' 以字节数组形式提供 Kafka 记录的键,与 Kafka 记录中接收到的完全一致。
  • 'String' 使用 UTF-8 字符编码把 Kafka 记录键的字节转换为字符串。(无法把键字节解析为 UTF-8 时,记录会被路由到 'parse.failure' Relationship。)
  • 'Record' 使用关联的 'Key Record Reader' Controller Service,把 Kafka 记录键的字节转换为反序列化的 Lynxus 记录。如果 Key Format 属性设为 'Record',会出现名为 'Key Record Reader' 的额外 Processor 配置属性。该属性用于指定把 Kafka 记录的键解析为 Record 时使用的 Record Reader。

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

[
  {
    "key": {
      "name": "Acme",
      "number": "AC1234"
    },
    "value": {
      "address": "1234 First Street",
      "zip": "12345",
      "account": {
        "name": "Acme",
        "number": "AC1234"
      }
    },
    "headers": {
      "attributeA": "valueA",
      "attributeB": "valueB"
    },
    "metadata": {
      "topic": "accounts",
      "partition": 0,
      "offset": 0,
      "timestamp": 0
    }
  }
]

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

[
  {
    "address": "1234 First Street",
    "zip": "12345",
    "account": {
      "name": "Acme",
      "number": "AC1234"
    },
    "kafkaMetadata": {
      "topic": "accounts",
      "partition": 0,
      "offset": 0,
      "timestamp": 0,
      "headers": {
        "attributeA": "valueA",
        "attributeB": "valueB"
      },
      "key": {
        "name": "Acme",
        "number": "AC1234"
      }
    }
  }
]