在flink 1.2中下沉kafka流时出错

时间:2017-08-08 05:40:37

标签: streaming apache-flink

我所做的是以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))

我得到的错误如下图所示: enter image description here

我参考flink kafka连接器文档来编写kafka outstream代码: https://ci.apache.org/projects/flink/flink-docs-release-1.2/dev/connectors/kafka.html

2 个答案:

答案 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接收冲突问题。