Kafka消费者架构 - KafkaConsumer

本文重点探讨KafkaConsumer的核心功能——poll方法,详细解析该方法在Kafka消费者架构中的作用,如何进行数据拉取。

前言

本文暂时只是对KafkaConsumer#poll方法展开解析。


poll

private ConsumerRecords<K, V> poll(final Timer timer, final boolean includeMetadataInTimeout) {
	/* 确保KafkaConsumer没有关闭。 */
    acquireAndEnsureOpen();
    try {
    	/* 如果订阅类型是none。 */
    	/* 也就是没有订阅topic或者手动分配分区 */
        if (this.subscriptions.hasNoSubscriptionOrUserAssignment()) {
            throw new IllegalStateException("Consumer is not subscribed to any topics or assigned any partitions");
        }

        do {
        	/* 可能会触发唤醒,终止拉取消息 */
            client.maybeTriggerWakeup();

            if (includeMetadataInTimeout) {
            	/* 主要处理消费者加入消费者组的相关逻辑、位移的自动提交以及对丢失位移的分区进行位移重置 */
                if (!updateAssignmentMetadataIfNeeded(timer)) {
                    return ConsumerRecords.empty();
                }
            } else {
                while (!updateAssignmentMetadataIfNeeded(time.timer(Long.MAX_VALUE))) {
                    log.warn("Still waiting for metadata");
                }
            }

            final Map<TopicPartition, List<ConsumerRecord<K, V>>> records = pollForFetches(timer);
            if (!records.isEmpty()) {
                /* 如果发起了多个获取数据的请求。*/
                /* 或者:客户端还有没有发送的请求 以及 已发送但是没有得到响应的请求 */
                if (fetcher.sendFetches() > 0 || client.hasPendingRequests()) {
                	/* 进行底层网络io,立即返回 */
                    client.pollNoWakeup();
                }
				/* 拦截器拦截处理 */
                return this.interceptors.onConsume(new ConsumerRecords<>(records));
            }
        /* 只要拉取时间没有失效,就会一直拉取消息 */
        } while (timer.notExpired());

        return ConsumerRecords.empty();
    } finally {
        release();
    }
}

在这里插入图片描述

确保KafkaConsumer没有关闭。

在这里插入图片描述

获取锁。

在这里插入图片描述

释放锁。

在这里插入图片描述

ConsumerCoordinator#poll 方法 主要处理消费者加入消费者组的相关逻辑、位移的自动提交。
返回false的情况是以下几种之一:
	如果协调者未知 && 客户端无法与协调者节点连接就绪。
	元数据更新失败。
	新的消费者尝试加入组失败。

在这里插入图片描述

如果产生了新的Leader导致Follower的分区的位移截断,需要验证位移的正确性。
如果当前所有已分配分区的FetchState都为FETCHING状态,直接返回true。
如果从协调者获取的已提交的位移为空,直接返回false。
根据位移重置策略对丢失的位移发起重置请求。
对需要重置位移的分区,进行重置位移。

private Map<TopicPartition, List<ConsumerRecord<K, V>>> pollForFetches(Timer timer) {
    long pollTimeout = coordinator == null ? timer.remainingMs() :
            Math.min(coordinator.timeToNextPoll(timer.currentTimeMs()), timer.remainingMs());

    // if data is available already, return it immediately
    final Map<TopicPartition, List<ConsumerRecord<K, V>>> records = fetcher.fetchedRecords();
    if (!records.isEmpty()) {
        return records;
    }

    // send any new fetches (won't resend pending fetches)
    fetcher.sendFetches();
    
    if (!cachedSubscriptionHashAllFetchPositions && pollTimeout > retryBackoffMs) {
        pollTimeout = retryBackoffMs;
    }

    Timer pollTimer = time.timer(pollTimeout);
    client.poll(pollTimer, () -> {
        // since a fetch might be completed by the background thread, we need this poll condition
        // to ensure that we do not block unnecessarily in poll()
        return !fetcher.hasCompletedFetches();
    });
    timer.update(pollTimer.currentTimeMs());

   
    // after the long poll, we should check whether the group needs to rebalance
    // prior to returning data so that the group can stabilize faster

	 /* 如果消费者需要加入组 或者 加入组的请求还未完成。 */
    if (coordinator != null && coordinator.rejoinNeededOrPending()) {
        return Collections.emptyMap();
    }

    return fetcher.fetchedRecords();
}

拉取数据。


