Kafka流媒体重置问题

时间:2018-07-25 20:46:00

标签: scala apache-spark apache-kafka apache-kafka-streams kafka-streams-scala

我一直在尝试构建一个用于Spark的Kafka Streaming应用程序。我有一个静态数据集进行测试。一次运行我的代码后,Kafka设置当前偏移量,以使我无法在第二次运行时重新处理数据。运行kafka-streams-application-reset可能会重置偏移量。但是,重新运行我的代码将导致空GlobalKTable。我能够重新分析数据的唯一方法是更改​​我在Kafka连接中的ID。这就是我在做什么。

在Kafka中设置示例数据:

kafka-console-producer --broker-list localhost:9092 \
    --topic testTopic \
    --property "parse.key=true" \
    --property "key.separator=:"

1:abcd
2:bcde
3:cdef
4:defg
5:efgh
6:fghi
7:ghij
8:hijk
9:ijkl
10:jklm

标量代码:

//Streams imports - need to update Kafka
import org.apache.kafka.common.serialization.Serdes
//import org.apache.kafka.common.utils.Bytes
import org.apache.kafka.streams._
import org.apache.kafka.streams.kstream.{GlobalKTable, KStream, KTable, Materialized, Produced, KStreamBuilder}
import org.apache.kafka.streams.StreamsConfig
import org.apache.kafka.streams.state.{KeyValueIterator, QueryableStoreTypes, ReadOnlyKeyValueStore, KeyValueStore}
import org.apache.kafka.streams.state.Stores
import org.apache.kafka.clients.consumer.{ConsumerConfig, KafkaConsumer}
import java.util.{Properties}


val kafkaServer = "127.0.0.1:9092"
val p = new Properties()
p.put(StreamsConfig.APPLICATION_ID_CONFIG, "testStream")
p.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaServer)
p.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass())
p.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass())
p.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest")
p.put(StreamsConfig.CLIENT_ID_CONFIG, "test-consumer-stream")
val config = new StreamsConfig(p)


val builder: StreamsBuilder = new StreamsBuilder()
val imkvs = Stores.inMemoryKeyValueStore("testLookup-stream")
val sBuilder = Stores.keyValueStoreBuilder(imkvs, Serdes.String, Serdes.String).withLoggingDisabled().withCachingEnabled()

val gTable: GlobalKTable[String, String] = builder.globalTable("testTopic", Materialized.as(imkvs).withKeySerde(Serdes.String()).withValueSerde(Serdes.String()).withCachingDisabled())
val streams: KafkaStreams = new KafkaStreams(builder.build(), config)
streams.start()

val read: ReadOnlyKeyValueStore[String, String] = streams.store(gTable.queryableStoreName(), QueryableStoreTypes.keyValueStore[String, String]())
val hexLookup = "2"
println(read.get(hexLookup))

val iter: KeyValueIterator[String, String] = read.all()
while(iter.hasNext) {
  val next = iter.next()
  println(next.key + ": " + next.value)
}

流重置命令:

kafka-streams-application-reset --application-id testStream \
    --bootstrap-servers localhost:9092 \
    --to-earliest

1)我是否编码有误,或者kafka-streams-application-reset工作不正常? 2)我曾希望使用inMemoryKeyValueStore会导致Kafka无法跟踪当前的偏移量;有没有办法强制GlobalKTable不保留当前偏移量?我想始终搜索整个数据集。

软件版本:
卡夫卡1.1.1-1
汇合4.1.1-1
Spark-Scala 2.3.1
kafka-clients 1.1.0
kafka-streams 1.1.0

1 个答案:

答案 0 :(得分:1)

如果要从空的内部状态重新启动应用程序并重新处理偏移量为0的数据,则必须提供“ -input-topics ”参数,并以逗号分隔主题列表。

export class AppComponent implements OnInit {

  title = 'app';
  selectedBot;
  botList = [
    {'_id': 1, name: 'good bot'},
    {'_id': 2, name: 'bad bot'}
  ];
  @ViewChild('form') form: NgForm;


  constructor(private http: Http) {
  }
  ngOnInit() {
    this.form.valueChanges.subscribe((value) => {
      console.log('form data changed', value);
      /*NOT BEING TRIGGEERED WHEN ANY <li> IN <ul> is being clicked*/
    });
  }

  botSelected(bot) {
    this.selectedBot = bot;
  }

}

您可以在这里找到更多详细信息:https://kafka.apache.org/10/documentation/streams/developer-guide/app-reset-tool

关于GlobalKTable,理想情况下,它是流/主题之上的实例化视图,就像任何其他可查询存储一样。
GlobalKTable始终始终“最早”应用“ auto.offset.reset”策略,而不考虑StreamsConfig中的指定值。
因此,它应该允许您随时查询整个表。