创建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期间应相应到加入分区。