邮件已保存Kafka主题未通过Kafka连接器正确保存

时间:2019-03-04 23:42:49

标签: jdbc apache-kafka apache-kafka-connect confluent confluent-schema-registry

所以我设置了一个Confluent Kafka JDBC连接器。首先,我启动一个模式注册表,例如

./bin/schema-registry-start ./etc/schema-registry/schema-registry.properties

这是schema-registery.properties文件

listeners=http://0.0.0.0:8081
kafkastore.connection.url=zookeeperhost:2181
kafkastore.bootstrap.servers=PLAINTEXT://kafkahost:9092
kafkastore.topic=_schemas
debug=false

接下来,我将启动像这样的独立连接器

./bin/connect-standalone ./etc/schema-registry/connect-avro-standalone.properties ./jdbc-source.properties

connect-avro-standalone.properties是

bootstrap.servers=kafkahost:9092

key.converter=io.confluent.connect.avro.AvroConverter
key.converter.schema.registry.url=http://localhost:8081
value.converter=io.confluent.connect.avro.AvroConverter
value.converter.schema.registry.url=http://localhost:8081

internal.key.converter=org.apache.kafka.connect.json.JsonConverter
internal.value.converter=org.apache.kafka.connect.json.JsonConverter
internal.key.converter.schemas.enable=false
internal.value.converter.schemas.enable=false

offset.storage.file.filename=/tmp/connect.offsets
plugin.path=share/java

jdbc-source.properties是

name=jdbc_source_oracle
connector.class=io.confluent.connect.jdbc.JdbcSourceConnector
connection.url=jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=port))(CONNECT_DATA=(SERVER=dedicated)(SID=server)))
connection.user=xxx
connection.password=xxx
table.whitelist=table1, table2
mode=bulk
topic.prefix=my_topic
query=select * from table1 t1 join table1 t2 on t2.id = t1.id where t2.entereddate >='19-FEB-2019' and t2.entereddate <= '23-FEB-2019'

我正在使用的查询仅用于测试目的,我要使用的实际查询将实现递增模式,并且不包含where子句。

现在,这可以将数据发布到主题中,但是还会发生一些奇怪的事情。首先,ID以不可读的格式保存。只是空的正方形。其次,数据库中填充的某些字段在主题中另存为null。第三,每当我尝试更改JDBC源文件中查询的日期时,都不会发生任何事情。它仍然包含我第一次运行时发布的消息,因为kafka主题中的任何内容都没有更新,因此我更改查询的次数没有多少。

有人可以帮助我吗?

编辑

我想做的是通过pyspark代码使用数据。这是有关我的操作方式的代码

from pyspark.sql import SparkSession

spark = SparkSession\
    .builder\
    .appName("data streaming app")\
    .getOrCreate()


data_raw = spark.readStream\
    .format("kafka")\
    .option("kafka.bootstrap.servers", "kafkahost:9092")\
    .option("subscribe", "my_topic")\
    .load()

query = data_raw.writeStream\
    .outputMode("append")\
    .format("console")\
    .option("truncate", "false")\
    .trigger(processingTime="5 seconds")\
    .start()\
    .awaitTermination()

我还通过以下命令使用kafka-avro-console-consumer消费了数据

./bin/kafka-avro-console-consumer \
--bootstrap-server kafkahost:9092 \
--property print.key=true \
--from-beginning \
--topic my_topic

这两个给我带来奇怪的结果

这是pyspark代码给我的 enter image description here

这就是使用avro控制台给我的

enter image description here

阻止某些字段和文本,因为其中可能包含公司敏感信息。

1 个答案:

答案 0 :(得分:1)

如果您要从Spark消费Avro,则需要使用correct deserializer

您正在从控制台中看到Avro数据中的字节,然后就可以处理小数/数字as detailed here

您可以阅读有关Kafka Connect和Avro(包括JSON)here的序列化替代方案的更多信息。