Apache spark 没有分区的当前分配:<;主题划分>;在重新加入期间;在运行时期间添加新分区不起作用

Apache spark 没有分区的当前分配:<;主题划分>;在重新加入期间;在运行时期间添加新分区不起作用,apache-spark,apache-kafka,spark-streaming,kafka-consumer-api,Apache Spark,Apache Kafka,Spark Streaming,Kafka Consumer Api,我有一个使用的流媒体应用程序。我从一个分区、一个消费者实例和三个代理开始。 我想按顺序做以下两件事: 1) 在运行时向主题添加新分区,我使用: bin/kafka-topics.sh --zookeeper 192.168.101.164:2181 --alter --topic topic10 --partitions 2 2) 将新的使用者实例添加到特定的使用者组中,我通过将相同的使用者代码作为单独的进程来执行此操作 但是,在执行1时:我没有看到(唯一)消费者实例使用新添加的分区。它只使用

我有一个使用的流媒体应用程序。我从一个分区、一个消费者实例和三个代理开始。 我想按顺序做以下两件事:

1) 在运行时向主题添加新分区,我使用:

bin/kafka-topics.sh --zookeeper 192.168.101.164:2181 --alter --topic topic10 --partitions 2
2) 将新的使用者实例添加到特定的使用者组中,我通过将相同的使用者代码作为单独的进程来执行此操作

但是,在执行1时:我没有看到(唯一)消费者实例使用新添加的分区。它只使用zookeeper最初自动分配的分区

在执行2时:a)自动为新实例分配一个分区
topic10-1
,该分区成功执行,但b)第一个实例在重新平衡后重新加入,但失败,出现以下错误(a)

我注意到新实例成功加入组的时间与第一个实例每次失败的时间完全匹配。 我使用的是
Kafka版本0.10.0,Kafka客户端版本0.10.0.1,spark-streaming-Kafka-0-10_2.11版本2.1.1

最后,以下是消费者代码:

    SparkConf sparkConf = new  SparkConf().setMaster("local[5]").setAppName("SparkConsumer1").set("spark.driver.host", "localhost");

    JavaSparkContext sc = new JavaSparkContext(sparkConf);

    // Create a StreamingContext with a 1 second batch size
    JavaStreamingContext jssc = new JavaStreamingContext(sc, Durations.seconds(15));    
    List<String> topicSet = Arrays.asList(topics.split(","));

    Map<String, Object> kafkaParams = new HashMap<>();
    kafkaParams.put("bootstrap.servers", brokers);
    kafkaParams.put("auto.offset.reset", "latest");
    kafkaParams.put("group.id", "SparkConsumerGrp3");
    kafkaParams.put("key.deserializer", StringDeserializer.class);
    kafkaParams.put("value.deserializer", StringDeserializer.class);
    kafkaParams.put("zookeeper.connect", "192.168.101.164:2181");
    kafkaParams.put("enable.auto.commit", "true");
    kafkaParams.put("auto.commit.interval.ms", "1000");
    kafkaParams.put("session.timeout.ms","30000");

    final JavaInputDStream<ConsumerRecord<String, String>> messages =
              KafkaUtils.createDirectStream(
                jssc,
                LocationStrategies.PreferBrokers(),
                ConsumerStrategies.<String, String>Subscribe(topicSet, kafkaParams)
              );
SparkConf SparkConf=new SparkConf().setMaster(“local[5]”).setAppName(“SparkConsumer1”).set(“spark.driver.host”、“localhost”);
JavaSparkContext sc=新的JavaSparkContext(sparkConf);
//创建具有1秒批量大小的StreamingContext
JavaStreamingContext jssc=新的JavaStreamingContext(sc,Durations.seconds(15));
List topicSet=Arrays.asList(topics.split(“,”);
Map kafkaParams=新HashMap();
kafkaParams.put(“bootstrap.servers”,brokers);
kafkaParams.put(“自动偏移重置”、“最新”);
kafkaParams.put(“group.id”,“SparkConsumerGrp3”);
kafkaParams.put(“key.deserializer”,StringDeserializer.class);
kafkaParams.put(“value.deserializer”,StringDeserializer.class);
卡夫卡帕拉姆斯.普特(“zookeeper.connect”,“192.168.101.164:2181”);
kafkaParams.put(“enable.auto.commit”、“true”);
kafkaParams.put(“auto.commit.interval.ms”,“1000”);
kafkaParams.put(“session.timeout.ms”,“30000”);
最终JavaInputDStream消息=
KafkaUtils.createDirectStream(
jssc,
位置策略。首选代理(),
ConsumerStrategies.Subscribe(topicSet,kafkaParams)
);
我也发现了类似的东西,但没有真正的答案。我真的非常感谢任何帮助。谢谢

更新
对于1)我能够让消费者从新添加的分区获取数据。我们可以使用默认设置为
300000
metadata.max.age.ms
配置刷新元数据的频率

你找到解决办法了吗?你找到解决办法了吗?
    SparkConf sparkConf = new  SparkConf().setMaster("local[5]").setAppName("SparkConsumer1").set("spark.driver.host", "localhost");

    JavaSparkContext sc = new JavaSparkContext(sparkConf);

    // Create a StreamingContext with a 1 second batch size
    JavaStreamingContext jssc = new JavaStreamingContext(sc, Durations.seconds(15));    
    List<String> topicSet = Arrays.asList(topics.split(","));

    Map<String, Object> kafkaParams = new HashMap<>();
    kafkaParams.put("bootstrap.servers", brokers);
    kafkaParams.put("auto.offset.reset", "latest");
    kafkaParams.put("group.id", "SparkConsumerGrp3");
    kafkaParams.put("key.deserializer", StringDeserializer.class);
    kafkaParams.put("value.deserializer", StringDeserializer.class);
    kafkaParams.put("zookeeper.connect", "192.168.101.164:2181");
    kafkaParams.put("enable.auto.commit", "true");
    kafkaParams.put("auto.commit.interval.ms", "1000");
    kafkaParams.put("session.timeout.ms","30000");

    final JavaInputDStream<ConsumerRecord<String, String>> messages =
              KafkaUtils.createDirectStream(
                jssc,
                LocationStrategies.PreferBrokers(),
                ConsumerStrategies.<String, String>Subscribe(topicSet, kafkaParams)
              );