kafka add partitions function「建议收藏」

kafka add partitions function「建议收藏」代码功能在java代码中调用scala接口addPartitions.使用场景在kafka中如果需要定制kafka-topic的管理,那么其中一个功能很可能会用到:增加partition数量。但是在kafka-1.0.x之上的版本的AdminUtils中预留了相关的apiaddPartitions,具体功能的实现可以参考下面源码(scala):/***Addparti…

大家好,又见面了,我是你们的朋友全栈君。

代码功能

在 java 代码中调用 scala 接口 addPartitions.

使用场景

在kafka中如果需要定制kafka-topic的管理,那么其中一个功能很可能会用到:增加partition数量

但是在kafka-1.0.x之上的版本的AdminUtils中预留了相关的api addPartitions,具体功能的实现可以参考下面源码(scala):

/** * Add partitions to existing topic with optional replica assignment * * @param zkUtils Zookeeper utilities * @param topic Topic for adding partitions to * @param existingAssignment A map from partition id to its assigned replicas * @param allBrokers All brokers in the cluster * @param numPartitions Number of partitions to be set * @param replicaAssignment Manual replica assignment, or none * @param validateOnly If true, validate the parameters without actually adding the partitions * @return the updated replica assignment */
 @deprecated("This method is deprecated and will be replaced by kafka.zk.AdminZkClient.", "1.1.0")
 def addPartitions(zkUtils: ZkUtils,
                   topic: String,
                   existingAssignment: Map[Int, Seq[Int]],
                   allBrokers: Seq[BrokerMetadata],
                   numPartitions: Int = 1,
                   replicaAssignment: Option[Map[Int, Seq[Int]]] = None,
                   validateOnly: Boolean = false): Map[Int, Seq[Int]] = {
   val existingAssignmentPartition0 = existingAssignment.getOrElse(0,
     throw new AdminOperationException(
       s"Unexpected existing replica assignment for topic '$topic', partition id 0 is missing. " +
         s"Assignment: $existingAssignment"))

   val partitionsToAdd = numPartitions - existingAssignment.size
   if (partitionsToAdd <= 0)
     throw new InvalidPartitionsException(
       s"The number of partitions for a topic can only be increased. " +
         s"Topic $topic currently has ${existingAssignment.size} partitions, " +
         s"$numPartitions would not be an increase.")

   replicaAssignment.foreach { proposedReplicaAssignment =>
     validateReplicaAssignment(proposedReplicaAssignment, existingAssignmentPartition0,
       allBrokers.map(_.id).toSet)
   }

   val proposedAssignmentForNewPartitions = replicaAssignment.getOrElse {
     val startIndex = math.max(0, allBrokers.indexWhere(_.id >= existingAssignmentPartition0.head))
     AdminUtils.assignReplicasToBrokers(allBrokers, partitionsToAdd, existingAssignmentPartition0.size,
       startIndex, existingAssignment.size)
   }
   val proposedAssignment = existingAssignment ++ proposedAssignmentForNewPartitions
   if (!validateOnly) {
     info(s"Creating $partitionsToAdd partitions for '$topic' with the following replica assignment: " +
       s"$proposedAssignmentForNewPartitions.")
     // add the combined new list
     AdminUtils.createOrUpdateTopicPartitionAssignmentPathInZK(zkUtils, topic, proposedAssignment, update = true)
   }
   proposedAssignment

 }

复制代码

虽然 java 和 scala 之间的契合性很强,但是上述的参数列表在 java 中实现并调用该接口的复杂度还是比较高的,本人也是花费了一定的时间才调试通过的。

具体实现

下面部分是在 java 中调用该接口的实现:

public class addPartitions {
   public static boolean addPartitions(String zookeeperUri, String topic, int partitionNum) {
   	boolean succeed = true;
       ZkClient zkClient = createZkClient(zookeeperUri);
       ZkUtils zkUtils = ZkUtils.apply(zkClient, JaasUtils.isZkSecurityEnabled());

       //get existing assignment
       Seq<String> names = JavaConverters.asScalaBufferConverter(Arrays.asList(topic)).asScala();
       scala.collection.mutable.Map<String, scala.collection.Map<Object, Seq<Object>>> assignment = (scala.collection.mutable.Map<String, scala.collection.Map<Object, Seq<Object>>>)zkUtils.getPartitionAssignmentForTopics(names);
       Map<String, scala.collection.Map<Object, Seq<Object>>> partitionaAssigmentMap = JavaConverters.mutableMapAsJavaMapConverter(assignment).asJava();

       //get all brokers metadata in the cluster
       Seq<BrokerMetadata> allBrokerMeta = AdminUtils.getBrokerMetadatas(zkUtils, RackAwareMode.Enforced$.MODULE$, scala.Option.apply(null));

       try {
           AdminUtils.addPartitions(zkUtils, topic, partitionaAssigmentMap.get(topic), allBrokerMeta, partitionNum, Option.empty(), false);
       } catch (InvalidPartitionsException exception) {
           System.out.println("exception", exception);
           succeed = false;
       }
       return succeed;
   }
}
复制代码

