我所做的是以json格式阅读来自kafka的消息。 E.g。
{"a":1,"b":2}
然后我对此消息应用了一个过滤器,以确保对应于a的值为1,b的值为2.最后,我想将结果流输出到下游kafka。但是,我不知道为什么编译器会说类型不匹配。
我的代码如下:
val kafkaConsumer = new FlinkKafkaConsumer010(
params.getRequired("input-topic"),
new JSONDeserializationSchema(),
params.getProperties)
val messageStream = env.addSource(kafkaConsumer).rebalance
val filteredStream: DataStream[ObjectNode] = messageStream.filter(jsonNode => jsonNode.get("a").asText.equals("1")
&& jsonNode.get("b").asText.equals("2"))
filteredStream.addSink(new FlinkKafkaProducer010[Object](params.getRequired("output-topic"), new SimpleStringSchema, params.getProperties))
我参考flink kafka连接器文档来编写kafka outstream代码: https://ci.apache.org/projects/flink/flink-docs-release-1.2/dev/connectors/kafka.html
答案 0 :(得分:1)
您有DataStream
类型的流ObjectNode
,因此您需要提供FlinkKafkaProducer010[ObjectNode]
,例如:
stream1.addSink(new FlinkKafkaProducer010[ObjectNode](params.getRequired("output-topic"), new SerializationSchema[ObjectNode] {
override def serialize(element: ObjectNode): Array[Byte] = ???
} ), params.getProperties)
java中的所有泛型类型在类型中都是不变的,这就是为什么你不能只传递FlinkKafkaProducer010[Object]
。
您可能遇到的另一个问题是,您还需要提供SerializationSchema[ObjectNode]
而SimpleStringSchema
实施SerializationSchema[String]
。
答案 1 :(得分:1)
添加@Dawid已经指出的内容,您可以为ObjectNode提供序列化架构(假设它是一个POJO,因为我没有为其他对象测试它),如下所示:
TypeInformation<ObjectNode> typeInfo =
TypeInformation.of(new TypeHint<ObjectNode>() {});
TypeInformationSerializationSchema<ObjectNode> serdeSchema =
new TypeInformationSerializationSchema<>(typeInfo, env.getConfig());
然后对KafkaPrducer接收器使用 serdeschema ,如下所示:
FlinkKafkaProducer010<RecordReadEventType> kafkaSink =
new FlinkKafkaProducer010<>(
BOOTSTRAP_SERVERS,
"output-topic",
serdeSchema);
希望这可以解决你的kafka接收冲突问题。