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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 前端vue生成二维码带logo并且可以点击下载保存_vue实现扫描二维码

    前端vue生成二维码带logo并且可以点击下载保存_vue实现扫描二维码下载插件:npminstallvue-qr<template><divclass=”sg-qrcode”><vue-qr:text=”qrcodeText”:correctLevel=”3″:size=”250″:margin=”10″colorDark=”#000″colorLight=”white”backgroundColor=”w…

    2022年10月3日
    1
  • JQuery的submitHandler

    之前做表单验证,有设置submitHandlersubmitHandler:function(){$(“form”).submit();}这样表单验证通过后会自动提交。。。。改为submitHandler:function(form){form.submit();}否则,button按钮提交表单之后,表单会提交两次,前端造成stack溢出…

    2022年4月5日
    271
  • JVM成长之路,记录一次内存溢出导致频繁FGC的问题排查及解决「建议收藏」

    JVM成长之路,记录一次内存溢出导致频繁FGC的问题排查及解决「建议收藏」现象:现象截图:内存:命令:jmap-heap30069GC截图:FGC次数19529次!!!何等的恐怖!!!!!命令:jstat-gcutil300691000现象描述:Node模块启动后收到请求却未能响应。一直在频繁的FGC。新生代内

    2022年6月19日
    58
  • BAT批处理解决ARP***

    BAT批处理解决ARP***

    2021年8月21日
    73
  • SpringCloud与Dubbo的区别[通俗易懂]

    SpringCloud与Dubbo的区别[通俗易懂]1.SpringCloud与Dubbo的区别两者都是现在主流的微服务框架,但却存在不少差异:初始定位不同:SpringCloud定位为微服务架构下的一站式解决方案;Dubbo是SOA时代的产物,它的关注点主要在于服务的调用和治理生态环境不同:SpringCloud依托于Spring平台,具备更加完善的生态体系;而Dubbo一开始只是做RPC远程调用,生态相对匮乏,现在逐渐丰富起来。调用方式:SpringCloud是采用Http协议做远程调用,接口一般是Rest风格,比较灵活;Dubbo是采用

    2022年6月11日
    35
  • 进销存软件开发视频教程(C#版,共70讲)

    进销存软件开发视频教程(C#版,共70讲)课程出处:学途无忧网课程观看地址:http://www.xuetuwuyou.com/course/28  本教程以进销存管理实务为基础,采用时下主流的开发工具(VisualStudio2008+SQLServer2005),使用流行的C#语言。涵盖软件开发的全部过程,包括需求分析、数据库设计、架构设计、程序编码、软件发布。讲解以深入浅出为主,同时循序渐进。对软件开发过

    2022年5月8日
    42

发表回复

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

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