主页 > 新闻资讯 > 大数据培训:Spark Streaming数据源导入

大数据培训:Spark Streaming数据源导入

作者:张老师 浏览次数: 2021-04-21 17:20
Spark Streaming作为Spark的流处理引擎,主要是负责数据流的处理,而这就需要集中各种各样的数据源,而基于不同来源的数据,其性质和格式不一,而Spark Streaming也提供了不同的导入方式。今天的大数据培训分享,我们就来具体讲讲Spark Streaming数据源导入。

Spark Streaming数据源导入,主要来说是两种方式用得多,基于Receiver的方式和Direct的方式。下面具体来讲——

大数据培训:Spark Streaming数据源导入

基于Receiver的方式
大数据培训:Spark Streaming数据源导入

Receiver的作用是从数据源收集数据,然后将数据传送给Spark Streaming。基本原理是:随着数据的不断到来,在相对应的batch interval时间间隔内,这些数据会被收集并且打包成block,只要等到batch interval时间完成了,收集的数据block会被发送给spark进行处理。

如上图:当Spark Streaming启动时,receiver开始收集数据。在t0的batch interval结束时(即收集完了该时间段内的数据),收集到的block #0会被发送到Spark进行处理。在t2时刻,Spark会处理t1的batch interval的数据block,与此同时会不停地收集t2的batch interval对应的block**#2**。

常见的基于Receiver的数据源包括:Kafka, Kinesis, Flume,Twitter。除此之外,用户也可以通过继承 Receiver抽象类,实现onStart()与onStop()两个方法,进行自定义Receiver。

基于Direct的方式

Spark 1.3中引入了这种无Receiver的Direct方法,以确保更强的端到端保证。该方法不是使用Receiver来接收数据,而是定期查询Kafka每个topic+partition中的最新偏移量,并相应地定义要在每个批次中处理的偏移量范围。启动用于处理数据的作业时,Kafka的简单consumer API用于读取Kafka定义的偏移量范围(类似于从文件系统读取文件)。请注意,此功能是在Scala和Java API的Spark 1.3引入的,在Python API的Spark 1.4中引入的。

基于Direct的方式具有以下优点:

简化并行读取

如果要读取多个partition,不需要创建多个输入DStream然后对他们进行union操作。Spark会创建跟Kafka partition一样多的RDD partition,并且会并行从kafka中读取数据。所以在kafka partition和RDD partition之间,有一一对应的关系。

高性能

如果要保证数据零丢失,在基于Receiver的方式中,需要开启WAL机制。这种方式其实效率很低,因为数据实际被复制了两份,kafka自己本身就有高可靠的机制,会对数据复制一份,而这里又会复制一份到WAL中。而基于Direct的方式,不依赖于Receiver,不需要开启WAL机制,只要kafka中做了数据的复制,那么就可以通过kafka的副本进行恢复。

Exactly-once语义

基于Receiver的方式,使用kafka的高阶API来在Zookeeper中保存消费过的offset。这是消费kafka数据的传统方式。这种方式配合WAL机制,可以保证数据零丢失的高可靠性,但是却无法保证Exactly-once语义(Spark和Zookeeper之间可能是不同步的)。基于Direct的方式,使用kafka的简单API,Spark Streaming自己就负责追踪消费的offset,并保存在checkpoint中。Spark自己一定是同步的,因此可以保证数据时消费一次且仅消费一次。

Spark Streaming集成kafka

使用KafkaUtils添加Kafka数据源,源码如下:

  def createDirectStream[K, V](
      ssc: StreamingContext,
      locationStrategy: LocationStrategy,
      consumerStrategy: ConsumerStrategy[K, V]
    ): InputDStream[ConsumerRecord[K, V]] = {
    val ppc = new DefaultPerPartitionConfig(ssc.sparkContext.getConf)
    createDirectStream[K, V](ssc, locationStrategy, consumerStrategy, ppc)
  }

具体参数解释:

K:Kafka消息key的类型

V:Kafka消息value的类型

ssc:StreamingContext

locationStrategy: LocationStrategy,根据Executor中的主题的分区来调度consumer,即尽可能地让consumer靠近leader partition。该配置可以提升性能,但对于location的选择只是一种参考,并不是绝对的。可以选择如下方式:

注意:多数情况下使用PreferConsisten,其他两种方式只是在特定的场景使用。这种配置只是一种参考,具体的情况还是会根据集群的资源自动调整。

PreferBrokers:Spark和Kafka运行在同一个节点上,可以使用此种方式
PreferConsistent:大部分情况使用此方式,它将一致地在所有Executor之间分配分区
PreferFixed:将特定的主题分区放置到特定的主机上,在数据负载不均衡时使用
consumerStrategy:消费策略,主要有下面三种方式:

注意:大多数情况下使用Subscribe方式。

Subscribe:订阅指定主题名称的主题集合
SubscribePattern:通过正则匹配,订阅相匹配的主题数据
Assign:订阅一个主题+分区的集合

关于大数据培训,Spark Streaming数据源导入,以上就为大家做了大致的介绍了。Spark Streaming在数据源引入上,两种方式需要结合到实际情况去用,在不同的场景下,各有其优缺点所在。成都加米谷大数据,专业大数据培训机构,大数据开发,数据分析与挖掘,零基础班本月正在招生中,课程大纲及试听课程可联系客服获取!
热点排行
推荐文章
立即申请>>