<think>嗯,用户这次想了解在CDH平台上使用kafka-consumer-offset-checker工具检查消费者偏移量的方法。从对话历史看,用户应该是在CDH集群中管理Kafka服务时遇到了消费者延迟问题,之前我已经提供了多种监控积压的方法,但用户特别点名要了解这个特定工具。 用户引用的两个站内参考很有价值:引用[1]展示了CDH中Kafka命令行工具的标准路径和基础用法,引用[2]则提示了复制因子配置不匹配的常见错误。这让我意识到需要重点说明版本兼容性问题——毕竟在较新的CDH版本中这个工具已被弃用。 考虑到用户可能是运维人员,需要具体操作指引,我决定分三部分回应:首先是工具路径定位,强调CDH的特殊目录结构;然后是具体命令语法,包括必填参数和常见错误处理;最后补充替代方案,因为在新版本中必须迁移到kafka-consumer-groups命令。 特别要注意的是引用[2]提到的复制因子错误,这在执行检查命令时经常出现,需要单独说明解决方案。另外用户环境可能有Kerberos认证,这个难点也要提前预警。 最后生成的延伸问题都围绕实际运维场景:第一个是版本过渡问题,第二个针对监控集成,第三个则关联到之前讨论过的消费者延迟诊断。这样既能延续当前话题,又能串联起用户可能需要的知识链。</think>在 CDH 平台的 Kafka 中使用 `kafka-consumer-offset-checker` 工具检查消费者偏移量,需注意以下关键步骤和版本适配问题: --- ### 一、工具路径与基础命令 1. **定位工具路径** CDH 的 Kafka 命令行工具位于: ```bash /opt/cloudera/parcels/KAFKA/bin/kafka-consumer-offset-checker ``` 2. **基础命令格式** ```bash ./kafka-consumer-offset-checker \ --zookeeper bigdata001:2181 \ # Zookeeper地址 --group your_consumer_group \ # 消费者组名 --topic your_topic # 目标主题(可选) ``` --- ### 二、关键输出解读 执行后输出示例: ``` GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG OWNER test_group zyl_test 0 15200 15200 0 consumer-1 test_group zyl_test 1 14800 15000 200 consumer-2 ``` - **CURRENT-OFFSET**:消费者当前提交的位移 - **LOG-END-OFFSET**:分区最新消息位移 - **LAG**:积压消息数 = `LOG-END-OFFSET - CURRENT-OFFSET` --- ### 三、版本适配与注意事项 1. **CDH 版本限制** - 仅适用于 **CDH 5.x / Kafka 0.9.x 及更早版本** - CDH 6.x (Kafka 2.x+) 已弃用此工具,需改用 `kafka-consumer-groups`: ```bash /opt/cloudera/parcels/KAFKA/bin/kafka-consumer-groups \ --bootstrap-server bigdata001:9092 \ --group your_group \ --describe ``` 2. **常见错误处理** - **复制因子不匹配错误**(引用[2]问题): ```log Number of alive brokers does not meet the required replication factor ``` **解决方案**: 修改 `__consumer_offsets` 主题的复制因子(需先停止 Kafka 服务): ```bash ./kafka-topics --zookeeper bigdata001:2181 \ --topic __consumer_offsets \ --alter --config min.insync.replicas=2 # 调整为可用Broker数 ``` 3. **Kerberos 认证环境** 若集群启用 Kerberos,需先获取凭证: ```bash kinit -kt kafka.keytab kafka/bigdata001@YOUR.DOMAIN ``` --- ### 四、新版本替代方案(CDH 6.x+) 使用 `kafka-consumer-groups` 替代: ```bash # 查看所有消费者组 ./kafka-consumer-groups --bootstrap-server bigdata001:9092 --list # 查看特定组详情 ./kafka-consumer-groups --bootstrap-server bigdata001:9092 \ --group your_group \ --describe --members --verbose ``` 输出包含: - **分区级偏移量**(PARTITION, CURRENT-OFFSET, LOG-END-OFFSET, LAG) - **消费者成员分配情况**(MEMBER-ID, HOST) - **当前状态**(STABLE, REBALANCING) --- ### 五、操作验证流程 1. 创建测试主题(引用[1]方法): ```bash ./kafka-topics --create --zookeeper bigdata001:2181 \ --replication-factor 3 --partitions 3 --topic lag_test ``` 2. 启动控制台消费者: ```bash ./kafka-console-consumer --bootstrap-server bigdata001:9092 \ --topic lag_test --group lag_test_group ``` 3. **检查偏移量**: ```bash # CDH 5.x ./kafka-consumer-offset-checker --zookeeper bigdata001:2181 --group lag_test_group # CDH 6.x ./kafka-consumer-groups --bootstrap-server bigdata001:9092 --group lag_test_group --describe ``` --- > **关键提示**: > - 老工具 `kafka-consumer-offset-checker` 依赖 Zookeeper,新工具 `kafka-consumer-groups` 直连 Broker,更符合架构演进趋势[^1][^2] > - 生产环境建议通过 Cloudera Manager 配置自动化监控(参见前文方案),避免手动检查 --- **
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值