Serialization Flink流:序列化字符串消息中的意外字符

Serialization Flink流:序列化字符串消息中的意外字符,serialization,apache-kafka,apache-flink,kafka-producer-api,flink-streaming,Serialization,Apache Kafka,Apache Flink,Kafka Producer Api,Flink Streaming,我的流正在生成类型为Tuple2 .toString()输出(usr12345,{U键“:“usr12345”,“U温度”:46.6}) 其中键为usr12345,值为{“\u键”:“usr12345”,“\u温度”:46.6} 流上的.print()正确输出值: (usr12345,{U键“:“usr12345”,“U温度”:46.6}) 但是当我将流写入Kafka时,键变成usr12345(开头有一个空格),值变成({“\u-key”:“usr12345”,“u-temperature”:4

我的流正在生成类型为
Tuple2

.toString()
输出
(usr12345,{U键“:“usr12345”,“U温度”:46.6})

其中键为
usr12345
,值为
{“\u键”:“usr12345”,“\u温度”:46.6}

流上的
.print()
正确输出值:

(usr12345,{U键“:“usr12345”,“U温度”:46.6})

但是当我将流写入Kafka时,键变成
usr12345
(开头有一个空格),值变成
({“\u-key”:“usr12345”,“u-temperature”:46.6}

请注意键开头的空格和值开头的左括号

很奇怪,为什么会这样

以下是序列化代码:

TypeInformation<String> resultType = TypeInformation.of(String.class);

KeyedSerializationSchema<Tuple2<String, String>> schema =
      new TypeInformationKeyValueSerializationSchema<>(resultType, resultType, env.getConfig());

FlinkKafkaProducer010.FlinkKafkaProducer010Configuration flinkKafkaProducerConfig = FlinkKafkaProducer010.writeToKafkaWithTimestamps(
      stream,   
      "topic",    
      schema,  
      kafkaProducerProperties);
TypeInformation resultType=TypeInformation.of(String.class);
KeyedSerializationSchema=
新的TypeInformationKeyValueSerializationSchema(resultType,resultType,env.getConfig());
FlinkkafKapProducer010.FlinkkafKapProducer010配置FlinkkafKapProducerConfig=FlinkkafKapProducer010.WriteToKafkaWithTimestaps(
流动
“主题”,
模式,
卡夫卡生产者财产);

类型信息KeyValueSerializationSchema使用Flink的自定义序列化程序序列化数据,这意味着结果必须解释为二进制数据。Flink的字符串序列化程序写入字符串的长度,然后对所有字符进行编码

我假设您使用纯字符串反序列化器反序列化Kafka主题。对于键,序列化的长度被解释为空白字符。对于值,长度被解释为
('


尝试使用将键和值序列化为普通字符串的其他序列化程序,或使用兼容的反序列化程序。

您所描述的有点奇怪,您是否尝试创建kafka接收器并执行stream.addsink(kafkaSink)?这可能解决了问题吗?@BiplobBiswas嗯,我遵循了Flink Kafka文档中描述的说明。根据这一点,这是使用我正在使用的Java,Kafka 0.10+的正确方法。