创建streaming+kafka数据源
public static void main(String[] args) {
jssc = SparkUtil.initContext();
//kafka参数设置
Map<String, Object> kafkaParams = new HashMap<>();
kafkaParams.put("bootstrap.servers", "localhost:9092,anotherhost:9092");
kafkaParams.put("key.deserializer", StringDeserializer.class);
kafkaParams.put("value.deserializer", StringDeserializer.class);
kafkaParams.put("group.id", "use_a_separate_group_id_for_each_stream");
kafkaParams.put("auto.offset.reset", "latest");
kafkaParams.put("enable.auto.commit", false);
//设置topic名字
Collection<String> topics = Arrays.asList("topicA", "topicB");
JavaInputDStream<ConsumerRecord<String, String>> inputStream =
KafkaUtils.createDirectStream(jssc,
LocationStrategies.PreferConsistent(),
ConsumerStrategies.<String, String>Subscribe(topics, kafkaParams)
);
inputStream.mapToPair(record -> new Tuple2<>(record.key(), record.value()));
}
各参数说明:
kafkaParams => auto.offset.reset 参数:默认 latest
earliest :automatically reset the offset to the earliest offset
从最早的地方开始消费
latest :automatically reset the offset to the latest offset
当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据
none :throw exception to the consumer if no previous offset is found for the consumer's group
topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常
在auto.offset.reset标志位为earliest/或者latest,上面的消费者都将在enable.auto.commit的基础之上进行继续消费(如果enable.auto.commit=TRUE,则同一个消费者重启之后不会重复消费之前消费过的消息;enable.auto.commit=FALSE,则消费者重启之后会消费到相同的消息)
=>enable.auto.commit:是否自动提交offset
---------------------------------------------------------------------------------
=>LocationStrategies:本地策略,
新版本号的消费者API会预取消息入buffer。
因此,为了提升性能,在Executor端缓存消费者(而不是每一个批次又一次创建)是非常有必要的,优先调度那些分区到已经有了合适消费者主机上。
在非常多情况下,你须要像上文一样使用LocationStrategies.PreferConsistent,这个參数会将分区尽量均匀地分配到全部的能够Executor上去。
假设。你的Executor和kafka broker在同一台机器上,能够用PreferBrokers。这将优先将分区调度到kafka分区leader所在的主机上。最后,分区间负荷有明显的倾斜,能够用PreferFixed。这个同意你指定一个明白的分区到主机的映射(没有指定的分区将会使用连续的地址)。
消费者缓存的数目默认最大值是64。假设你希望处理超过(64*excutor数目)kafka分区。spark.streaming.kafka.consumer.cache.maxCapacity这个參数能够帮助你改动这个值。
假设你想禁止kafka消费者缓存,能够将spark.streaming.kafka.consumer.cache.enabled改动为false。
Cache是依照topicpartition和groupid进行分组的,所以每次调用creaDirectStream的时候要单独设置group.id。
=>ConsumerStrategies(消费策略)
新的kafka消费者api有多个不同的方法去指定消费者,当中有些方法须要考虑post-object-instantiation设置。
ConsumerStrategies提供了一个抽象,它同意spark能够获得正确配置的消费者。即使从Checkpoint重新启动之后。
ConsumerStrategies.Subscribe,如上面展示的一样,同意你订阅一组固定的集合的主题。
SubscribePattern同意你使用正则来指定自己感兴趣的主题。注意,跟0.8整合不同的是,使用subscribe或者subscribepattern在执行stream期间应相应到加入分区。