Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.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 ksqldb流是否要求两个模式具有相同数量的字段?_Apache Kafka_Ksqldb - Fatal编程技术网

Apache kafka ksqldb流是否要求两个模式具有相同数量的字段?

Apache kafka ksqldb流是否要求两个模式具有相同数量的字段?,apache-kafka,ksqldb,Apache Kafka,Ksqldb,很抱歉,如果这在文档中是明确的,但我没有找到它。 我目前正在学习本教程,并根据我的需要对其进行调整,我面临一些问题,我想知道这是否适合我 我想做的和想象我现在的处境非常相似 TL/DR: 我在Kafka中有一个Protobuf格式的主题中的数据,我想创建一个流,将该Protobuf转换为Avro格式的新主题,一旦它成为Avro格式,我将有一个连接器使用它并将其转储到s3存储桶中 现在想象一下,我有一个卡夫卡主题搜索请求proto,格式为protobuf 然后我想创建一个名为SearchRequ

很抱歉,如果这在文档中是明确的,但我没有找到它。 我目前正在学习本教程,并根据我的需要对其进行调整,我面临一些问题,我想知道这是否适合我

我想做的和想象我现在的处境非常相似

TL/DR: 我在Kafka中有一个Protobuf格式的主题中的数据,我想创建一个流,将该Protobuf转换为Avro格式的新主题,一旦它成为Avro格式,我将有一个连接器使用它并将其转储到s3存储桶中

现在想象一下,我有一个卡夫卡主题搜索请求proto,格式为protobuf 然后我想创建一个名为SearchRequest_avro的主题,格式为avro

例如,我的protobuf是

syntax = "proto3";

message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
}
我的第一个问题是我的SearchRequestKSQL流是否需要所有字段,或者我是否可以这样做

CREATE STREAM SearchRequest_proto (query VARCHAR, page_number INT, result_per_page INT) WITH (KAFKA_TOPIC='SearchRequest_proto', VALUE_FORMAT='PROTOBUF');
或者我可以要这样的东西:

CREATE STREAM SearchRequest_proto (query VARCHAR, page_number INT) WITH (KAFKA_TOPIC='SearchRequest_proto', VALUE_FORMAT='PROTOBUF');
我的问题是因为我有一个更复杂的原型,我正在尝试只使用一些字段进行测试,而不需要做所有的测试,当我从第一个流创建第二个流时,似乎什么都没有出现

CREATE STREAM SearchRequest_avro WITH (KAFKA_TOPIC='SearchRequest_avro', REPLICAS=1, PARTITIONS=1, VALUE_FORMAT='AVRO') AS SELECT * FROM SearchRequest_proto;
之后,如果我进入我的卡夫卡消费群体,我可以看到第二个流在卡夫卡注册为消费者。 我的第一个protobuf主题包含消息,但不知何故,我甚至无法在我的主题上使用打印。现在显示的是,我收到了以下消息:

ksql> show streams;

 Stream Name   | Kafka Topic                 | Format   
--------------------------------------------------------
 OBJ_POS_AVRO  | com.obj_pos_avro            | AVRO     
 OBJ_POS_PROTO | com.obj_pos_proto           | PROTOBUF 
--------------------------------------------------------
ksql> print "com.obj_pos_proto";
Could not find topic 'com.obj_pos_proto', or the KSQL user does not have permissions to list the topic. Topic names are case-sensitive.
ksql> print "com.obj_pos_avro";
Could not find topic 'com.obj_pos_avro', or the KSQL user does not have permissions to list the topic. Topic names are case-sensitive.
我的问题是因为我看到消费者注册了,但没有任何补偿,我想知道,因为我没有隐式地声明protobuf中的所有fiels都是流的一部分,如果它因此失败了?或者是别的什么

还有一个额外的问题,如果有人知道的话,我做了一些谷歌搜索,但没有找到,我是否可以使用模式注册表注册我的protobuf,这样流就可以自动读取它,而不需要指定所有这些字段

或者任何一种可以使用protobufs并生成流或avro格式文件的库

谢谢你的反馈,很抱歉发了这么长的帖子,你也可以想象我对卡夫卡这个话题肯定不是很了解,所以对我来说这是一个新话题

编辑: 我自己做了一个快速测试,它确实支持更少的字段,所以这不是问题。 但是,我在序列化反序列化过程中遇到了一个错误,这一定是我的配置问题:

