Spark Streaming实时流 - Kafka

245 阅读24分钟
Spark实时流分为两种:
1)Spark streaming:类似Spark
2)Spark Struct Streamming:类似Spark SQL,处理结构化数据
SparkStreaming从Kafka中读取数据有两种方式:
1)Receiver:Executor中的Kafka Receiver不断从kafka中读取数据,为了保证数据处理失败能够重试,同时将数据写入WAL。写入成功后,Receiver会向Kafka中的zookeeper发送消息(推),更新offset。
因为zookeeper中的offset与Kafka中可能不一致,所以可能导致消息重复消费(通过调优可以解决)
Receiver方式中,kafka和Spark中的partition是没关系的
![](data:image/jpeg;base64,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)
2)DirectStream:使用DirectStream,每个批次的Spark任务提交前会从kafka中读取offset,决定该Spark任务读取的offset范围,然后直接由Spark任务从Kafka中读取(拉)。
使用DirectStream,需要设定checkpoint文件路径,用于保存每个任务处理的offset范围,方便任务异常时重试。同时,保证了数据肯定被处理,且处理一次。
因为省略的WAL存储区域,并且使用Zero Copy的方式,Spark能够更快的读取数据,并且节省空间。
Kafka中的partition与Spark任务中的partition一一对应,如果要提高Spark并行度,需要repartition
![](data:image/jpeg;base64,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)
参考链接:[https://juejin.cn/post/6844903950353694733](https://juejin.cn/post/6844903950353694733)
实例代码:
<!-- sparkstreaming + kafka begin -->
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-streaming_2.11</artifactId>
    <version>2.4.0</version>
</dependency>
<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
    <version>2.2.2.RELEASE</version>
</dependency><!-- 创建Kafka 生产者、消费者等 -->
<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka_2.11</artifactId>
    <version>1.1.0</version>
</dependency><!-- 使用ZkUtils创建、删除topic 0.8.0版本有坑!-->
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-streaming-kafka-0-10_2.11</artifactId>
    <version>2.4.0</version> <!-- 2.2.0有坑,会在kafka启动时报java.lang.AbstractMethodError -->
</dependency>
<!-- sparkstreaming + kafka end -->

/**
* 消费者
* <p>
* 消费者使用consumer API预先将Message fetch到buffer中,可通过配置spark.streaming.kafka.consumer.cache.enabled关闭,不过
* 不建议,需要解决bug described in SPARK-19185
*
* @throws InterruptedException
*/
public void SparkStreamingKafkaTest() throws InterruptedException {
    // 一个SpringBoot项目中,只允许有一个SparkConf
    SparkConf conf = new SparkConf()
    //        .setMaster("local[*]")
            .setAppName("crawler kafka consumer");
    JavaSparkContext javaSparkContext = new JavaSparkContext(conf);
    // 一个SpringBoot项目中,可以有多个JavaStreamingContext,不过需要关闭上一个后再开始用下一个
    JavaStreamingContext jssc = new JavaStreamingContext(javaSparkContext, Durations.seconds(5));
    Map<String, Object> kafkaParams = new HashMap<>();
    kafkaParams.put("bootstrap.servers", servers);
    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("fetch.min.bytes", 10);
    //        kafkaParams.put("heartbeat.interval.ms", 10);
    kafkaParams.put("auto.offset.reset", "latest");
    kafkaParams.put("enable.auto.commit", false);
    // TODO 指定精确的topic名称列表    //        Collection<String> topics = Arrays.asList("topicA", "topicB", "hello");
    //        JavaInputDStream<ConsumerRecord<String, String>> messages = KafkaUtils.createDirectStream(
    //                jssc,
    //                LocationStrategies.PreferConsistent(), 
    //                ConsumerStrategies.Subscribe(topics, kafkaParams));
    // TODO 指定正则表达式,匹配一类topic    JavaInputDStream<ConsumerRecord<String, String>> messages = KafkaUtils.createDirectStream(
            jssc,
            LocationStrategies.PreferConsistent(), // 使用该LocationStrategy,使得partition均为的分配到executor
            ConsumerStrategies.SubscribePattern(Pattern.compile("hell.*"), kafkaParams));
    JavaDStream<String> lines = messages.map(ConsumerRecord::value);
    System.out.println(lines);
    jssc.start();              // Start the computation
    jssc.awaitTermination();   // Wait for the computation to terminate
}
**问题一:requirement failed: No output operations registered, so nothing to execute**
问题分析:因为没有指定output的动作,如存储Cassandra、存储文件、打印等操作
问题解决:最简单的,调用JavaDStream的print()方法打印;或者存储数据库、文件
**问题二:不报错,只是程序中不断打印Attempt to heartbeat failed since group is rebalancing**
问题分析:程序中,定义了两个KafkaUtils.createDirectStream()
问题解决:删除其中一个,看来SparkStreaming不支持同时定义多个DirectStream
**问题三:如何提高并行度**
reparition,实践发现定义两个DirectStream不可以
**问题四:SparkStream向Kafka写数据(未实践)**
参考连接:[https://allegro.tech/2015/08/spark-kafka-integration.html](https://allegro.tech/2015/08/spark-kafka-integration.html)
class KafkaSink(createProducer: () => KafkaProducer[String, String]) extends Serializable {
  lazy val producer = createProducer()
  def send(topic: String, value: String): Unit = producer.send(new ProducerRecord(topic, value))
}
object KafkaSink {
  def apply(config: Map[String, Object]): KafkaSink = {
    val f = () => {
      val producer = new KafkaProducer[String, String](config)
    // 增加shutdown后的回调函数
      sys.addShutdownHook {
        producer.close()
      }
      producer
    }
    new KafkaSink(f)
  }
}
val kafkaSink = sparkContext.broadcast(KafkaSink(conf))
dstream.foreachRDD { rdd =>
  rdd.foreach { message =>
    kafkaSink.value.send(message)
  }
}
**问题五:Sparkstreaming kafka 跨时段任务**
索引:sparkstreaming跨时段处理、sparkstreaming reduce(其实不是reduce操作,只是第一印象是reduce,所以为了方便搜索,这里加一个索引)
!!!真香系列之参考链接:[https://cloud.tencent.com/developer/article/1198450](https://cloud.tencent.com/developer/article/1198450)!!!
目的:
SparkStreaming一般是取某一时段内数据,处理后进行存储。但在实际开发中,可能出现需要跨多时段进行统计的需求,SparkStreaming中提供了这种方式
实现方式:
SparkStreaming中,提供了updateStateByKey和mapWithState两种方式,其中updateStateByKey的方式会随着统计的数据量的增加越来越慢,所以建议使用mapWithState的方式
val initialRDD = ssc.sparkContext.parallelize(List[(String, Int)]())
    // 自定义mappingFunction,累加单词出现的次数并更新状态
    // word表示统计的key,count表示新增数量,State存储当前word的数目状态
    val mappingFunc = (word: String, count: Option[Int], state: State[Int]) => {
      val sum = count.getOrElse(0) + state.getOption.getOrElse(0)
      val output = (word, sum)
      state.update(sum)
      output
    }
    //调用mapWithState进行管理流数据的状态
    kafkaStream.map(r => (r._2,1)).mapWithState(StateSpec.function(mappingFunc).initialState(initialRDD)).print()
**问题:为什么mapWithState比updateStateWithKey性能要高?**
问题解决:因为updateStateWithKey在每批次处理时,都会与当前统计的集合做co-group操作(个人理解是join操作),所以会随着系统中统计的集合的增大而变慢
而mapWithState则只会将当前统计集合中与新增集合中相关的数据进行处理