Kafka Consumer消费策略
1、setStartFromGroupOffsets()【默认消费策略】
默认读取上次保存的offset信息,如果是应用第一次启动,读取不到上次的offset信息,则会根据这个参数auto.offset.reset的值来进行消费数据
2、setStartFromEarliest()
从最早的数据开始进行消费,忽略存储的offset信息
3、setStartFromLatest()
从最新的数据进行消费,忽略存储的offset信息
4、setStartFromSpecificOffsets(Map<KafkaTopicPartition, Long>)
手工指定开始消费的offset
Kafka Consumer的容错
1、当checkpoint机制开启的时候,Kafka Consumer会定期把kafka的offset信息还有其他operator的状态信息一块保存起来。当job失败重启的时候,Flink会从最近一次的checkpoint中进行恢复数据,重新消费kafka中的数据。
2、为了能够使用支持容错的kafka Consumer,需要开启checkpoint
env.enableCheckpointing(5000); // 每5s checkpoint一次
动态加载Topic方式
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
Properties properties = new Properties();
properties.setProperty("bootstrap.servers", "localhost:9092");
properties.setProperty("group.id", "test");
FlinkKafkaConsumer011<String> myConsumer = new FlinkKafkaConsumer011<>(
java.util.regex.Pattern.compile("test-topic-[0-9]"),
new SimpleStringSchema(),
properties);
DataStream<String> stream = env.addSource(myConsumer);
...
Kafka Consumers Offset 自动提交
针对job是否开启checkpoint来区分
1、Checkpoint关闭时: 可以通过下面两个参数配置
•enable.auto.commit
•auto.commit.interval.ms
2、Checkpoint开启时:当执行checkpoint的时候才会保存offset,这样保证了kafka的offset和checkpoint的状态偏移量保持一致。
可以通过这个参数设置setCommitOffsetsOnCheckpoints(boolean)。这个参数默认就是true。表示在checkpoint的时候提交offset,此时,kafka中的自动提交机制就会被忽略
使用demo
import java.util.Properties
import org.apache.flink.api.common.serialization.SimpleStringSchema
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer011
import org.apache.flink.streaming.api.CheckpointingMode
import org.apache.flink.streaming.api.environment.CheckpointConfig
object StreamingKafkaSourceScala {
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
//隐式转换
import org.apache.flink.api.scala._
//checkpoint配置
env.enableCheckpointing(5000)
env.getCheckpointConfig.setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE)
env.getCheckpointConfig.setMinPauseBetweenCheckpoints(500)
env.getCheckpointConfig.setCheckpointTimeout(60000)
env.getCheckpointConfig.setMaxConcurrentCheckpoints(1)
env.getCheckpointConfig.enableExternalizedCheckpoints(CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION)
val topic = "test"
val prop = new Properties()
prop.setProperty("bootstrap.servers","192.168.24.141:9092")
prop.setProperty("group.id","test-consumer-group")
val myConsumer = new FlinkKafkaConsumer011[String](topic, new SimpleStringSchema(),prop)
val text = env.addSource(myConsumer)
text.print()
env.execute("StreamingKafkaSourceScala")
}
}