kafka复制因子分区数

在前面的例子(《 Apache Kafka编程入门指南:生产者》)中,我们学习了如何编写简单的Kafka Producer程序。在那个例子中,在如果需要发送的主题不存在,Producer将创建它。都知道(假设你知道),每个主题都是有分区数和复制因子的,但是我们无法通过生产者相关的API设置分区数和复制因子的,因为生产者相关API创建的主题是通过读取server.properties文件中的num.partitions和default.replication.factor的。那么是否就意味着咱们无法在程序里面定义的主题的分区数和复制因子呢?答案是否,否则我也没必要写这篇文章了!

我们可以通过Kafka提供的AdminUtils.createTopic函数来创建主题,它的函数原型如下:

def createTopic (zkClient :ZkClient ,
主题:字符串,
分区:Int ,
复制因子:Int ,
topicConfig :属性=新属性)
  这个函数是没有返回值的。从上面的参数列表我们可以修剪,分区和复制因子参数就是上面说到的分区数和复制因子,所以我们可以通过这个参数来创建主题。在使用createTopic函数之前,我们需要创建zkClient对象,它里面封装了操作Zookeeper的相关API。而这个API不是Kafka内置的,所以我们需要先发布这个依赖:

com.101tec zkclient 0.3 然后我们就可以创建ZkClient对象了:

val zk = “www.iteblog.com:2181”
val sessionTimeoutMs = 10000
val connectionTimeoutMs = 10000

val zkClient = new ZkClient(zk, sessionTimeoutMs, connectionTimeoutMs, ZKStringSerializer)
需要特别主要的是,我们必须指定ZKStringSerializer对象,否则运行完代码之后,你可以看到zookeeper里面已经创建了相关主题,而且你列表的时候也可以看到你创建的主题,但是当你往这个主题里面发送消息的是,你会得到以下的异常:

[2016-02-05 16:45:52,335] ERROR Failed to collate messages by topic, partition due to: Failed to fetch topic metadata for topic: iteblog (kafka.producer.async.DefaultEventHandler)
[2016-02-05 16:45:52,441] WARN Error while fetching metadata [{TopicMetadata for topic iteblog ->
No partition metadata for topic flight due to kafka.common.LeaderNotAvailableException}] for topic [flight]: class kafka.common.LeaderNotAvailableException (kafka.producer.BrokerPartitionInfo)
[2016-02-05 16:45:52,441] ERROR Failed to send requests for topics flight with correlation ids in [41,48] (kafka.producer.async.DefaultEventHandler)
[2016-02-05 16:45:52,441] ERROR Error in handling batch of 1 events (kafka.producer.async.ProducerSendThread)
kafka.common.FailedToSendMessageException: Failed to send messages after 3 tries.
at kafka.producer.async.DefaultEventHandler.handle(DefaultEventHandler.scala:90)
at kafka.producer.async.ProducerSendThread.tryToHandle(ProducerSendThread.scala:105)
at kafka.producer.async.ProducerSendThreadKaTeX parse error: Can't use function '$' in math mode at position 8: anonfun$̲processEvents$3…anonfun$processEvents$3.apply(ProducerSendThread.scala:68)
at scala.collection.immutable.Stream.foreach(Stream.scala:547)
at kafka.producer.async.ProducerSendThread.processEvents(ProducerSendThread.scala:67)
at kafka.producer.async.ProducerSendThread.run(ProducerSendThread.scala:45)
找到话题的领袖,所以无法发送消息这是因为如果你不使用ZKStringSerializer对象,那么只会在动物园管理员里面创建主题的相关信息,但是卡夫卡并没有创建这个主题现在我们就可以使用!AdminUtils.createTopic参见话题了:

val topic = “iteblog”
val replicationFactor = 1
val numPartitions = 2

AdminUtils.createTopic(zkClient, topic, numPartitions, replicationFactor)
如果topic存在,那么程序将会报错:

Exception in thread “main” kafka.common.TopicExistsException: Topic “iteblog” already exists.
at kafka.admin.AdminUtils . c r e a t e O r U p d a t e T o p i c P a r t i t i o n A s s i g n m e n t P a t h I n Z K ( A d m i n U t i l s . s c a l a : 187 ) a t k a f k a . a d m i n . A d m i n U t i l s .createOrUpdateTopicPartitionAssignmentPathInZK(AdminUtils.scala:187) at kafka.admin.AdminUtils .createOrUpdateTopicPartitionAssignmentPathInZK(AdminUtils.scala:187)atkafka.admin.AdminUtils.createTopic(AdminUtils.scala:172)
at com.iteblog.kafka.IteblogProducerV3$.main(IteblogProducerV3.scala:46)
at com.iteblog.kafka.IteblogProducerV3.main(IteblogProducerV3.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
否则什么都没输出则代表你的主题创建成功了!完整代码片段如下:

package com.iteblog.kafka

import kafka.admin.AdminUtils
import kafka.utils.ZKStringSerializer
import org.I0Itec.zkclient.ZkClient

object CreateTopic {
def main(args: Array[String]) {
val zk = “www.iteblog.com:2181”
val sessionTimeoutMs = 10000
val connectionTimeoutMs = 10000

val zkClient = new ZkClient(zk, sessionTimeoutMs, connectionTimeoutMs, ZKStringSerializer)

val topic = "iteblog"
val replicationFactor = 1
val numPartitions = 2

AdminUtils.createTopic(zkClient, topic, numPartitions, replicationFactor)

}
}
  除了使用上面AdminUtils.createTopic在创建主题的时候设置复制因子和分区数,我们还可以使用kafka.admin.TopicCommand来实现同样的功能,如下:
val arguments = Array(“–create”, “–zookeeper”, zk, “–replication-factor”, “2”, “–partition”, “2”, “–topic”, “iteblog”)
TopicCommand.main(arguments)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kafka 分区与 brokers(Kafka 服务节点)之间有一定的关系,具体体现在以下几个方面: 1. 分区分布:Kafka主题(Topic)被分为多个分区,每个分区都会被分配到不同的 broker 上。分区决定了一个主题可以被分配到多少个 broker 上进行并行处理。如果分区小于 brokers 数量,那么部分 broker 可能会没有分配到分区,造成资源浪费;如果分区大于 brokers 数量,那么每个 broker 上可能会有多个分区,增加了并行处理的能力。 2. 吞吐量和并行度:Kafka分区也会影响消费者(Consumer)的吞吐量和并行度。每个消费者可以独立地消费一个或多个分区的消息,因此增加分区可以提高消费者的并行度,从而提高整体的吞吐量。 3. 容错性:Kafka 使用分区副本(Replica)来实现容错性。每个分区都可以有多个副本分布在不同的 broker 上,以防止据丢失。在创建主题时,可以设置副本因子(Replication Factor)来决定一个主题的每个分区应该有多少个副本。通常建议将副本因子设置为不小于 brokers 数量的值,以确保每个 broker 都能存储主题的副本。 需要根据应用程序的需求和系统环境来设置适当的分区和 brokers 数量,并保持它们之间的平衡。 总结起来,Kafka 分区与 brokers 之间的关系主要体现在分区分布、吞吐量和并行度以及容错性方面。分区的设置应考虑到消费者的并行度、吞吐量需求和副本的容错性要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值