Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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
Apache kafka 卡夫卡流:混合和匹配PAPI和DSL KTable非共分区_Apache Kafka_Scalatest_Apache Kafka Streams_Embedded Kafka - Fatal编程技术网

Apache kafka 卡夫卡流:混合和匹配PAPI和DSL KTable非共分区

Apache kafka 卡夫卡流:混合和匹配PAPI和DSL KTable非共分区,apache-kafka,scalatest,apache-kafka-streams,embedded-kafka,Apache Kafka,Scalatest,Apache Kafka Streams,Embedded Kafka,我有一个混合匹配的Scala拓扑,其中主要工作是一个PAPI处理器,其他部分通过DSL连接 EventsProcessor: INPUT: eventsTopic OUTPUT: visitorsTopic (and others) 整个主题(包括原始eventsTopic)中的数据通过一个包含两个字段的DoubleKey进行分区。 访客通过水槽发送至visitorsTopic: .addSink(VISITOR_SINK_NAME, visitorTopicName, Double

我有一个混合匹配的Scala拓扑,其中主要工作是一个PAPI处理器,其他部分通过DSL连接

EventsProcessor: 
INPUT: eventsTopic
OUTPUT: visitorsTopic (and others)
整个主题(包括原始
eventsTopic
)中的数据通过一个包含两个字段的
DoubleKey
进行分区。 访客通过水槽发送至
visitorsTopic

.addSink(VISITOR_SINK_NAME, visitorTopicName,
    DoubleKey.getSerializer(), Visitor.getSerializer(), visitorSinkPartitioner, EVENT_PROCESSOR_NAME)
在DSL中,我在这个主题上创建了一个KV KTable:

val visitorTable = builder.table(
  visitorTopicName,
  Consumed.`with`(DoubleKey.getKafkaSerde(),
  Visitor.getKafkaSerde()),
  Materialized.as(visitorStoreName))
我稍后将其连接到
事件处理器

topology.connectProcessorAndStateStores(EVENT_PROCESSOR_NAME, visitorStoreName)
所有内容都是共同分区的(通过DoubleKey)<代码>visitorSinkPartitioner执行典型的模运算:

Math.abs(partitionKey.hashCode % numPartitions)
在PAPI processor EventsProcessor中,我查询此表以查看是否已经存在访问者

但是,在我的测试中(使用,但这不会有什么区别),如果我用一个分区运行它们,一切都很好(EventsProcessor在同一个
DoubleKey
上的两个事件上检查KTable,在第二个事件上-有一些延迟-它可以看到存储上存在的
访问者
),但是如果我用更高的数字运行它,EventProcessor从未在存储中看到该值

但是,如果我通过API检查存储(迭代
store.all()
),记录就在那里。所以我知道它一定要去不同的分区

由于KTable应该处理其分区上的数据,并且所有内容都发送到同一分区(使用调用相同代码的显式分区器),因此KTable应该在同一分区上获取该数据

我的假设正确吗?会发生什么

KafkaStreams 1.0.0,Scala 2.12.4


另外,当然可以通过PAPI而不是StreamsBuilder.table()将
放在PAPI上创建存储,因为这肯定会使用与代码运行相同的分区,但这是不可能的。

是的,假设是正确的

如果它有助于任何人:

我在将分区程序传递到Scala EmbeddedKafka库时遇到问题。在其中一个测试套件中,它没有正确执行。 现在,按照重构的健康实践,我在这个拓扑的所有套件中都使用了这个方法

def getEmbeddedKafkaTestConfig(zkPort: Int, kafkaPort: Int) : 
    EmbeddedKafkaConfig = {
    val producerProperties = Map(ProducerConfig.PARTITIONER_CLASS_CONFIG ->
        classOf[DoubleKeyPartitioner].getCanonicalName)
    EmbeddedKafkaConfig(kafkaPort = kafkaPort, zooKeeperPort = zkPort, 
        customProducerProperties = producerProperties)
}