Kafka权威指南总结

目录

生产者

常用命令

消费者

常用命令​​​​​

可靠的数据传递

connect APi

集群镜像

管理Kafka

监控

流式处理


生产者

代码块

➊ 新建一个 Properties 对象。
➋ 因为我们打算把键和值定义成字符串类型,所以使用内置的 StringSerializer。
➌ 在这里我们创建了一个新的生产者对象,并为键和值设置了恰当的类型,然后把Properties 对象传给它。
private Properties kafkaProps = new Properties(); ➊
kafkaProps.put("bootstrap.servers", "broker1:9092,broker2:9092");
kafkaProps.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); ➋
kafkaProps.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
producer = new KafkaProducer<String, String>(kafkaProps); 3

发送并忘记(fire-and-forget) 我们把消息发送给服务器,但并不关心它是否正常到达。大多数情况下,消息会正常到 达,因为 Kafka 是高可用的,而且生产者会自动尝试重发。不过,使用这种方式有时候 也会丢失一些消息。
同步发送
我们使用 send() 方法发送消息,它会返回一个 Future 对象,调用 get() 方法进行等待, 就可以知道消息是否发送成功。
异步发送
我们调用 send() 方法,并指定一个回调函数,服务器在返回响应时调用该函数。
​
为了在异步发送消息的同时能够对异常情况进行处理,生产者提供了回调支持。下面是使 用回调的一个例子。
private class DemoProducerCallback implements Callback {➊ @Override
          public void onCompletion(RecordMetadata recordMetadata, Exception e) {
           if (e != null) {
e.printStackTrace(); ➋ }
} }
ProducerRecord<String, String> record =
new ProducerRecord<>("CustomerCountry", "Biomedical Materials", "USA"); ➌
producer.send(record, new DemoProducerCallback()); ➍
➊ 为了使用回调,需要一个实现了 org.apache.kafka.clients.producer.Callback 接口的 类,这个接口只有一个 onCompletion 方法。
➋ 如果 Kafka 返回一个错误,onCompletion 方法会抛出一个非空(non null)异常。这里 我们只是简单地把它打印出来,但是在生产环境应该有更好的处理方式。
➌ 记录与之前的一样。
➍ 在发送消息时传进去一个回调对象。
1.Kafka使用Avro进行序列化,Avro是一个跨语言的序列化格式,可以快速处理大批量数据序列化,支持二进制和json序列化格式,一个二进制较多,Avro用schema定义格式,他也定义的xml的格式,他把schema嵌入到消息中,可以支持发送端修改schema后,不影响消费端的序列化解析。schema通过注册表,然后每个消息记录schema在注册表(格式自己指定后,自动写入注册表和读取)的id,引用进行解析。
2.消费通过key、value的格式传输,相同的key可以发送到同一个分区,如果key为null,kafka将使用轮训的方式发送到各个分区,分区发生变更时会导致散列重复。
3.实现Partitioner接口可实现自定义分区,可以根据特殊key特殊处理,普通key根据集群分区情况继续散列。

常用命令

代码块

创建主题
kafka-topics.sh --zookeeper <zookeeper connect> --create --topic <string> --replication-factor <integer> --partitions <integer>
将 my-topic 主题的分区数量增加到 16。
# kafka-topics.sh --zookeeper zoo1.example.com:2181/kafka-cluster --alter -- topic my-topic --partitions 16
删除 my-topic 主题。
# kafka-topics.sh --zookeeper zoo1.example.com:2181/kafka-cluster --delete -- topic my-topic
列出集群里的所有主题。
# kafka-topics.sh --zookeeper zoo1.example.com:2181/kafka-cluster --list(主题列表)/--describe(打印详细信息)

消费者

Properties props = new Properties(); props.put("bootstrap.servers", "broker1:9092,broker2:9092"); props.put("group.id", "CountryCounter"); props.put("key.deserializer",
"org.apache.kafka.common.serialization.StringDeserializer"); props.put("value.deserializer",
"org.apache.kafka.common.serialization.StringDeserializer");
     KafkaConsumer<String, String> consumer = new KafkaConsumer<String,
     String>(props);
     
 try {
while (true) { ➊
ConsumerRecords<String, String> records = consumer.poll(100); ➋ for (ConsumerRecord<String, String> record : records) ➌
{
log.debug("topic = %s, partition = %s, offset = %d, customer = %s, country = %s\n",
record.topic(), record.partition(), record.offset(), record.key(), record.value());
int updatedCount = 1;
if (custCountryMap.countainsValue(record.value())) {
updatedCount = custCountryMap.get(record.value()) + 1; }
custCountryMap.put(record.value(), updatedCount)
               JSONObject json = new JSONObject(custCountryMap);
System.out.println(json.toString(4)) ➍ }
}
} finally {
consumer.close(); ➎ }
➊ 这是一个无限循环。消费者实际上是一个长期运行的应用程序,它通过持续轮询向 Kafka 请求数据。稍后我们会介绍如何退出循环,并关闭消费者。
➋ 这一行代码非常重要。就像鲨鱼停止移动就会死掉一样,消费者必须持续对 Kafka 进 行轮询,否则会被认为已经死亡,它的分区会被移交给群组里的其他消费者。传给 poll() 方法的参数是一个超时时间,用于控制 poll() 方法的阻塞时间(在消费者的缓 冲区里没有可用数据时会发生阻塞)。如果该参数被设为 0,poll() 会立即返回,否则 它会在指定的毫秒数内一直等待 broker 返回数据。
➌ poll() 方法返回一个记录列表。每条记录都包含了记录所属主题的信息、记录所在分 区的信息、记录在分区里的偏移量,以及记录的键值对。我们一般会遍历这个列表,逐 条处理这些记录。poll() 方法有一个超时参数,它指定了方法在多久之后可以返回, 不管有没有可用的数据都要返回。超时时间的设置取决于应用程序对响应速度的要求, 比如要在多长时间内把控制权归还给执行轮询的线程。
➍ 把结果保存起来或者对已有的记录进行更新,处理过程也随之结束。在这里,我们的目 的是统计来自各个地方的客户数量,所以使用了一个散列表来保存结果,并以 JSON 的 格式打印结果。在真实场景里,结果一般会被保存到数据存储系统里。
 在退出应用程序之前使用 close() 方法关闭消费者。网络连接和 socket 也会随之关闭, 并立即触发一次再均衡,而不是等待群组协调器发现它不再发送心跳并认定它已死亡, 因为那样需要更长的时间,导致整个群组在一段时间内无法读取消息。