此外,推荐 java 和 scala 之间格式转化的神器类 JavaConverters .

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153334.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android scaleanimation动画,【Android动画九章】-RotateAnimation(旋转动画)和ScaleAnimation(尺寸动画)…[通俗易懂]

    android scaleanimation动画,【Android动画九章】-RotateAnimation(旋转动画)和ScaleAnimation(尺寸动画)…[通俗易懂]【Android动画九章】-RotateAnimation(旋转动画)和ScaleAnimation(尺寸动画)publicabstractclassAnimationextendsObjectimplementsCloneablejava.lang.Object↳Android.view.animation.AnimationKnownDirectSubclassesAlphaAn…

    2022年8月31日
    2
  • ssh配置免密码登录(linux免密登录)

    由于公司的生产环境有很多台Linux的CentOS服务器,为了方便机子(假设两台机子A,B)互相之间免密ssh,scp命令操作,配置如下1.在A、B上分别创建本机的公钥和私钥,输入命令后连续三次回车ssh-keygen-trsa2.查看公私钥的文件生成情况cd~/.ssh/ls看到列表有2个文件:文件说明:id_rsa:生成的私钥文件id_rsa.pub:生成的公钥文件3….

    2022年4月14日
    34
  • 纠结应该先学Python还是Java?看完就有数了

    纠结应该先学Python还是Java?看完就有数了准备学习编程前,你一定会打开电脑搜索一下“先学Python还是先学Java?”扑面而来的是海量回答。如果你问一名Java程序员,肯定会建议你先学Java,因为他们认为Python像个乳臭未干的黄毛小子。但如果你问Python程序员,可能会得到一个完全相反的答案,他们认为Java是刻板啰嗦的老大爷,而人生苦短,我用Python。但别担心,今天我们将会从语言特色学习曲线职业方向市场需求…

    2022年7月8日
    20
  • 分析微商分销系统的缺陷

    分析微商分销系统的缺陷微商时代下,微商系统也十分受欢迎,笔者之前在网上浏览过许多关于微商分销系统的文章,大多都在谈论微商分销系统怎么怎么好用,却很少有提及其中的缺陷。那今天笔者就想和大家伙谈谈微商分销系统有什么缺陷?以三级分销为例,先来了解下微商分销系统的规则。理想的结构是这样的:总部发展A分销商,A-发展二级B,B-发展三级C。好了,A收到BC的提成,B收到C的提成,C纯赚差价利润。理想的设计往…

    2022年5月13日
    37
  • 小米手机-解BL锁+开ROOT权限

    小米手机-解BL锁+开ROOT权限在小米社区和网址https://miuiver.com/上,有MIUI的历史版本,还有刷机教程等等本文是参考上述的教程,并结合自己在刷机过程中,出现的问题进行记录并得到解决方案下面主要是,重要部分,同时还有一些容易出错的地方解BL锁要提前,在设置–更多设置–开发者模式–设备解锁状态中,绑定账号和设备,注意的地方,不要重复绑定设备,不然时间会重新计算的,吃亏了2次。只要登陆过一个小米账号,点击绑定一次即可。如果没有找到开发者模式,就先设置–我的设备–全部参数–.

    2022年6月10日
    73
  • git和github gitlab的区别_gitlab和git区别

    git和github gitlab的区别_gitlab和git区别GitHub是在线代码仓库,全世界只有GitHub一家,大家把代码存储在人家的服务器上。Gitlab相当于小型的GitHub,你可以在本地搭建一个属于你自己的类似GitHub仓库,让小伙伴把代码存储在上面,这样代码只有你们几个人能看见,但是你要存在GitHub上,全世界都能看见git是一种版本控制系统,是一个命令,是一种工具gitlib是用于实现git功能的开发库github是一个基于git实现的在线代码仓库,包含一个网站界面,向互联网开放gitlab是一个基于git实现的在线代码仓

    2025年8月9日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号