Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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
Scala Kafka Streams PAPI:抽象处理器对象创建行为_Scala_Apache Kafka_Apache Kafka Streams - Fatal编程技术网

Scala Kafka Streams PAPI:抽象处理器对象创建行为

Scala Kafka Streams PAPI:抽象处理器对象创建行为,scala,apache-kafka,apache-kafka-streams,Scala,Apache Kafka,Apache Kafka Streams,我有一个Kafka Streams拓扑,其中包含一个AbstractProcessor(实际上是两个)。 在其中一个例子中,我使用标点API和挂钟时间来安排处理所需的一些参考数据的刷新。 我在任务开始时做,然后每隔一段时间安排一次(比如说1小时)。 num.stream.threads配置为2 例如,我有如下代码: def loadReferenceData() = { logger.info("Loading All Reference Data...") // ato

我有一个Kafka Streams拓扑,其中包含一个AbstractProcessor(实际上是两个)。 在其中一个例子中,我使用
标点API
挂钟时间
来安排处理所需的一些参考数据的刷新。 我在任务开始时做,然后每隔一段时间安排一次(比如说1小时)。
num.stream.threads
配置为2

例如,我有如下代码:

def loadReferenceData() = {
      logger.info("Loading All Reference Data...")
      // atomically (re)load some data
}

override def init(context: ProcessorContext) = {
      super.init(context)
      logger.info("Loading reference data initially...")
      loadReferenceData()

      context.schedule(1000 * reloadDataSeconds, PunctuationType.WALL_CLOCK_TIME, (timestamp) => {
        loadReferenceData()
        context.commit(); // Unsure if necessary
      });
}
在没有传入记录的情况下,在运行应用程序的单个实例的日志中,我可以看到init的以下日志:

    [2019-06-11 08:54:19,518] INFO Loading All Reference Data... (com.divvit.dp.streams.applications.StreamProcessor)
    [2019-06-11 08:53:31,080] INFO Loading All Reference Data... (com.divvit.dp.streams.applications.StreamProcessor)
    [2019-06-11 08:53:29,713] INFO Loading All Reference Data... (com.divvit.dp.streams.applications.StreamProcessor)
    [2019-06-11 08:53:29,682] INFO Loading All Reference Data... (com.divvit.dp.streams.applications.StreamProcessor)
    [2019-06-11 07:54:20,855] INFO Loading All Reference Data... (com.divvit.dp.streams.applications.StreamProcessor)
    [2019-06-11 07:54:19,714] INFO Loading All Reference Data... (com.divvit.dp.streams.applications.StreamProcessor)
    [2019-06-11 07:54:19,516] INFO Loading All Reference Data... (com.divvit.dp.streams.applications.StreamProcessor)
    [2019-06-11 07:53:31,036] INFO Loading All Reference Data... (com.divvit.dp.streams.applications.StreamProcessor)
    [2019-06-11 07:53:29,668] INFO Loading All Reference Data... (com.divvit.dp.streams.applications.StreamProcessor)
    [2019-06-11 07:53:29,653] INFO Loading All Reference Data... (com.divvit.dp.streams.applications.StreamProcessor)
    [2019-06-11 06:54:20,845] INFO Loading All Reference Data... (com.divvit.dp.streams.applications.StreamProcessor)
    [2019-06-11 06:54:19,726] INFO Loading All Reference Data... (com.divvit.dp.streams.applications.StreamProcessor)
因此,似乎每小时都有大量日志用于输入
loadReferenceData
。我希望每小时只看到2个条目(2个线程),但还有更多条目(通常是6个)

在日志中,我只在应用程序创建开始时见过6次处理器的创建:

[2019-06-10 16:54:19,849] INFO Loading reference data initially... (com.divvit.dp.streams.applications.StreamProcessor)
[2019-06-10 16:54:18,231] INFO Loading reference data initially... (com.divvit.dp.streams.applications.StreamProcessor)
[2019-06-10 16:54:17,874] INFO Loading reference data initially... (com.divvit.dp.streams.applications.StreamProcessor)
[2019-06-10 16:53:29,675] INFO Loading reference data initially... (com.divvit.dp.streams.applications.StreamProcessor)
[2019-06-10 16:53:27,132] INFO Loading reference data initially... (com.divvit.dp.streams.applications.StreamProcessor)
[2019-06-10 16:53:24,923] INFO Loading reference data initially... (com.divvit.dp.streams.applications.StreamProcessor)
所以这是有意义的:处理器创建一次,每小时更新一次

但是,当我将更多的负载放入应用程序时,我可以经常看到新处理器对象的创建

  • 在什么情况下,Kafka Streams将创建这些处理器的新实例
  • 如何知道我的应用程序实例将创建多少处理器实例
  • 如果可以根据Kafka Streams的判断关闭/创建处理器,那么对于这些“外部”操作来说,标点API似乎有些过头了(或者根本不是为此而设计的),而一个单独的定期更新线程会更好地实现这一点,不是吗

Kafka Streams将在输入主题上为每个分区创建一个处理器,每个处理器都有自己的时间表。(如果使用状态存储,这实际上非常有用,因为状态也将被分区。)

如果要对内部状态应用常规操作,则调度程序非常有用。它很好地停止了常规处理,并确保您在调度操作期间所做的一切都是一致的。如果手头的任务与流媒体本身无关,那么单独的线程也可以

如果您选择了单独的线程,请确保在出现错误时适当地终止它。否则,您将看到应用程序将挂起在计时器线程上,但不会使用任何卡夫卡消息

增加线程数(
num.stream.threads
)意味着将同时使用多个分区。它具有与相邻启动多个实例相同的行为。看