streaming通过direct接收数据的入口是createDirectStream,调用该方法的时候会先创建

val kc = new KafkaCluster(kafkaParams)

这个类会获取kafka的partition信息,并创建DirectKafkaInputStream类,每个类都对应一个topic,通过foreachRDD可以获取每个partition的offset等信息。到了batch time后,这个类的compute方法就会被调用(这块可以参考spark streaming文件夹下的文章),接着就是:

1. 获取kafka partition的untilOffset,这样就确定了获取数据的区间

2. 构建一个kafkaRDD实例。

3. 将offset信息报给InputInfoTracker

4. 返回该RDD

kafkaRDD和一般的RDD一样,整个过程都是lazy的,数据都是放在kafka中,只有真正action的时候才会从kafka拉取数据。