Flink Streaming:序列化字符串消息中出现意外的字符

时间:2017-08-27 13:54:33

标签: serialization apache-kafka apache-flink kafka-producer-api flink-streaming

我的信息流正在生成Tuple2<String,String>

类型的记录

.toString()输出(usr12345,{"_key":"usr12345","_temperature":46.6})

其中密钥为usr12345,值为{"_key":"usr12345","_temperature":46.6}

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

(usr12345,{"_key":"usr12345","_temperature":46.6})

但是当我将流写入Kafka时,密钥变为usr12345(开头有一个空格)和值({"_key":"usr12345","_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);

1 个答案:

答案 0 :(得分:4)

TypeInformationKeyValueSerializationSchema使用Flink的自定义序列化程序序列化数据,这意味着必须将结果解释为二进制数据。 Flink的String序列化程序写入String的长度,然后编码所有字符。

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

尝试使用不同的序列化程序,将序列化密钥和值作为普通字符串或使用兼容的解串器。