Spark --------Spark Streaming 集成 Kafka

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_39141486/article/details/99240987

sparkStreaming从Kafka读取数据的2种方式

官方文档:
http://spark.apache.org/docs/2.2.0/streaming-kafka-0-8-integration.html


kafka存数据是在磁盘中,所以,使用时间越长文件越大,如果使用API,通过producer往Kafka中写入数据,一个死循环就会产生几个G+的文件

方式一:Receiver-based Approach

  此方法使用Receiver接收数据。Receiver是使用Kafka高级消费者API实现的。与所有接收器一样,从Kafka通过Receiver接收的数据存储在Spark执行器中,然后由Spark Streaming启动的作业处理数据。
  但是,在默认配置下,此方法可能会在失败时丢失数据

使用方法

import org.apache.spark.streaming.kafka._

 val kafkaStream = KafkaUtils.createStream(streamingContext,
     [ZK quorum], [consumer group id], [per-topic number of Kafka partitions to consume])

要记住的要点:

  Kafka中的主题分区与Spark Streaming中生成的RDD分区无关。因此,增加主题特定分区KafkaUtils.createStream()的数量只会增加使用单个接收器中消耗的主题的线程数。它不会增加Spark在处理数据时的并行性。反之,就是不增加线程数,而是提高并行度

  可以使用不同的组和主题创建多个Kafka输入DStream,以使用多个接收器并行接收数据。

  如果已使用复制文件系统(如HDFS)启用了“预读日志”,则已在日志中复制接收的数据。因此,输入流的存储级别的存储级别StorageLevel.MEMORY_AND_DISK_SER(即,使用 KafkaUtils.createStream(…, StorageLevel.MEMORY_AND_DISK_SER))。

方式二:Direct Approach (No Receivers)

  Spark 1.3中引入了这种新的无接收器“直接”方法,以确保更强大的端到端保证。这种方法不是使用接收器来接收数据,而是定期向Kafka查询每个主题+分区中的最新偏移量,并相应地定义要在每个批次中处理的偏移量范围。

优点。

  1. 简化的并行性
  2. 效率更高
  3. 完全一次的语义
import org.apache.spark.streaming.kafka._

 val directKafkaStream = KafkaUtils.createDirectStream[
     [key class], [value class], [key decoder class], [value decoder class] ](
     streamingContext, [map of Kafka parameters], [set of topics to consume])

猜你喜欢

转载自blog.csdn.net/qq_39141486/article/details/99240987