
Kafka 实战基础
文章平均质量分 89
以实战为基础来展开讲解!全面而深入的讲解,耐心看完,收获会颇丰!
程序员山子
坚持着,总有一天你会站在最亮的地方活出自己曾经渴望的模样
展开
-
延时操作(八)
延时操作 如果在使用生产者客户端发送消息的时候将 acks 参数设置为-1,那么就意味着需要等待 ISR 集合中的所有副本都确认收到消息之后才能正确地收到响应的结果,或者捕获超时异常。 如下面3张图所示,假设某个分区有3个副本:leader、follower1 和 follower2,它们都在分区的 ISR 集合中。为了简化说明,这里我们不考虑 ISR 集合伸缩的情况。Kafka 在收到客户端的生产请求(ProduceRequest)后,将消息3和消息4写入 leader 副...原创 2021-12-23 08:44:10 · 411 阅读 · 0 评论 -
Spark SQL(三十五)
Spark SQL Spark SQL 是一个用于处理结构化数据的 Spark 组件,它是在 Spark 1.0 版本开始加入 Spark 生态系统的。Spark SQL 能够利用 Spark 进行结构化数据的存储和操作,结构化数据既可以来自外部结构化数据源(Hive、JSON、Parquet、JDBC/ODBC等),也可以通过向已有 RDD 增加 Schema 的方式得到。 相比于 Spark RDD API,Spark SQL 包含了对结构化数据和在其上运算的更多信息,S...原创 2021-12-16 08:44:17 · 917 阅读 · 0 评论 -
Spark Streaming简介 (三十四)
Spark Streaming简介Spark Streaming 是 Spark 提供的对实时数据进行流式计算的组件。它是 Spark 核心 API 的一个扩展,具有吞吐量高、容错能力强的实时流数据处理系统,支持包括 Kafka、Flume、Kinesis 和 TCP 套接字等数据源,获取数据以后可以使用 map()、reduce()、join()、window() 等高级函数进行复杂算法的处理,处理结果可以存储到文件系统、数据库,或者展示到实时数据大盘等。另外,Sparking Streaming 也原创 2021-12-16 08:40:20 · 592 阅读 · 0 评论 -
初识Spark(三十三)
初识Spark Spark 是一个用来实现快速且通用的集群计算的平台。Spark 是 UC Berkeley AMP Lab(加州大学伯克利分校的AMP实验室)所开源的类 MapReduce 的通用并行框架,现在已经是 Apache 的一个顶级项目。Spark 使用 Scala 语言开发,支持 Scala、Java、Python、R 语言相关的 API,运行于 JVM 之上。Spark 基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性。Spark 适用于各种各样...原创 2021-12-15 08:44:07 · 781 阅读 · 0 评论 -
Kafka监控(下)(三十二)
消费滞后消息堆积是消息中间件的一大特色,消息中间件的流量削峰、冗余存储等功能正是得益于消息中间件的消息堆积能力。然而消息堆积是一把亦正亦邪的“双刃剑”,如果应用场合不恰当,反而会对上下游的业务造成不必要的麻烦,比如消息堆积势必会影响上下游整个调用链的时效性。在某些情况下,有些中间件如 RabbitMQ 在发生消息堆积时还会影响自身的性能。对 Kafka 而言,虽然消息堆积不会给其自身性能带来太大的困扰,但难免会影响上下游的业务,堆积过多有可能造成磁盘爆满,或者触发日志清除操作而造成消息丢失的情况。如何利原创 2021-12-15 08:40:32 · 1059 阅读 · 0 评论 -
Kafka监控(上)(三十一)
Kafka监控 任何应用功能再强大、性能再优越,如果没有与之匹配的监控,那么一切都是虚无缥缈的。监控不仅可以为应用提供运行时的数据作为依据参考,还可以迅速定位问题,提供预防及告警等功能,很大程度上增强了整体服务的鲁棒性。 目前的 Kafka 监控产品有很多,比如 Kafka Manager、Kafka Eagle、Kafka Monitor、KafkaOffsetMonitor、Kafka Web Console、Burrow 等,它们都有各自的优缺点。以 Kafka Manage...原创 2021-12-14 08:39:29 · 1231 阅读 · 1 评论 -
Kafka Streams(三十)
Kafka Streams Kafka 一直被认为是一个强大的消息中间件,它实现了高吞吐、高可用和低延时的消息传输能力,这让它成为流式处理系统中完美的数据来源。目前通用的一些流式处理框架如 Apache Spark、Apache Flink、Apache Storm 等都可以将 Kafka 作为可靠的数据来源。但遗憾的是,在 0.10.x 版本之前,Kafka 还并不具备任何数据处理的能力,但在此之后,Kafka Streams 应运而生。 Kafka Streams 是一...原创 2021-12-14 08:36:08 · 1856 阅读 · 0 评论 -
Kafka Mirror Maker(二十九)
Kafka Mirror Maker Kafka Mirror Maker 是用于在两个集群之间同步数据的一个工具,其实现原理是通过从源集群中消费消息,然后将消息生产到目标集群中,也就是普通的生产和消费消息。如果了解 RabbitMQ,那么会发现这个工具和 RabbitMQ 中的数据迁移插件 Federation/Shovel 的实现原理如出一辙。用户只需要在启动 Kafka Mirror Maker 时指定一些简单的消费端和生产端配置就可以实现准实时的数据同步。 ...原创 2021-12-13 08:46:09 · 2483 阅读 · 1 评论 -
Kafka Connect(二十八)
Kafka Connect Kafka Connect 是一个工具,它为在 Kafka 和外部数据存储系统之间移动数据提供了一种可靠的且可伸缩的实现方式。Kafka Connect 可以简单快捷地将数据从 Kafka 中导入或导出,数据范围涵盖关系型数据库、日志和度量数据、Hadoop 和数据仓库、NoSQL 数据存储、搜索索引等。相对于生产者和消费者客户端而言,Kafka Connect 省掉了很多开发的工作,尤其是编码部分,这使得应用开发人员更容易上手。 Kafka C...原创 2021-12-13 08:43:54 · 999 阅读 · 0 评论 -
常用管理工具(二十七)
消费组管理 在 Kafka 中,我们可以通过 kafka-consumer-groups.sh 脚本查看或变更消费组的信息。我们可以通过 list 这个指令类型的参数来罗列出当前集群中所有的消费组名称,示例如下(这个功能对应 KafkaAdminClient 中的 listConsumerGroups() 方法):[root@node1 kafka_2.11-2.0.0]# bin/kafka-consumer-groups.sh --bootstrap-server localhost...原创 2021-12-10 08:35:25 · 694 阅读 · 0 评论 -
分区数的上限(二十六)
分区数的上限 一味地增加分区数并不能使吞吐量一直得到提升,并且分区数也并不能一直增加,如果超过默认的配置值,还会引起 Kafka 进程的崩溃。读者可以试着在一台普通的 Linux 机器上创建包含10000个分区的主题,比如在下面示例中创建一个主题 topic-bomb:[root@node1 kafka_2.11-2.0.0]# bin/kafka-topics.sh --zookeeper localhost:2181/ kafka --create --topic topic-bom...原创 2021-12-10 08:32:29 · 463 阅读 · 0 评论 -
如何选择合适的分区数(二十五)
如何选择合适的分区数 如何选择合适的分区数?这是很多 Kafka 的使用者经常面临的问题,不过对这个问题而言,似乎并没有非常权威的答案。而且这个问题显然也没有固定的答案,只能从某些角度来做具体的分析,最终还是要根据实际的业务场景、软件条件、硬件条件、负载情况等来做具体的考量。本节主要介绍与本问题相关的一些重要决策因素,使读者在遇到类似问题时能够有参考依据。性能测试工具 在 Kafka 中,性能与分区数有着必然的关系,在设定分区数时一般也需要考虑性能的因素。对不同的硬件而言,...原创 2021-12-09 08:42:26 · 9511 阅读 · 0 评论 -
修改副本因子(二十四)
修改副本因子 创建主题之后我们还可以修改分区的个数,同样可以修改副本因子(副本数)。修改副本因子的使用场景也很多,比如在创建主题时填写了错误的副本因子数而需要修改,再比如运行一段时间之后想要通过增加副本因子数来提高容错性和可靠性。 前面主要讲述了分区重分配的相关细节,本节中修改副本因子的功能也是通过重分配所使用的 kafka-reassign-partition.sh 脚本实现的。我们仔细观察一下上一节中的示例使用的 project.json 文件:{ "versi...原创 2021-12-09 08:39:39 · 179 阅读 · 0 评论 -
复制限流(二十三)
复制限流 在上一节中我们了解了分区重分配本质在于数据复制,先增加新的副本,然后进行数据同步,最后删除旧的副本来达到最终的目的。数据复制会占用额外的资源,如果重分配的量太大必然会严重影响整体的性能,尤其是处于业务高峰期的时候。减小重分配的粒度,以小批次的方式来操作是一种可行的解决思路。如果集群中某个主题或某个分区的流量在某段时间内特别大,那么只靠减小粒度是不足以应对的,这时就需要有一个限流的机制,可以对副本间的复制流量加以限制来保证重分配期间整体服务不会受太大的影响。 副本间的复制限...原创 2021-12-09 08:37:51 · 379 阅读 · 0 评论 -
分区重分配(二十二)
分区重分配 当集群中的一个节点突然宕机下线时,如果节点上的分区是单副本的,那么这些分区就变得不可用了,在节点恢复前,相应的数据也就处于丢失状态;如果节点上的分区是多副本的,那么位于这个节点上的 leader 副本的角色会转交到集群的其他 follower 副本中。总而言之,这个节点上的分区副本都已经处于功能失效的状态,Kafka 并不会将这些失效的分区副本自动地迁移到集群中剩余的可用 broker 节点上,如果放任不管,则不仅会影响整个集群的均衡负载,还会影响整体服务的可用性和可靠性。 ...原创 2021-12-08 09:05:57 · 373 阅读 · 0 评论 -
优先副本的选举(二十一)
优先副本的选举分区使用多副本机制来提升可靠性,但只有 leader 副本对外提供读写服务,而 follower 副本只负责在内部进行消息的同步。如果一个分区的 leader 副本不可用,那么就意味着整个分区变得不可用,此时就需要 Kafka 从剩余的 follower 副本中挑选一个新的 leader 副本来继续对外提供服务。虽然不够严谨,但从某种程度上说,broker 节点中 leader 副本个数的多少决定了这个节点负载的高低。在创建主题的时候,该主题的分区及副本会尽可能均匀地分布到 Kafka原创 2021-12-08 09:01:44 · 350 阅读 · 0 评论 -
初识KafkaAdminClient(二十)
初识KafkaAdminClient 一般情况下,我们都习惯使用 kafka-topics.sh 脚本来管理主题,但有些时候我们希望将主题管理类的功能集成到公司内部的系统中,打造集管理、监控、运维、告警为一体的生态平台,那么就需要以程序调用 API 的方式去实现。本节主要介绍 KafkaAdminClient 的基本使用方式,以及采用这种调用 API 方式下的创建主题时的合法性验证。基本使用 代码清单16-1中使用 TopicCommand 创建了一个主题,当然我们也可以...原创 2021-12-07 08:47:21 · 1230 阅读 · 0 评论 -
配置管理(十九)
配置管理kafka-configs.sh 脚本是专门用来对配置进行操作的,这里的操作是指在运行状态下修改原有的配置,如此可以达到动态变更的目的。kafka-configs.sh 脚本包含变更配置 alter 和查看配置 describe 这两种指令类型。同使用 kafka-topics.sh 脚本变更配置的原则一样,增、删、改的行为都可以看作变更操作,不过 kafka-configs.sh 脚本不仅可以支持操作主题相关的配置,还可以支持操作 broker、用户和客户端这3个类型的配置。kafka-c原创 2021-12-07 08:44:27 · 1864 阅读 · 0 评论 -
查看主题(十八)
查看主题 第16节中提及了 kafka-topics.sh 脚本有5种指令类型:create、list、describe、alter 和 delete。其中 list 和 describe 指令可以用来方便地查看主题信息,在前面的内容中我们已经接触过了 describe 指令的用法,本节会对其做更细致的讲述。 通过 list 指令可以查看当前所有可用的主题,示例如下:[root@node1 kafka_2.11-2.0.0]# bin/kafka-topics.sh --zo...原创 2021-12-06 09:02:36 · 417 阅读 · 0 评论 -
分区副本的分配(十七)
分区副本的分配 上一节中多处提及了分区副本的分配,读者对此或许有点迷惑,在生产者和消费者中也都有分区分配的概念。生产者的分区分配是指为每条消息指定其所要发往的分区,消费者中的分区分配是指为消费者指定其可以消费消息的分区,而这里的分区分配是指为集群制定创建主题时的分区副本分配方案,即在哪个 broker 中创建哪些分区的副本。 在创建主题时,如果使用了 replica-assignment 参数,那么就按照指定的方案来进行分区副本的创建;如果没有使用 replica-assignmen...原创 2021-12-06 08:59:24 · 250 阅读 · 0 评论 -
主题与分区(十六)
主题与分区主题和分区是 Kafka 的两个核心概念,前面章节中讲述的生产者和消费者的设计理念所针对的都是主题和分区层面的操作。主题作为消息的归类,可以再细分为一个或多个分区,分区也可以看作对消息的二次归类。分区的划分不仅为 Kafka 提供了可伸缩性、水平扩展的功能,还通过多副本机制来为 Kafka 提供数据冗余以提高数据可靠性。从 Kafka 的底层实现来说,主题和分区都是逻辑上的概念,分区可以有一至多个副本,每个副本对应一个日志文件,每个日志文件对应一至多个日志分段(LogSegment),每个原创 2021-12-05 10:48:07 · 1134 阅读 · 0 评论 -
重要的消费者参数(十五)
重要的消费者参数 在 KafkaConsumer 中,除了第8节提及的4个默认的客户端参数,大部分的参数都有合理的默认值,一般我们也不需要去修改它们。不过了解这些参数可以让我们更好地使用消费者客户端,其中还有一些重要的参数涉及程序的可用性和性能,如果能够熟练掌握它们,也可以让我们在编写相关的程序时能够更好地进行性能调优与故障排查。下面挑选一些重要的参数来做细致的讲解。1. fetch.min.bytes 该参数用来配置 Consumer 在一次拉取请求(调用 poll() ...原创 2021-12-04 09:22:46 · 1119 阅读 · 0 评论 -
消费者多线程实现(十四)
消费者多线程实现 KafkaProducer 是线程安全的,然而 KafkaConsumer 却是非线程安全的。KafkaConsumer 中定义了一个 acquire() 方法,用来检测当前是否只有一个线程在操作,若有其他线程正在操作则会抛出 ConcurrentModifcationException 异常:java.util.ConcurrentModificationException: KafkaConsumer is not safe for multi-threaded a...原创 2021-12-03 08:44:28 · 365 阅读 · 0 评论 -
再均衡器-拦截器(十三)
再均衡器 再均衡是指分区的所属权从一个消费者转移到另一消费者的行为,它为消费组具备高可用性和伸缩性提供保障,使我们可以既方便又安全地删除消费组内的消费者或往消费组内添加消费者。不过在再均衡发生期间,消费组内的消费者是无法读取消息的。也就是说,在再均衡发生期间的这一小段时间内,消费组会变得不可用。 另外,当一个分区被重新分配给另一个消费者时,消费者当前的状态也会丢失。比如消费者消费完某个分区中的一部分消息时还没有来得及提交消费位移就发生了再均衡操作,之后这个分区又被分配给了消费组...原创 2021-12-03 08:41:38 · 150 阅读 · 0 评论 -
指定位移消费(十二)
指定位移消费 在上一节中我们讲述了如何进行消费位移的提交,正是有了消费位移的持久化,才使消费者在关闭、崩溃或者在遇到再均衡的时候,可以让接替的消费者能够根据存储的消费位移继续进行消费。 试想一下,当一个新的消费组建立的时候,它根本没有可以查找的消费位移。或者消费组内的一个新消费者订阅了一个新的主题,它也没有可以查找的消费位移。当 __consumer_offsets 主题中有关这个消费组的位移信息过期而被删除后,它也没有可以查找的消费位移。 ...原创 2021-11-22 08:45:57 · 944 阅读 · 0 评论 -
位移提交说明(十一)
位移提交 对于 Kafka 中的分区而言,它的每条消息都有唯一的 offset,用来表示消息在分区中对应的位置。对于消费者而言,它也有一个 offset 的概念,消费者使用 offset 来表示消费到分区中某个消息所在的位置。单词“offset”可以翻译为“偏移量”,也可以翻译为“位移”,读者可能并没有过多地在意这一点:在很多中文资料中都会交叉使用“偏移量”和“位移”这两个词,并没有很严谨地进行区分。笔者对 offset 做了一些区分:对于消息在分区中的位置,我们将 offset 称为“...原创 2021-11-19 08:56:35 · 1864 阅读 · 0 评论 -
消息消费(十)
消息消费 Kafka 中的消费是基于拉模式的。消息的消费一般有两种模式:推模式和拉模式。推模式是服务端主动将消息推送给消费者,而拉模式是消费者主动向服务端发起请求来拉取消息。 从代码清单8-1中可以看出,Kafka 中的消息消费是一个不断轮询的过程,消费者所要做的就是重复地调用 poll() 方法,而 poll() 方法返回的是所订阅的主题(分区)上的一组消息。 对于 poll() 方法而言,如果某些分区中没有可供消费的消息,那么此分区对应的消息拉取的结果就为空;如果订阅...原创 2021-11-12 08:37:24 · 466 阅读 · 0 评论 -
反序列化(九)
反序列化 在第4节中我们讲述了 KafkaProducer 对应的序列化器,那么与此对应的 KafkaConsumer 就会有反序列化器。Kafka 所提供的反序列化器有 ByteBufferDeserializer、ByteArrayDeserializer、BytesDeserializer、DoubleDeserializer、FloatDeserializer、IntegerDeserializer、LongDeserializer、ShortDeserializer、StringDe...原创 2021-11-12 08:29:46 · 380 阅读 · 0 评论 -
消费者客户端开发(八)
消费者客户端开发 在了解了消费者与消费组之间的概念之后,我们就可以着手进行消费者客户端的开发了。在 Kafka 的历史中,消费者客户端同生产者客户端一样也经历了两个大版本:第一个是于 Kafka 开源之初使用 Scala 语言编写的客户端,我们可以称之为旧消费者客户端(Old Consumer)或 Scala 消费者客户端;第二个是从 Kafka 0.9.x 版本开始推出的使用 Java 编写的客户端,我们可以称之为新消费者客户端(New Consumer)或 Java 消费者客户端,它弥...原创 2021-11-11 08:54:39 · 570 阅读 · 0 评论 -
消费者与消费组(七)
消费者与消费组 与生产者对应的是消费者,应用程序可以通过 KafkaConsumer 来订阅主题,并从订阅的主题中拉取消息。不过在使用 KafkaConsumer 消费消息之前需要先了解消费者和消费组的概念,否则无法理解如何使用 KafkaConsumer。本章首先讲解消费者与消费组之间的关系,进而再细致地讲解如何使用 KafkaConsumer。 消费者(Consumer)负责订阅 Kafka 中的主题(Topic),并且从订阅的主题上拉取消息。与其他一些消息中间件不同的是:...原创 2021-11-11 08:50:19 · 212 阅读 · 0 评论 -
重要的生产者参数(六)
重要的生产者参数 在 KafkaProducer 中,除了第3节提及的3个默认的客户端参数,大部分的参数都有合理的默认值,一般不需要修改它们。不过了解这些参数可以让我们更合理地使用生产者客户端,其中还有一些重要的参数涉及程序的可用性和性能,如果能够熟练掌握它们,也可以让我们在编写相关的程序时能够更好地进行性能调优与故障排查。下面挑选一些重要的参数进行讲解。1. acks这个参数用来指定分区中必须要有多少个副本收到这条消息,之后生产者才会认为这条消息是成功写入的。acks 是生产者客...原创 2021-11-10 08:43:06 · 1130 阅读 · 0 评论 -
生产者客户端原理分析(五)
生产者客户端原理分析 在前面的章节中,我们已经了解了 KafkaProducer 的具体使用方法,而本节的内容主要是对 Kafka 生产者客户端的内部原理进行分析,通过了解生产者客户端的整体脉络可以让我们更好地使用它,避免因为一些理解上的偏差而造成使用上的错误。整体架构 在上一节中提及了消息在真正发往 Kafka 之前,有可能需要经历拦截器(Interceptor)、序列化器(Serializer)和分区器(Partitioner)等一系列的作用,那么在此之后又会发生什么呢?下...原创 2021-11-09 09:21:42 · 254 阅读 · 0 评论 -
序列化--分区器--拦截器(四)
序列化生产者需要用序列化器(Serializer)把对象转换成字节数组才能通过网络发送给 Kafka。而在对侧,消费者需要用反序列化器(Deserializer)把从 Kafka 中收到的字节数组转换成相应的对象。在代码清单3-1中,为了方便,消息的 key 和 value 都使用了字符串,对应程序中的序列化器也使用了客户端自带的 org.apache.kafka.common.serialization.StringSerializer,除了用于 String 类型的序列化器,还有 ByteArray原创 2021-11-09 08:35:54 · 375 阅读 · 0 评论 -
生产者-客户端开发(三)
生产者-客户端开发 从编程的角度而言,生产者就是负责向 Kafka 发送消息的应用程序。在 Kafka 的历史变迁中,一共有两个大版本的生产者客户端:第一个是于 Kafka 开源之初使用 Scala 语言编写的客户端,我们可以称之为旧生产者客户端(Old Producer)或 Scala 版生产者客户端;第二个是从 Kafka 0.9.x 版本开始推出的使用 Java 语言编写的客户端,我们可以称之为新生产者客户端(New Producer)或 Java 版生产者客户端,它弥补了旧版客户端中...原创 2021-11-08 19:18:08 · 2125 阅读 · 0 评论 -
安装与配置(二)
安装与配置本节详细介绍 Kafka 运行环境的搭建,为了节省篇幅,本节的内容以 Linux CentOS 作为安装演示的操作系统,其他 Linux 系列的操作系统也可以参考本节的内容。具体的操作系统的信息如下:[root@node1 ~]# uname -aLinux node1 2.6.32-504.23.4.el6.x86_64 #1 SMP Tue Jun 9 20:57:37 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux[root@node1 ~]#原创 2021-11-08 08:36:14 · 159 阅读 · 0 评论 -
初识Kafka(一)
初识KafkaKafka 起初是 由 LinkedIn 公司采用 Scala 语言开发的一个多分区、多副本且基于 ZooKeeper 协调的分布式消息系统,现已被捐献给 Apache 基金会。目前 Kafka 已经定位为一个分布式流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用。目前越来越多的开源分布式处理系统如 Cloudera、Storm、Spark、Flink 等都支持与 Kafka 集成。Kafka 之所以受到越来越多的青睐,与它所“扮演”的三大角色是..原创 2021-11-07 11:26:39 · 203 阅读 · 0 评论