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查询每个主题+分区中的最新偏移量,并相应地定义要在每个批次中处理的偏移量范围。
优点。
- 简化的并行性
- 效率更高
- 完全一次的语义
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])