kafka
kafka
車輪の唄
atarik@163.com
展开
-
kafka客户端注册报错 InstanceAlreadyExistsException
[kafka_spout:7-MultipleThreadSpoutExecutors] WARN o.a.kafka.common.utils.AppInfoParser - Error registering AppInfo mbeanjavax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=gx-test-20170629at com.sun.jmx.mbeanserver.Repositor原创 2020-10-18 12:20:43 · 2984 阅读 · 0 评论 -
消费端报错The coordinator is not aware of this member
1)Consumer中出现单独的standalone consume,而且standalone consume的名字和某个GroupId名字相同,这种现象就会触发报错,具体原因我未深究,因为本项目没有standalone consume存在;2)组成员“崩溃”,造成kafka被动Rebalance,这样就会触发The coordinator is not aware of this member关于第一种错误可能:standalone consumer与consumer group冲突时:这..原创 2020-09-02 19:38:25 · 16388 阅读 · 0 评论 -
更换group.id时kafka从何处开始消费
设置消费者properties的两个参数consumer.group.idproperties.setProperty("auto.offset.reset", "earliest”) // latest注意:只要不更改group.id,每次重新消费kafka,都是从上次消费结束的地方继续开始,不论"auto.offset.reset”属性设置的是什么场景一:Kafka上在实时被灌入数据,但kafka上已经积累了两天的数据,如何从最新的offset开始消费?(最新指相对于当前系.原创 2020-05-09 20:50:58 · 772 阅读 · 0 评论 -
kafka服务端--SocketServer
kafka在设计上大量使用了Selector+Channel+Buffer的设计原理.所以在开始之前简单介绍一下NIO 的Selector+Channel+BufferNIO 的Selector+Channel+BufferBuffers(缓冲区)Java NIO中的Buffer用于和NIO通道进行交互。缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成N...原创 2020-04-10 22:07:09 · 339 阅读 · 0 评论 -
kafka服务端--ReplicaManager
一、ReplicaManager简介replicaManager主要用来管理topic在本broker上的副本信息。并且读写日志的请求都是通过replicaManager进行处理的。每个replicaManager实例都会持有一个Pool[TopicPartition, Partition]类型的allPartitions变量。Pool其实就是一个Map的封装。通过key(TopicPa...原创 2020-04-10 21:51:43 · 664 阅读 · 0 评论 -
kafka消费端--增量拉取
前言消费端通过poll方法拉取数据时, 每次都会调用fetch去服务端发起拉数据请求, 那每次不间断的拉取数据, broker端如何判定该次请求拉取的offset?简介为了减少客户端每次拉取都要拉取全部的分区,增加了增量拉取分区的概念。拉取会话(Fetch Session),类似于web中的session是有状态的,客户端的fetch也可以认为是有状态的。这里的状态指的是知道“...转载 2020-04-10 21:40:47 · 2362 阅读 · 0 评论 -
kafka服务端--LogManager
代码版本: 2.0.0-SNAPSHOT 在Kafka log的读写分析一文中有介绍过Kafka日志的结构,并提及Kafka会定期清理Segment。本文来具体看一下后台线程是如何完成清理工作,除此之外还一并涉及Kafka日志管理的其它内容,如:日志刷新,日志检查点设置等管理工作。因为功能点比较多,拆成两篇进行撰写。StartUp KafkaServer启动时会初始化一个LogMa...原创 2020-04-03 21:40:42 · 387 阅读 · 0 评论 -
kafka服务端--KafkaController(二)--副本状态机/分区状态机
状态机一般用在事件处理中,并且事件会有多种状态。当事件发生变化时,会触发对应的事件处理动作。Kafka控制启动状态机时有下面特点:1、分区状态机和副本状态机需要获取集群中所有分区和副本,因此需要先初始化上下文后,才能启动状态机。2、分区包含了多个副本,只有当集群中所有的副本初始化好之后,才可以初始化分区状态机一,ReplicaStateMachineReplicaState...原创 2020-04-01 22:02:16 · 675 阅读 · 0 评论 -
kafka服务端--KafkaController(一)
一, 概述控制器是Kafka的核心组件之一,它的主要作用是在 ZooKeeper 的帮助下协调和管理整个Kafka集群。Kafka 利用ZooKeeper 的领导者选举机制,每个Broker 都会参与竞选主控制器,但是最终只会有一个 Broker 可以成为主控制器。下面我们简单的看一下控制器主要的作用是什么。1、主题管理:控制器会帮助我们完成Topic 的创建、删除以及增加分区。也就是当执...原创 2020-04-01 21:41:21 · 479 阅读 · 0 评论 -
kafka客户端--network底层实现分析
network层的分层架构下图展示了从最上层的KafkaProducer到最底层的Java NIO的构建层次关系:图中淡紫色的方框表示接口或者抽象类,白色方框是具体实现。整个架构图也体现了“面向接口编程”的思想:最底层Java NIO往上层全部以接口形式暴露,上面的3层,也都定义了相应的接口,逐层往上暴露。接口的实例化(包括KafkaClient, Selectable, Chan...原创 2020-03-27 20:32:45 · 471 阅读 · 0 评论 -
kafka服务端--启动入口分析
平常我们通过命令kafka-server-start /usr/local/etc/kafka/server.properties启动,kafka的启动类是Kafka.scala,最终会调用Kafka.scala类的main方法。另外,启动脚本中还会设置相关JVM参数,如log4j配置文件地址、JVM堆大小等等。下面通过源码简单分析下kafka的启动流程以及shutdown的实现。本系列...原创 2020-03-21 21:50:10 · 1105 阅读 · 0 评论 -
kafka客户端--wakeup方法
wakeup 方法生产端的send方法和消费端都有wakeup方法,其作用是将nio的poll方法中断,(nio poll方法中, waittime为-1表示永久阻塞,0表示立即返回)生产端唤醒分析:它的作用就是将 Sender 线程从poll方法的阻塞中唤醒,poll方法的作用是轮询注册在多路复用器上的 Channel,它会一直阻塞在这个方法上,除非满足下面条件中的一个:at l...原创 2020-03-21 21:45:47 · 5088 阅读 · 0 评论 -
kafka网络客户端中的异步NIO原理
开始认为kafka生产端的future应用是线程中的异步操作, 直到后来看到消费端主要到只有一个线程的情况下収future的使用NIO.2,主要包括新的:异步 I/O(简称 AIO); Multicase 多播; Stream Control Transport Protocol(SCTP); 文件系统 API; 以及一些 I/O API 的更新,例如:java.io.File....原创 2020-03-21 21:09:08 · 369 阅读 · 0 评论 -
kafka消费者--加入consumergroup流程
一个消费者 group 由一个或者多个消费者组成,原则上每个消费者都需要有一个 groupId。这个可以在KafkaConsumer创建的时候指定。当消费者组只有一个消费者时,此时可以认为就是点对点模式;当有多个消费者时,就可以认为是发布订阅模式。对于Broker 端的TopicPartition 而言,一个Partition 只能被一个消费者消费。也就是说,假设一个Topi...原创 2020-03-15 18:21:51 · 5095 阅读 · 0 评论 -
kafka消费者--消息拉取流程
1、KafkaConsumer poll 详解消息拉起主要入口为:KafkaConsumer#poll方法,其声明如下:public ConsumerRecords<K, V> poll(final Duration timeout) { // @1 return poll(time.timer(timeout), true); ...原创 2020-03-13 22:21:44 · 4691 阅读 · 3 评论 -
kafka消费者--网络模型
Kafka 消费者端的设计相对生产者要复杂一些,其中一个主要的原因就是,消费者组等相关概念的引入。其中包含了:ConsumerCoordinator、Fetcher、ConsumerNetworkClient 组件,其组合层级示意图如下所示:从上面主要组件关系可以看出,KafkaConsumer 有 2 个成员变量 ConsumerCoordinator 和 Fetcher。其中 Cons...原创 2020-03-13 21:13:40 · 490 阅读 · 0 评论 -
kafka消费者--心跳检测
1. 相关配置项Consumer读取partition中的数据是通过调用发起一个fetch请求来执行的。而从Kafka Consumer来看,它有一个poll方法。但是这个poll方法只是可能会发起fetch请求。原因是:Consumer每次发起fetch请求时,读取到的数据是有限制的,通过配置项max.partition.fetch.bytes来限制。而在执行poll方法时,会根据配置项ma...原创 2020-03-13 21:10:01 · 7012 阅读 · 2 评论 -
kafka消费者--指定分区消费
kafka消费者有两种模式, 订阅模式和分配模式, 具体区别如下模式 不同之处 相同之处 subscribe() 使用 Kafka Group 管理,自动进行 rebalance 操作 可以在 Kafka 保存 offset assign() 用户自己进行相关的处理 也可以进行 offset commit,但是尽量保证 group.id 唯一性,如果...原创 2020-03-12 21:56:48 · 7725 阅读 · 0 评论 -
kafka消费者--tcp长连接讨论
一、何时创建TCP连接 首先明确的是,在构建KafkaConsumer实例时是不会创建任何TCP连接的;另外在调用诸如subscribe或assign的时候也不会创建任何TCP连接。那么TCP连接是在什么时候创建的呢?严格来说有几个可能的时间点。从粗粒度层面来说,我们可以安全地认为Socket连接是在调用consumer.poll()创建的;从细粒度层面来说,TCP连接创建的时机有3个:1....原创 2020-03-12 21:46:40 · 4314 阅读 · 0 评论 -
kafka--事务和幂等(二)
消息传输保障一般而言,消息中间件的消息传输保障有3个层级,分别如下。at most once:至多一次。消息可能会丢失,但绝对不会重复传输。 at least once:最少一次。消息绝不会丢失,但可能会重复传输。 exactly once:恰好一次。每条消息肯定会被传输一次且仅传输一次。Kafka 的消息传输保障机制非常直观。当生产者向 Kafka 发送消息时,一旦消息被成功提交到...原创 2020-03-11 21:56:54 · 1738 阅读 · 2 评论 -
kafka--事务和幂等
在Kafka 0.11.0.0引入了EOS(exactly once semantics,精确一次处理语义)的特性,这个特性包括kafka幂等性和kafka事务两个属性1 生产者幂等性1.1 引入幂等性引入目的:生产者重复生产消息。生产者进行retry会产生重试时,会重复产生消息。有了幂等性之后,在进行retry重试时,只会生成一个消息。1.2 幂等性实现1.2....原创 2020-03-11 21:23:32 · 355 阅读 · 0 评论 -
kafka消费者--coordinate分析
Consumer Group提及Consumer Group,最先想到的就是Group与Consumer Client的关联关系:1,Consumer Group用group.id(String)作为全局唯一标识符 2,每个Group可以有零个、一个或多个Consumer Client 3,每个Group可以管理零个、一个或多个Topic 4,Group下每个Consumer Cli...原创 2020-03-07 19:56:36 · 1100 阅读 · 0 评论 -
kafka--controller控制器
在Kafka集群中会有一个或者多个broker,其中有一个broker会被选举为控制器(Kafka Controller),它负责管理整个集群中所有分区和副本的状态。当某个分区的leader副本出现故障时,由控制器负责为该分区选举新的leader副本。当检测到某个分区的ISR集合发生变化时,由控制器负责通知所有broker更新其元数据信息。当使用kafka-topics.sh脚本为某个topic增...原创 2020-03-07 14:09:51 · 230 阅读 · 0 评论 -
kafka--compact分析
Kafka是一个基于日志的流处理平台,一个topic可以有多个分区(partition),分区是复制的基本单元,在单节点上,一个分区的数据文件可以存储在多个磁盘目录中,每个分区的日志文件存储的时候又会分成一个个的segment,默认日志段(segment)的大小是1GB,segment是日志清理的基本单元,当前正在使用的segment是不会被清理的。对于每一个kafka partition的日志,...原创 2020-03-06 22:15:38 · 1640 阅读 · 0 评论 -
kafka--指定时间戳消费
kafka 在 0.10.1.1 版本增加了时间索引文件,因此我们可以根据时间戳来访问消息。时间戳可否自定义, 如果自定义时间戳写入先后错乱, 索引怎么弄????具体原理具体使用如以下需求:从半个小时之前的offset处开始消费消息,代码示例如下:package com.bonc.rdpe.kafka110.consumer;import java.text.Date...原创 2020-03-06 21:58:38 · 6099 阅读 · 2 评论 -
kafka自定义sasl验证插件
我们需要实现的类有以下几个:LoginModule Provider(client和server) SaslClientFactory SaslClient SaslServerFactory SaslServerLoginModule要先实现LoginModule。这个LoginModule中在客户端需要初始化SaslClientProvider,服务端需要初始化SaslSe...原创 2020-02-28 22:27:13 · 788 阅读 · 0 评论 -
Window下kafka SASL_PLAINTEXT认证方式实现
一:前情提要SASL_PLAINTEXT是一种简单的用户名和密码认证机制,是一种kafka加密协议,PLAINTEXT是传输层协议二:配置准备1:JAVA_HOME有JAVA_HOME的环境变量,且java版为1.8及以上,jdk目录无中文和空格;2:KAFKA项目部署下载解压KAFKA项目到一个无中文无空格的目录下。配置非加密下的KAFKA环境三:JAAS配置K...原创 2020-02-28 22:23:29 · 694 阅读 · 2 评论 -
kafka开启sasl认证
SASL/PLAIN认证机制开启方法:修改Kafka配置文件 server.properties 或者其它名字(CDH和Ambari的发行版可能文件名有所差异)sasl.enabled.mechanisms = PLAINsasl.mechanism.inter.broker.protocol = PLAINsecurity.inter.broker.protocol = SASL_P...原创 2020-02-28 22:20:38 · 1830 阅读 · 0 评论 -
kafka producer原理分析(三) -- NIO 网络模型
Producer 端的整体流程如下图所示。这里涉及到的主要方法是:KafkaProducer.dosend(); Sender.run(); NetworkClient.poll()(NetworkClient.dosend()); Selector.poll();下面会结合上图,对这几个方法做详细的讲解,本文下面的内容都是结合上图进行讲解。KafkaProducer...原创 2020-02-28 22:02:32 · 587 阅读 · 0 评论 -
kafka的sasl配置
1、Kafka brokers的SASL配置 在broker中选择1个或多个支持的机制启用,kafka目前支持的机制有 GSSAPI 和 PLAIN 。 添加一个JAAS文件来配置选择的 GSSAPI(Kerberos)或 PLANIN。 JAAS配置文件位置作为JVM参数传递给每个broker代理。例如: - Djava.security.auth.login....原创 2020-02-27 22:28:24 · 1629 阅读 · 0 评论 -
kafka partion个数分析
kafka的每个topic都可以创建多个partition,partition的数量无上限,并不会像replica一样受限于broker的数量,因此partition的数量可以随心所欲的设置。那确定partition的数量就需要思考一些权衡因素。越多的partition可以提供更高的吞吐量在kafka中,单个partition是kafka并行操作的最小单元。每个partition可以独立接...原创 2020-01-28 15:53:17 · 778 阅读 · 0 评论 -
kafka如何保证消息的顺序性
Kafka分布式的单位是partition,同一个partition用一个write ahead log组织,所以可以保证FIFO的顺序。不同partition之间不能保证顺序。但是绝大多数用户都可以通过message key来定义,因为同一个key的message可以保证只发送到同一个partition,比如说key是user id,table row id等等,所以同一个user或者同一个...原创 2020-01-27 17:12:54 · 674 阅读 · 0 评论 -
kafka producer原理分析(二)
先用一张图总结Sender线程的流程在 KafkaProducer 中会启动一个单独的线程,其名称为 “kafka-producer-network-thread | clientID”,其中 clientID 为生产者的 id1、Sender 线程详解1.1 类图我们先来看一下其各个属性的含义:KafkaClient client kafka 网络...原创 2020-01-22 19:31:17 · 720 阅读 · 0 评论 -
kafka producer原理分析(一)
用户在使用 KafkaProducer 发送消息时,首先需要将待发送的消息封装成 ProducerRecord,返回的是一个 Future 对象,典型的 Future 设计模式。在发送时也可以指定一个 Callable 接口用来执行消息发送的回调。1、ProducerRecord 类图我们首先来看一下 ProducerRecord 的核心属性,即构成 消息的6大核心要素:...原创 2020-01-20 22:18:37 · 465 阅读 · 0 评论 -
Kafka broker端的NIO网络通信模型
一、Kafka网络通信模型的整体框架概述Kafka的网络通信模型是基于NIO的Reactor多线程模型来设计的。主要采用了1(1个Acceptor线程)+N(N个Processor线程)+M(M个业务处理线程)。下面的表格简要的列举了下:线程数 线程名 线程具体说明 1 kafka-socket-acceptor_%x Acceptor线程,负责监听Client...原创 2020-01-18 13:58:31 · 336 阅读 · 0 评论 -
kafka的幂等性
在之前的旧版本中,Kafka只能支持两种语义:At most once和At least once。At most once保证消息不会朝服,但是可能会丢失。在实践中,很有有业务会选择这种方式。At least once保证消息不会丢失,但是可能会重复,业务在处理消息需要进行去重。、 Kafka在0.11.0.0版本支持增加了对幂等的支持。幂等是针对生产者角度的特性。幂等可以保证上生产者发送的...原创 2020-01-18 09:38:31 · 4000 阅读 · 1 评论 -
kafka producer客户端的bufferpool内存分配
我们都知道kafka生产者send一条记录(record)后并没有直接发送到kafka服务端,而是先将它保存到内存(RecordAccumulator)中,用于压缩之后批量发送,这里内存的创建和释放是比较消耗资源的,为了实现内存的高效利用,基本上每个成熟的框架或者工具都有一套内存管理机制,kafka的生产者使用BufferPool来实现内存(Java NIO的ByteBuffer)的复用。 ...原创 2020-01-03 22:50:49 · 737 阅读 · 0 评论 -
Kafka的零拷贝技术
kafka中的消费者在读取服务端的数据时,需要将服务端的磁盘文件通过网络发送到消费者进程,网络发送需要经过几种网络节点。如下图所示:传统的读取文件数据并发送到网络的步骤如下:(1)操作系统将数据从磁盘文件中读取到内核空间的页面缓存;(2)应用程序将数据从内核空间读入用户空间缓冲区;(3)应用程序将读到数据写回内核空间并放入socket缓冲区;(4)操作系统将数据从socket缓冲区...原创 2019-12-23 18:47:29 · 261 阅读 · 2 评论