数据整合即创造
引言
对比spark来说一下,flink是如何像spark一样将kafka的offset维护到redis中,从而保证数据的一次仅一次消费,做到数据不丢失、不重复,用过spark的同学都知道,spark在读取kafka数据后,DStream
(准确是InputDStream[ConsumerRecord[String, String]])
中会有这几个信息:topic、partition、offset、key、value、timestamp
等等信息,在维护的时候只需要对DStream进行一次foreach操作就可以了,根据场景选择保存offset的位置,再次重启的时候,读取redis中的offset就可以了。
初次使用flink的同学会发现,flink从env.addSource
获得到是DataStream[String]
,里面的内容直接是value,那么该怎么处理?
步骤
- 重写
FlinkKafkaConsumer010
:组建NewKafkaDStream
- 存储offset到redis
- 读取
代码
import java.nio.charset.StandardCharsets
import java.util._
import com.oneniceapp.bin.KafkaDStream
import my.nexus.util.StringUtils //私仓
import org.apache.flink.api.common.typeinfo.{
TypeHint, TypeInformation}
import org.apache.flink.streaming.connectors.kafka.internals.KafkaTopicPartition
import org.apache.flink.streaming.connectors.kafka.{
FlinkKafkaConsumer010, FlinkKafkaConsumerBase}
import org.apache.flink.streaming.connectors.kafka.{
FlinkKafkaConsumer010, FlinkKafkaConsumerBase, KafkaDeserializationSchema}
import org.apache.flink.streaming.util.serialization.KeyedDeserializationSchema
import org.slf4j.LoggerFactory
import redis.clients.jedis.Jedis
import scala.collection.JavaConversions._
1、创建NewKafkaDStream
对象
case class KafkaDStream(topic:String, partition:Int