Flink项目开发记录
项目背景:使用的jar包版本: flink1.9.0 、kafka 2.0.1、scala 2.11.11
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-scala_2.11</artifactId>
<version>${flink.version}</version>
<exclusions>
<exclusion>
<groupId>org.scala-lang</groupId>
<artifactId>scala-compiler</artifactId>
</exclusion>
<exclusion>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
</exclusion>
<exclusion>
<groupId>org.scala-lang</groupId>
<artifactId>scala-reflect</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-compiler</artifactId>
<version>2.11.11</version>
<scope>compile</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.flink/flink-streaming-scala -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-scala_2.11</artifactId>
<version>${flink.version}</version>
<exclusions>
<exclusion>
<groupId>org.scala-lang</groupId>
<artifactId>scala-compiler</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.flink/flink-connector-kafka -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka_2.11</artifactId>
<version>${flink.version}</version>
</dependency>
主要是排除了一些scala的依赖,否则会产生jar包冲突,会报
scala的reflect包丢失等错误,主要原因便是这个scala-compiler包 切记
原先使用的是flink1.7.0,因为akka的timeout原因,1.7版本不支持手动设置akka超时时间,导致集群一直起不来,所以升级了flink。顺带将kafka也配套到了2.0.1
kafka在升级到2.0.1之后,对于flink的生产者 FlinkKafkaProducer类的构造函数,多了自己的KafkaSerializationSchema,原先的KeyedSerializationSchema与SimpleStringSchema 都标记了过时,
项目中使用的是KeyedSerializationSchemaWrapper 包装了SimpleStringSchema,查看了一下源码之后,发现KafkaSerializationSchema并没有实现自己的类,也就是说需要自己去实现流的序列化,所以目前也就将就着使用过时的方法了,而FlinkKafkaConsumer则还是没用标记过时 。
从kafka中获取数据的代码如下:
val kafkaProperties = new Properties();
kafkaProperties.put("bootstrap.servers",props.getProperty("kafka.brokers"))
kafkaProperties.put("group.id",props.getProperty("group.id"))
val dataTopic = props.getProperty("kafka.topics.data")
val kafkaSource = new FlinkKafkaConsumer[String](dataTopic,new SimpleStringSchema(),kafkaProperties)
val data = env.addSource(kafkaSource)
这样就可以接着流进行处理了