`
m635674608
  • 浏览: 5027466 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Spark Streaming 结合 Kafka 两种不同的数据接收方式比较

 
阅读更多

DirectKafkaInputDStream 只在 driver 端接收数据,所以继承了 InputDStream,是没有 receivers 的

在结合 Spark Streaming 及 Kafka 的实时应用中,我们通常使用以下两个 API 来获取最初的 DStream(这里不关心这两个 API 的重载):

KafkaUtils#createDirectStream

KafkaUtils#createStream

这两个 API 除了要传入的参数不同外,接收 kafka 数据的节点、拉取数据的时机也完全不同。本文将分别就两者进行详细分析。

KafkaUtils#createStream

先来分析 createStream ,在该函数中,会新建一个 KafkaInputDStream 对象, KafkaInputDStream 继承于 ReceiverInputDStream 。

  1. 继承ReceiverInputDStream的类需要重载 getReceiver 函数以提供用于接收数据的 receiver
  2. recever 会调度到某个 executor 上并启动,不间断的接收数据并将收到的数据交由 ReceiverSupervisor 存成 block 作为 RDD 输入数据

KafkaInputDStream当然也实现了getReceiver方法,如下:

def getReceiver(): Receiver[(K, V)] = {
    if (!useReliableReceiver) {
      //< 不启用 WAL
      new KafkaReceiver[K, V, U, T](kafkaParams, topics, storageLevel)
    } else {
      //< 启用 WAL
      new ReliableKafkaReceiver[K, V, U, T](kafkaParams, topics, storageLevel)
    }
  }

根据是否启用 WAL,receiver 分为 KafkaReceiver 和 ReliableKafkaReceiver。 

  1. receiver 是如何被分发启动的
  2. receiver 接受数据后数据的流转过程
    并在 揭开Spark Streaming神秘面纱③ - 动态生成 job 一文中详细介绍了
  3. receiver 接受的数据存储为 block 后,如何将 blocks 作为 RDD 的输入数据
  4. 动态生成 job

以上两篇文章并没有具体介绍 receiver 是如何接收数据的,当然每个重载了 ReceiverInputDStream 的类的 receiver 接收数据方式都不相同。下图描述了 KafkaReceiver 接收数据的具体流程:

KafkaUtils#createDirectStream

在 揭开Spark Streaming神秘面纱③ - 动态生成 job 中,介绍了在生成每个 batch 的过程中,会去取这个 batch 对应的 RDD,若未生成该 RDD,则会取该 RDD 对应的 blocks 数据来生成 RDD,最终会调用到 DStream#compute(validTime: Time) 函数,在 KafkaUtils#createDirectStream 调用中,会新建 DirectKafkaInputDStream , DirectKafkaInputDStream#compute(validTime: Time) 会从 kafka 拉取数据并生成 RDD,流程如下:

如上图所示,该函数主要做了以下三个事情:

  1. 确定要接收的 partitions 的 offsetRange,以作为第2步创建的 RDD 的数据来源
  2. 创建 RDD 并执行 count 操作,使 RDD 真实具有数据
  3. 以 streamId、数据条数,offsetRanges 信息初始化 inputInfo 并添加到 JobScheduler 中

进一步看 KafkaRDD 的 getPartitions 实现:

override def getPartitions: Array[Partition] = {
    offsetRanges.zipWithIndex.map { case (o, i) =>
        val (host, port) = leaders(TopicAndPartition(o.topic, o.partition))
        new KafkaRDDPartition(i, o.topic, o.partition, o.fromOffset, o.untilOffset, host, port)
    }.toArray
  }

从上面的代码可以很明显看到,KafkaRDD 的 partition 数据与 Kafka topic 的某个 partition 的 o.fromOffset 至 o.untilOffset 数据是相对应的,也就是说 KafkaRDD 的 partition 与 Kafka partition 是一一对应的

通过以上分析,我们可以对这两种方式的区别做一个总结:

  1. createStream会使用 Receiver;而createDirectStream不会
  2. createStream使用的 Receiver 会分发到某个 executor 上去启动并接受数据;而createDirectStream直接在 driver 上接收数据
  3. createStream使用 Receiver 源源不断的接收数据并把数据交给 ReceiverSupervisor 处理最终存储为 blocks 作为 RDD 的输入,从 kafka 拉取数据与计算消费数据相互独立;而createDirectStream会在每个 batch 拉取数据并就地消费,到下个 batch 再次拉取消费,周而复始,从 kafka 拉取数据与计算消费数据是连续的,没有独立开
  4. createStream中创建的KafkaInputDStream 每个 batch 所对应的 RDD 的 partition 不与 Kafka partition 一一对应;而createDirectStream中创建的 DirectKafkaInputDStream 每个 batch 所对应的 RDD 的 partition 与 Kafka partition 一一对应

 

来自:http://www.jianshu.com/p/60344796f8a5

 http://www.open-open.com/lib/view/open1482308535541.html

分享到:
评论

相关推荐

    Spark Streaming 与 Kafka 集成原理.pdf

    Spark Streaming 与 Kafka 集成原理提供了两种不同的数据接收方式,分别是 Receiver-based Approach 和 Direct Approach(No Receivers)。Receiver-based Approach 是 Spark Streaming 早期的数据接收方式,具有...

    spark-streaming-kafka-0-8-assembly_2.11-2.4.5

    Spark Streaming和Kafka集成是大数据处理领域中的常见组合,它们结合了Spark的实时处理能力与Kafka的消息队列优势。`spark-streaming-kafka-0-8-assembly_2.11-2.4.5`是Apache Spark的一个库,用于在Spark Streaming...

    小晨精品Spark Streaming 与 Kafka 集成原理.pdf

    集成 Spark Streaming 和 Kafka 的方式主要有两种: 1. **Receiver-based Approach**: 在这种模式下,Spark Streaming 会启动一个 Receiver,通常是 KafkaReceiver,该 Receiver 在后台线程中从 Kafka 主题订阅并...

    基于Spark streaming+Kafka+RedisHBase的GBDT+LR推荐排序模型.zip

    7. **推荐排序模型**:结合GBDT和LR的模型可以充分利用两种算法的优点。GBDT先对大量特征进行排序和筛选,减少特征维度,然后LR利用简化后的特征进行预测,有效降低计算复杂度,同时保持较高的预测精度。 8. **流程...

    Spark Streaming 示例

    `SparkStreaming.zip` 文件可能包含了一个示例项目,演示了如何创建一个 Spark Streaming 应用来从 Kafka 消费数据。代码通常会包含以下步骤: 1. 创建 SparkConf 对象,配置 Spark 应用的属性,如应用程序名称、...

    spark Streaming和structed streaming分析

    在容错方面,Spark Streaming支持两种容错机制:Executor端长时容错和Driver端长时容错。这些机制确保即使出现故障,应用的持续运行也不会受到影响。 Structured Streaming是Spark 2.x中引入的模块,其目的是提供一...

    Spark Streaming

    Spark Streaming支持从多种数据源接收数据流,如Kafka、Flume、Kinesis或Twitter等,并能够将处理后的结果推送到数据库或仪表板。 Tathagata“TD”Das是Spark Streaming的领头开发者,同时也是Apache Spark的核心...

    【SparkStreaming篇02】SparkStreaming之Dstream创建1

    本文主要介绍了两种创建DStream的方法:通过RDD队列和自定义数据源。 1. **通过RDD队列创建DStream**: 在这个例子中,我们首先创建一个SparkConf实例来配置Spark应用程序,设置master为"local[*]",表示在本地...

    spark Streaming原理和实战

    相比于传统的批处理技术,Spark Streaming提供了对实时数据流的支持,使得开发者能够在大数据环境中实现高效的数据处理任务。 #### 二、核心概念:DStream **DStream (Discretized Stream)** 是Spark Streaming中...

    SparkStreaming原理介绍

    相比于传统的批处理,Spark Streaming 具备更高的实时性和更低的延迟,能够有效地处理来自不同数据源的实时数据流。 ##### 1.2 术语定义 - **离散流(Discretized Stream)或 DStream**:Spark Streaming 中的核心...

    基于Kafka Spark的数据处理系统.pptx

    Kafka作为一个分布式流处理平台,负责实时数据的生产和消费,而Spark则以其高效的计算能力,尤其是Spark Streaming组件,为实时数据分析提供了强大支持。本篇文章将深入探讨基于Kafka和Spark构建的数据处理系统的...

    java实现SparkSteamming接受发送Kafka消息

    在IT行业中,大数据处理与实时流计算是至关重要的技术领域,而Spark Streaming和Kafka作为这一领域的两大核心组件,常被结合使用以实现高效的数据处理和传输。本篇将详细探讨如何使用Java来实现Spark Streaming从...

    metaQ向spark传数据

    总结来说,将MetaQ中的数据传递到Spark涉及的主要步骤包括:配置MetaQ与Kafka的连接,使用Spark Streaming从Kafka消费数据,使用Spark的DataFrame/Dataset API进行数据处理,以及选择合适的方式输出处理结果。...

    基于spark-ml,spark-mllib,spark-streaming的推荐算法实现.zip

    Spark Streaming 是 Spark 用于实时数据处理的模块,它能从各种数据源(如 Kafka、Flume、Twitter 等)接收流数据,然后以微批次的形式处理这些数据。这种设计允许 Spark Streaming 拥有与批处理相似的 API,同时又...

    vsl4oracle:Spark Streaming Kafka for Oracle Database (SQL) 演示示例

    最近我需要重建一个用于处理从Kafka接收到的消息的spark项目。 但是,原来的项目只是使用spark Streaming来接受,并没有真正通过streaming函数来处理消息。 而且处理消息的结构相当恶心,通过json格式编写的复杂配置...

    Spark学习笔记Spark Streaming的使用

    4. Spark Streaming 接收数据的两种方式 * Receiver 方式:使用 Receiver 来接收数据,偏移量是由 ZooKeeper 来维护的,编程简单但是效率低。 * Direct 方式:使用 Direct 来接收数据,偏移量是由我们来手动维护的...

    spark学习文档.rar

    Spark Streaming能够接收来自多种源的数据流,如Kafka、Flume、Twitter等,然后以时间窗口为单位进行处理。它的DStream(Discretized Stream)抽象将连续的数据流划分为一系列离散化的批次,从而利用Spark核心的并行...

    kafka-connector的使用.zip_kafka

    Kafka Connector 是 Apache Kafka 项目的一部分,它提供了一种标准的方式来连接 Kafka 集群与其他数据源或数据接收器。Kafka Connect 使得数据的摄取(ingestion)和分发变得高效且可靠,是大数据生态中的重要组件。...

    Spark讲义(下)1

    创建出来的DStream支持两种操作:转化操作,会生成一个新的DStream输出操作(output operation),把数据写入外部系统中。 Spark Streaming架构 Spark Streaming使用mini-batch的架构,把流式计算当作一系列连续的小...

Global site tag (gtag.js) - Google Analytics