[2020-09-21 08:19:32,836] INFO KafkaProtobufDeserializerConfig values: 
    bearer.auth.token = [hidden]
    proxy.port = -1
    schema.reflection = false
    auto.register.schemas = true
    max.schemas.per.subject = 1000
    basic.auth.credentials.source = URL
    value.subject.name.strategy = class io.confluent.kafka.serializers.subject.TopicNameStrategy
    schema.registry.url = [http://confluent-schema-registry-svc:8081]
    basic.auth.user.info = [hidden]
    proxy.host = 
    specific.protobuf.value.type = class java.lang.Object
    use.latest.version = false
    schema.registry.basic.auth.user.info = [hidden]
    bearer.auth.credentials.source = STATIC_TOKEN
    derive.type = false
    specific.protobuf.key.type = class java.lang.Object
    key.subject.name.strategy = class io.confluent.kafka.serializers.subject.TopicNameStrategy
 (io.confluent.kafka.serializers.protobuf.KafkaProtobufDeserializerConfig)
[2020-09-21 08:19:32,836] INFO ProtobufDataConfig values: 
    schemas.cache.config = 1000
    enhanced.protobuf.schema.support = false
 (io.confluent.connect.protobuf.ProtobufDataConfig)
[2020-09-21 08:19:32,841] INFO JsonConverterConfig values: 
    converter.type = value
    decimal.format = BASE64
    schemas.cache.size = 1000
    schemas.enable = false
 (org.apache.kafka.connect.json.JsonConverterConfig)
[2020-09-21 08:19:32,844] ERROR {"type":0,"deserializationError":{"errorMessage":"Error deserializing message from topic: com.obj_pos_proto","recordB64":null,"cause":["Failed to deserialize data for topic com.obj_pos_proto to Protobuf: ","Error deserializing Protobuf message for id -1","Unknown magic byte!"]},"recordProcessingError":null,"productionError":null} (processing.CSAS_TARGET_AVRO_3.KsqlTopic.Source.deserializer)
[2020-09-21 08:19:32,845] WARN Exception caught during Deserialization, taskId: 0_2, topic: com.obj_pos_proto, partition: 2, offset: 0 (org.apache.kafka.streams.processor.internals.StreamThread)
org.apache.kafka.common.errors.SerializationException: Error deserializing message from topic: com.obj_pos_proto
Caused by: org.apache.kafka.connect.errors.DataException: Failed to deserialize data for topic com.obj_pos_proto to Protobuf: 
    at io.confluent.connect.protobuf.ProtobufConverter.toConnectData(ProtobufConverter.java:123)
    at io.confluent.ksql.serde.connect.KsqlConnectDeserializer.deserialize(KsqlConnectDeserializer.java:45)
    at io.confluent.ksql.serde.tls.ThreadLocalDeserializer.deserialize(ThreadLocalDeserializer.java:37)
    at io.confluent.ksql.serde.GenericRowSerDe$GenericRowDeserializer.deserialize(GenericRowSerDe.java:300)
    at io.confluent.ksql.serde.GenericRowSerDe$GenericRowDeserializer.deserialize(GenericRowSerDe.java:285)
    at io.confluent.ksql.logging.processing.LoggingDeserializer.deserialize(LoggingDeserializer.java:46)
    at org.apache.kafka.common.serialization.Deserializer.deserialize(Deserializer.java:60)
    at org.apache.kafka.streams.processor.internals.SourceNode.deserializeValue(SourceNode.java:63)
    at org.apache.kafka.streams.processor.internals.RecordDeserializer.deserialize(RecordDeserializer.java:66)
    at org.apache.kafka.streams.processor.internals.RecordQueue.updateHead(RecordQueue.java:175)
    at org.apache.kafka.streams.processor.internals.RecordQueue.addRawRecords(RecordQueue.java:112)
    at org.apache.kafka.streams.processor.internals.PartitionGroup.addRawRecords(PartitionGroup.java:162)
    at org.apache.kafka.streams.processor.internals.StreamTask.addRecords(StreamTask.java:765)
    at org.apache.kafka.streams.processor.internals.StreamThread.addRecordsToTasks(StreamThread.java:943)
    at org.apache.kafka.streams.processor.internals.StreamThread.runOnce(StreamThread.java:764)
    at org.apache.kafka.streams.processor.internals.StreamThread.runLoop(StreamThread.java:697)
    at org.apache.kafka.streams.processor.internals.StreamThread.run(StreamThread.java:670)
Caused by: org.apache.kafka.common.errors.SerializationException: Error deserializing Protobuf message for id -1
Caused by: org.apache.kafka.common.errors.SerializationException: Unknown magic byte!

我相信我找到了我出现这个问题的原因

我想做的是创建一个无键流

失败的原因是我的生产者没有联系到我的模式注册表,所以当我尝试反序列化数据时,它总是会失败,因为注册表没有真正正常工作

-- keyless stream, with value columns loaded from Schema Registry:
CREATE STREAM pageviews WITH (
    KAFKA_TOPIC = 'keyless-pageviews-topic',
    VALUE_FORMAT = 'JSON'
  );