Flink将Kafka源代码流式传输到Kafka Sink

时间:2020-03-11 07:56:32

标签: apache-kafka apache-flink flink-streaming flink-sql

我要尝试在Scala中编写Flink流代码以从Kafka主题读取,并对消息进行一些操作后,将数据写回到Kafka主题。我正在使用Flink Table API。

代码正在运行,没有任何异常,但是在接收器主题中没有看到任何消息。

使用MySQL作为接收器时,类似的代码可以正常工作。

无法解决问题,根据Flink 1.9文档,代码非常简单。

请帮助我获得一些调试此问题的线索。

请找到详细信息:

链接版本-1.9

依赖性-SBT

Kafka版本-2.1

Kafka连接器-flink-connector-kafka-0.10%1.9.1

代码

    package com.flink

    // Import Packages
    import org.apache.flink.api.scala._
    import org.apache.flink.table.api._
    import org.apache.flink.types.Row
    import org.apache.flink.table.api.java._
    import scala.collection.JavaConverters._
    import org.apache.flink.table.descriptors.Json
    import org.apache.flink.table.descriptors.Kafka
    import org.apache.flink.table.sinks.CsvTableSink
    import org.apache.flink.table.descriptors.Schema
    import org.apache.flink.api.common.typeinfo.Types
    import org.apache.flink.streaming.connectors.kafka._
    import org.apache.flink.table.api.{Table, TableEnvironment}
    import org.apache.flink.streaming.api.datastream.DataStream
    import org.apache.flink.api.common.typeinfo.TypeInformation
    import org.apache.flink.api.java.io.jdbc.JDBCAppendTableSink
    import org.apache.flink.table.api.java.StreamTableEnvironment
    import org.apache.flink.api.common.serialization.SimpleStringSchema
    import org.apache.flink.api.common.typeinfo.BasicTypeInfo.STRING_TYPE_INFO
    import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment

    object kafkaToKafka2 {
      def main(args: Array[String]): Unit = {

        // Setting Streaming Environment
        val env = StreamExecutionEnvironment.getExecutionEnvironment
        env.enableCheckpointing(5000)

        // Define Table environment
        val tableEnv = StreamTableEnvironment.create(env)

        val schema = new Schema()
          .field("userId",Types.STRING)
          .field("jobTitleName", Types.STRING)
          .field("firstName", Types.STRING)
          .field("lastName", Types.STRING)

        val sinkSchema = new Schema()
          .field("user_id",Types.STRING)
          .field("job_name", Types.STRING)
          .field("name", Types.STRING)

        // Reading from Kafka
        tableEnv.connect(
          new Kafka()
            .version("0.10")
            .topic("sourceTopic")
            .property("bootstrap.servers", "localhost:9092") // local
            .property("group.id", "poc1234")
            .startFromEarliest()
          //.startFromLatest()
        )
          .withFormat(
            new Json()
              .failOnMissingField(true)
              .deriveSchema()
          )
          .withSchema(schema)
          .inAppendMode()
          .registerTableSource("json_tab")

        // Writing to Kafka
        tableEnv.connect(
          new Kafka()
            .version("0.10")
            .topic("myTopic2")
            .property("bootstrap.servers", "localhost:9092")   // local
            .property("group.id", "poc")
            .sinkPartitionerRoundRobin()

        )
          .withFormat(
            new Json()
              .failOnMissingField(false)
              .deriveSchema()
          )
          .withSchema(sinkSchema)
          .inAppendMode()
          .registerTableSink("json_sink_tab")

            // SQL query where we can do transformation using ANSI SQL
            val sql = "SELECT userId as user_id, jobTitleName as job_name, CONCAT(firstName, ' ', lastName) as name " +
              "FROM json_tab " +
              "WHERE userId <> '' ";

            // Executing SQL query
            val result:Table = tableEnv.sqlQuery(sql)

        result.insertInto("json_sink_tab");

        // Printing Schema for checking purpose
        result.printSchema()
        System.out.println("======================= " + result.toString)

        env.execute("kafkaJsonJob")
      }
    }

0 个答案:

没有答案