1.消费者与群组协调器(第一个注册成功的为群组协调器)间心跳超时默认是3s,进行重平衡。

2.每个分区返回给消费者最大的value默认是1M,多个分区就多兆。

3.PartitionAssignor接口用于处理给定的消费者和主体,决定哪些分区该分配给哪些消费者。

4._consumer_offset是一个特殊的主题,用于消费者提交便宜量。

5.ConsumerRebalanceListener接口提供2个方法,onPartitionsRevoked再均衡开始之前和消费者停止读取消息之后被调用,onPartitionsAssigned重新分配分区之后和消费者开始读取消息之前被调用。

6.退出先调用consumer.wakeup()方法,会在循环充抛WakeupException异常结束循环,再调用consumer.close方法把所有该提交的服务提交。

7.重平衡会关闭消费者,直到分区被分配给消费者,如果主题和分区数量巨大会导致5~10秒的服务不可用。

8.提交偏移量的consumer是“__consumer_offsets”。

常用命令
​​​​​

列出旧版本的消费者群组。
     # kafka-consumer-groups.sh --zookeeper zoo1.example.com:2181/kafka-cluster --list(主题列表)/--describe(打印详细信息)
列出新版本的消费者群组。
     # kafka-consumer-groups.sh --new-consumer --bootstrap-server kafka1.example.com:9092/kafka-cluster --list(主题列表)/--describe(打印详细信息)
深入

1.0.9.0依赖zk,0.10.0自己记录元数据,不再依赖zk消息发送回包含源数据,源数据存储在kafka本地,所以升级kafka要先升级broker,然后是客户端,新broker知道如何处理旧请求,旧broker是不知道如何处理新请求的。

2.broker存储消息默认是7天或1G做为一个片段,随意满足即执行,如果1个片段内包含需要被经历的数据,会有1个清理线程管理器,和多个清理线程,每个线程在本地建个map保存要删除的消息的key,片段内未过期的消息copy到新的片段,再删除原片段。

3.用于查询broker存储片段的,详细信息,例如消息大小、压缩算法等。bin/kafka-run-class.sh kafka.tools.DumpLogSegments

4.0.10.0版本后每个消息都有发送的时间戳,并提供spi根据时间戳进行搜索,并进行消息回溯。

5.元数据限制代销为1M。

可靠的数据传递

1.broker可以复制复制系数,默认是3,也就是分区会被复制3份。

2.领导副本失效需要设置跟随者副本是否为完全跟随者,即是否与zk和领导副本监听有效,如果允许不完全跟随者副本成文领导会出现消息丢失,不允许关于导致主题短时间不可用,权衡利弊使用即可,银行一般使用的是消息不丢失,宁可服务一段时间不可用。

connect APi

1.kafka支持构建数据管道,已内置sdk包,比如与mysql连接并轮训监听新增数据,写入es索引中。无需其他系统支持,可以直接连接通过http 的api进行来接和服务启动。(要启动另外的服务,非生产消费者),启动connect(bin/connect-distributed.sh config/connect-distributed.properties)

集群镜像

1.kafka用MirrorMaker来进行集群间镜像(数据同步),默认每60s同步一次,用1个生产者多个消费者进行数据同步。

管理Kafka

1.topic分区可以新增,不能删除,删除只能删除整个主题。

2.broker 的 delete.topic.enable 参数必须被设置为 true。如果该参数被设为 false,删除主题的请求会被忽略。

3.动态配置工具使用kafka-configs.sh。

主题动态配置

监控

1.使用 kafka.server:type=ReplicaManager,name=UnderReplicatedPartitionis等相关命令来监控broker相关指标。

2.使用kafka.producer:type=producer-metrics,client-id=CLIENTID等命令来监控producer指标。

3.使用kafka.consumer:type=consumer-metrics,client-id=CLIENTID等命令来监控cunsumer指标。

4.如何监控延时,Burrow 是一个开源的应用程序,最初由 LinkedIn 开发。它收集集群消费者群组的信息,并为每个群组计算出一个单独的状态,告诉我们群组是否运行正常、是否落后、速度是否变慢或者是否已经停止工作,以此来完成对消费者状态的监控。

流式处理

实际应用常用不多,可通过聚合消息来做监控,股票数据展示等。

内容总结来自:Kafka权威指南

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值