Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 卡夫卡消费者调查何时返回空记录?_Java_Scala_Apache Spark_Apache Kafka - Fatal编程技术网

Java 卡夫卡消费者调查何时返回空记录?

Java 卡夫卡消费者调查何时返回空记录?,java,scala,apache-spark,apache-kafka,Java,Scala,Apache Spark,Apache Kafka,如下图所示,我的代码是一个高级使用者,在kafka服务器中获取一个有32个分区的主题,我不明白为什么有时我从consumer.poll()获得一个空返回。 我尝试增加轮询超时,然后当我将超时增加到1000时,每个轮询都有返回数据,而我将超时设置为10或0,然后我看到很多空返回 有人能告诉我如何设置正确的超时吗 def main(args: Array[String]): Unit = { val props = new Properties() props.put("boot

如下图所示,我的代码是一个高级使用者,在kafka服务器中获取一个有32个分区的主题,我不明白为什么有时我从consumer.poll()获得一个空返回。 我尝试增加轮询超时,然后当我将超时增加到1000时,每个轮询都有返回数据,而我将超时设置为10或0,然后我看到很多空返回

有人能告诉我如何设置正确的超时吗

  def main(args: Array[String]): Unit = {
    val props = new Properties()
    props.put("bootstrap.servers", "kafka-01:9098")
    props.put("group.id", "kch1")
    props.put("enable.auto.commit", "true")
    props.put("auto.commit.interval.ms", "1000")
    props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
    props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")

    //props.put("max.poll.records", "1000")
    val consumers = new Array[KafkaConsumer[String, String]](16)
    for(i <- 0 to 15) {
      consumers(i) = new KafkaConsumer[String, String](props)
      consumers(i).subscribe(util.Arrays.asList("veh321"))
    }
    var cnt = 0
    var cacheIterator: Iterator[ConsumerRecord[String, String]] = null
    for(i <- 0 to 15) {
      new Thread(new Runnable {
        override def run(): Unit = {
          var finish = false
          while(!finish) {
            val start = System.currentTimeMillis()
            cacheIterator = consumers(i).poll(100).iterator()
            val end = System.currentTimeMillis() - start
            if (end > 10 ) {
              println(s"${Thread.currentThread().getId} + Duration is ${end}, ${cacheIterator.hasNext} ${cacheIterator.size}")
            }
          }
        }
      }).start()
    }
def main(args:Array[String]):单位={
val props=新属性()
道具放置(“引导服务器”,“卡夫卡-01:9098”)
道具放置(“组id”、“kch1”)
props.put(“enable.auto.commit”、“true”)
props.put(“auto.commit.interval.ms”,“1000”)
put(“key.deserializer”、“org.apache.kafka.common.serialization.StringDeserializer”)
put(“value.deserializer”、“org.apache.kafka.common.serialization.StringDeserializer”)
//道具放置(“最大投票记录”,“1000”)
val consumers=新数组[KafkaConsumer[String,String]](16)

对于(iJava consumer,通过调用Java.nio.channels.Selector.select(超时),使用Linux的epoll作为底层实现方案。如果您只给它100毫秒的时间来测试在短时间间隔内准备了多少个SelectionKeys,它很可能什么也不返回


此外,在相同的100毫秒内,消费者将执行一些其他工作,包括轮询协调器状态,因此记录轮询的实时间隔明显小于100毫秒,这使得检索一些真正有用的内容变得更加困难。

因此,如果我将轮询超时设置为1000毫秒,我可以看到所有轮询都有数据返回,其中一些成本约为200美元ms,而其他的只需几毫秒,那么当轮询开销需要数百秒时会发生什么呢?是否有任何参数可用于此操作?在检索记录之前,需要执行许多底层操作,例如获取元数据、管理连接和组等。您可以调整
max.poll.records
以控制消息如果您使用的是Java consumer,请计算单轮轮询。感谢您的帮助,因此如果我想要大吞吐量,我可以设置一个大poll.records和一个大poll timeout,以减少轮询次数,对吗?坦率地说,我不同意。TPS和configs之间没有适用于任何地方的这种调优。彻底的性能测试这是需要的。