来自 Windows 和 Docker 的 Producer Avro 数据

Producer Avro data from Windows with Docker

我正在学习 How to transform a stream of events 教程。 在主题创建部分之前一切正常:

标题下对输入主题产生事件:

docker exec -i schema-registry /usr/bin/kafka-avro-console-producer --topic raw-movies --bootstrap-server broker:9092 --property value.schema="$(< src/main/avro/input_movie_event.avsc)"

我得到:

<: The term '<' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

--property value.schema 中调用 Avro 模式文件的正确方法是什么?

所有 Confluent Kafka 服务器都 运行 正常。 架构注册表此时为空:

PS C:\Users\Joe> curl -X GET http://localhost:8081/subjects
[]

如何从 CLI 手动在 Schema 中注册 Avro 文件?我在 Schema Registry API..

中找不到相关选项

我的想法是 - 如果我手动插入架构,那么我就可以调用它

编辑 1

尝试在 Power shell 中输入 Avro 文件路径作为变量,例如:

$avroPath = 'D:\ConfluentKafkaDocker\kafkaStreamsDemoProject\src\main\avro\input_movie_event.avsc'

并且比执行:

docker exec -i schema-registry /usr/bin/kafka-avro-console-producer --topic raw-movies --bootstrap-server broker:9092 --property value.schema=$avroPath

但这没有用。

编辑 2

设法让它与:

一起工作
$avroPath = 'D:\ConfluentKafkaDocker\kafkaStreamsDemoProject\src\main\avro\input_movie_event.avsc'
docker exec -i schema-registry /usr/bin/kafka-avro-console-producer --topic raw-movies --bootstrap-server broker:9092 --property value.schema.file=$avroPath

但现在我得到:

org.apache.kafka.common.config.ConfigException: Error reading schema from D:\ConfluentKafkaDocker\kafkaStreamsDemoProject\src\main\avro\input_movie_event.avsc at io.confluent.kafka.formatter.SchemaMessageReader.getSchemaString(SchemaMessageReader.java:260) at io.confluent.kafka.formatter.SchemaMessageReader.getSchema(SchemaMessageReader.java:222) at io.confluent.kafka.formatter.SchemaMessageReader.init(SchemaMessageReader.java:153) at kafka.tools.ConsoleProducer$.main(ConsoleProducer.scala:43) at kafka.tools.ConsoleProducer.main(ConsoleProducer.scala)

input_movie_event.avsc:

{
  "namespace": "io.confluent.developer.avro",
  "type": "record",
  "name": "RawMovie",
  "fields": [
    {"name": "id", "type": "long"},
    {"name": "title", "type": "string"},
    {"name": "genre", "type": "string"}
  ]
} 

它是示例中的 copy-pasted,所以我看不出为什么格式不正确。

编辑 3

尝试使用正斜杠,因为 Power shell 现在可以使用它:

 value.schema.file=src/main/avro/input_movie_event.avsc

与反斜杠比:

value.schema.file=src\main\avro\input_movie_event.avsc

我遇到了与编辑 2 中相同的错误 - 所以看起来这个标志 value.schema.file 没有正常工作。

编辑 4

按照建议尝试 value.schema="$(cat src/main/avro/input_movie_event.avsc)" here:

我现在得到的错误是:

[2022-04-05 10:17:24,135] ERROR Could not parse Avro schema (io.confluent.kafka.schemaregistry.avro.AvroSchemaProvider) org.apache.avro.SchemaParseException: com.fasterxml.jackson.core.JsonParseException: Unexpected character ('n' (code 110)): was expecting double-quote to start field name at [Source: (String)"{ namespace: io.confluent.developer.avro, type: record, name: RawMovie, fields: [ {name: id, type: long},
{name: title, type: string}, {name: genre, type: string} ] }"; line: 1, column: 6] at org.apache.avro.Schema$Parser.parse(Schema.java:1427) at org.apache.avro.Schema$Parser.parse(Schema.java:1413) at io.confluent.kafka.schemaregistry.avro.AvroSchema.(AvroSchema.java:70) at io.confluent.kafka.schemaregistry.avro.AvroSchemaProvider.parseSchema(AvroSchemaProvider.java:54) at io.confluent.kafka.schemaregistry.SchemaProvider.parseSchema(SchemaProvider.java:63) at io.confluent.kafka.formatter.SchemaMessageReader.parseSchema(SchemaMessageReader.java:212) at io.confluent.kafka.formatter.SchemaMessageReader.getSchema(SchemaMessageReader.java:224) at io.confluent.kafka.formatter.SchemaMessageReader.init(SchemaMessageReader.java:153) at kafka.tools.ConsoleProducer$.main(ConsoleProducer.scala:43) at kafka.tools.ConsoleProducer.main(ConsoleProducer.scala)

在错误中它说它 was expecting double-quote to start field name 还有 name: id 并且在文件中我有:

"fields": [
        {"name": "id", "type": "long"},
        {"name": "title", "type": "string"},
        {"name": "genre", "type": "string"}
      ]

为什么它解析不正确,就像没有 double-quotes 而在文件中它们实际上存在?

编辑 6

尝试过 value.schema="$(type src/main/avro/input_movie_event.avsc)"

因为 type 等同于 Windows 上的 cat - 得到与编辑 5 中相同的错误。 按照建议 here 尝试使用 get-content - 同样的错误。

How can I register Avro file in Schema manually from CLI?

您不会使用 Producer,或者 Docker。

您可以使用 Postman 并将 POST 请求(或 curl 的 Powershell 等价物)发送到 /subjects 端点,就像 Schema Registry API 文档所说的注册模式一样。


之后,使用 value.schema.id 链接即可。

或者,如果您不想安装任何其他东西,我会坚持使用 value.schema.file。话虽如此,您必须使用此文件(或整个 src\main\avro 文件夹)作为 Docker 卷启动容器,当您实际使用它时,Windows 路径不会引用它作为 docker exec 命令的一部分。我关于 cat 用法的链接答案假定您的文件位于同一文件系统上。

否则,首先由 Powershell 解释 exec 命令,因此输入重定向对 value.schema 不起作用,type 将是正确的 CMD 命令,但 $() 语法可能不是,因为那是针对 UNIX shell 的;

相关 - PowerShell: Store Entire Text File Contents in Variable