【问题标题】:Error in sinking kafka stream in flink 1.2在 flink 1.2 中下沉 kafka 流时出错
【发布时间】:2017-08-08 17:20:28
【问题描述】:

我所做的是读取来自 kafka 的 json 格式的消息。例如

{"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 connector文档写kafka outstream代码: https://ci.apache.org/projects/flink/flink-docs-release-1.2/dev/connectors/kafka.html

【问题讨论】:

    标签: streaming apache-flink


    【解决方案1】:

    您有一个ObjectNode 类型的流DataStream,因此您需要提供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]

    【讨论】:

    • 如何提供FlinkKafkaProducer010[ObjectNode]?
    • 非常感谢!我的程序现在编译。我代替你的???通过 element.toString.getBytes()。但是,我在下游的 kafka 中看不到任何消息。我写的有什么问题吗? @Dawid
    【解决方案2】:

    除了@Dawid 已经指出的内容之外,您还可以为 ObjectNode 提供序列化模式(假设它是 POJO,因为我还没有针对其他对象对其进行测试),如下所示:

    TypeInformation<ObjectNode> typeInfo =
            TypeInformation.of(new TypeHint<ObjectNode>() {});
    TypeInformationSerializationSchema<ObjectNode> serdeSchema =
            new TypeInformationSerializationSchema<>(typeInfo, env.getConfig());
    

    然后将 serdeschema 用于 KafkaPrducer 接收器,如下所示:

    FlinkKafkaProducer010<RecordReadEventType> kafkaSink =
                    new FlinkKafkaProducer010<>(
                                    BOOTSTRAP_SERVERS,
                                    "output-topic",
                                    serdeSchema);
    

    希望这能解决您的 kafka sink 冲突问题。

    【讨论】:

    • 我已经解决了冲突(至少我的程序运行了)。但是没有输出流。我觉得如果我在 Kafka 消费者中使用 JSONDeserializationSchema(在阅读 kafka 消息时),我的程序将无法读取任何内容。如果你能帮助我,我又发布了一个问题:stackoverflow.com/questions/45564373/…
    猜你喜欢
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    相关资源
    最近更新 更多