对于kafak与sparkstreaming集成后 存在的问题 一。基于receiver的方式在kafka1.0后好像是去取消了 都是高级api 默认是200毫秒接受的数据形成一个block块,设置5s为一个批次 那就是5000/200 为25个分区 1.val kafkaParams = Map( "zookeeper.connect" -> "bigdata.server1:2181", //连接zookeeper的地址,获取和提交offet "group.id" ->"KafkaReceive", //消费组的名称 "zookeeper.connection.timeout.ms" -> "10000", "auto.offset.reset"-> "smallest" //当前sparksreaing对应的消费者组第一次消费的时候方式,当前是从头消费 ) val lines: DStream[String] = KafkaUtils.createStream[String,String,StringDecoder,StringDecoder]( ssc, kafkaParams, topics, StorageLevel.MEMORY_AND_DISK_SER_2 ).map(_._2) 2. val topics = Map("test1" -> 4) val lines = KafkaUtils.createStream( ssc, "KafkaReceiverWC02", "bigdata.server1:2181", topics ).map(_._2) 二。基于direct模式 对应的是是topic有几个分区就有几个task 对应的也是两种集成 低级api可以定义从哪消费 //由于Direct方式的kafka和Spark Streaming的集成方式中采用的api是低级封装的api(low lever api),消费的offset信息不需要zookeeper保存,而是直接去找broker节点 val kafkaParams = Map( "metadata.broker.list"->"bigdata.server1:9092,bigdata.server1:9093,bigdata.server1:9094,bigdata.server1:9095" ) //由于Direct方式的kafka和Spark Streaming的集成方式中采用的api是低级封装的api(low lever api),此时消费者的offet,由自己保管,不再是zookeeper, // 同时还可以自己指定从哪个offet开始消费 ,指定消费的topic以及对应每个分区,开始消费的offset val fromOffsets:Map[TopicAndPartition, Long] = Map( TopicAndPartition("bc",0) -> 0, TopicAndPartition("bc",1) -> 100, TopicAndPartition("bc",2) -> 200, TopicAndPartition("bc",3) -> 300 ) //MessageAndMetadata可以同时获取message的所属的topic,partiron,offset等元数据,也可以获取key和value,这里仅需要value val messageHandler: MessageAndMetadata[String, String] => String = (mmd:MessageAndMetadata[String, String])=>{ //Messaged的Metadata // mmd.topic // mmd.partition // mmd.offset 在元数据区域获取到的偏移量与对应分区 进行存储 //Messaged本身 //mmd.key() mmd.message() } val lines: InputDStream[String] = KafkaUtils.createDirectStream[String,String,StringDecoder,StringDecoder,String]( ssc, kafkaParams, fromOffsets, messageHandler ) HasOffsetRanges是一个接口 kafkardd是他的子类 也是rdd的子类 所以使用foreachRdd都是rdd class KafkaRDD[ K: ClassTag, V: ClassTag, U <: Decoder[_]: ClassTag, T <: Decoder[_]: ClassTag, R: ClassTag] private[spark] ( sc: SparkContext, kafkaParams: Map[String, String], val offsetRanges: Array[OffsetRange], leaders: Map[TopicAndPartition, (String, Int)], messageHandler: MessageAndMetadata[K, V] => R ) extends RDD[R](sc, Nil) with Logging with HasOffsetRanges DirectKafkaInputDStream是inputstream的子类 DirectKafkaInputDStream.foreachRdd后都是{都是kafkaRdd} kafkaRDD.asInstanceOf[HasOffsetRanges]