Spark Kafka

Spark Streaming with Kafka integration

  • 在这里我们开始介绍如何配置spark Streaming去接受来自kafka的数据,有两个方法能够做到:
    • 1.老方法,使用的是Receivers和kafka的高级API
    • 2.新方法,取消了使用Receivers
    • 他们拥有不同的编程模型,代表特征和保证语义,所以,阅读来获得更多的细节,两个方法都是被考虑经过现在spark版本的稳定API实现的

Approach 1:Receiver-based Approach(基于接收器的方法)

  • 这个方法是使用一个接收器来接受数据,这个接收器是使用kafka高级API的工具,对于所有的接收器来说,kafka的数据接受是通过一个数据接收器,此接收器是存在于spark Executor中的,之后的任务启动是通过spark Streaming来处理数据。
  • 然而在默认的配置下,此方法有可能会发生错误从而丢失数据(详情请看Receiver reliability),为确保数据不丢失,不得不另外添加一个Write-Ahead Log(WAL)在spark Streaming中,kafka中所有接收到的数据会同步存储在WAL分布式文件系统HDFS上 ,所以,数据发生错误的时候可被恢复
  • 该方式如何设置在流式应用中:
import org.apache.spark.streaming.kafka._

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

需要注意的点

  • 1.在Kafka中的Topic Partitions不能与Spark Streaming中RDD产生的分区相关联,所以,增加topic特定的分区(KafkaUtils.createStream():仅仅能增加一个拥有简单接收器的consumer线程的数量),它并不能增加接受数据的并行度
  • 多个kafka输入DSstreams可以被不同的group和topic创建,为了使用多个Receiver来并行接受数据
  • 如果你启用WAL with 一个多副本文件系统如HDFS,这些已经接受到的数据将被复制在日志中,因此输入流的存储级别为存储级别StorageLevel

Apporach2:Direct Approach(No Receivers)无接收器

  • 这个新的缺少接受器(直连)的方式是在spark1.3版本发布的,为了保证更加健壮的端对端担保,取代了使用接收器接收数据,此方法周期性的查询在Kafka中每个topic+partition的最近offset,还包括定义了offset range同时执行每个批次,当任务开启,开始处理数据后,kafka的低阶API就开始读取来自kafka中被定义过的offset的范围(简单的读取文件从文件系统中)
    优点

  • 1.更加简明的并行机制:

    不需要创建多个kafka stream来输入和合并;通过directStream,spark Streaming可以创建一个和kafka中分区一致的多个RDD Partition来提供消费,此形式会并行读取kafka中的所有数据,所以这是一个一对一的映射关系

  • 2.更高效
    Receiver-based approach实现零数据丢失需要让数据存储在一个WAL中,是一种远程的数据复制。数据被有效的获取和复制了两次,一次是通过kafka,第二次是wal,所以是低效的方式;
    为了高效,取消了接收器,因此不要WAL。由于有一个充足的kafka保留区域,消息能够从kafka中```

  • 3.明确语义

    第一种方法使用kafka的高级API在zookeeper中存储消费后的offset,这是一个传统的方法去消费kafka中的数据,虽然这个方法能够保证数据零丢失,在发生错误后小概率许多记录被消费两次。此错误的发生时因为在spark streaming数据可靠接受和zookeeper跟踪的offset相互矛盾(数据不一致)

    所以在直连方式中我们使用底层kafka API来做跟踪offset,而不使用zookeeper跟踪offset;在直连方式中,offset的追踪是根据spark streaming的checkpoint,消除了在spark streaming和zookeeper/kafka之间的矛盾(数据不一致),所以,每一条记录只会被spark streaming有效读取一次。

    此方法的缺点是,不会更新zookeeper中的offset,因此以zookeeper作为基础的kafka镜像监控工具不会显示进度。但是,可以在每个批次中访问由此方法处理的偏移量,并自己更新zookeeper的offset

你可能感兴趣的:(学习分享)