DirectKafkaInputDStream 只在 driver 端接收数据,所以继承了 InputDStream,是没有 receivers 的
在结合 Spark Streaming 及 Kafka 的实时应用中,我们通常使用以下两个 API 来获取最初的 DStream(这里不关心这两个 API 的重载):
KafkaUtils#createDirectStream
及
KafkaUtils#createStream
这两个 API 除了要传入的参数不同外,接收 kafka 数据的节点、拉取数据的时机也完全不同。本文将分别就两者进行详细分析。
KafkaUtils#createStream
先来分析 createStream ,在该函数中,会新建一个 KafkaInputDStream 对象, KafkaInputDStream 继承于 ReceiverInputDStream 。
- 继承ReceiverInputDStream的类需要重载 getReceiver 函数以提供用于接收数据的 receiver
- 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。
- receiver 是如何被分发启动的
- receiver 接受数据后数据的流转过程
并在 揭开Spark Streaming神秘面纱③ - 动态生成 job 一文中详细介绍了 - receiver 接受的数据存储为 block 后,如何将 blocks 作为 RDD 的输入数据
- 动态生成 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,流程如下:
如上图所示,该函数主要做了以下三个事情:
- 确定要接收的 partitions 的 offsetRange,以作为第2步创建的 RDD 的数据来源
- 创建 RDD 并执行 count 操作,使 RDD 真实具有数据
- 以 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 是一一对应的
通过以上分析,我们可以对这两种方式的区别做一个总结:
- createStream会使用 Receiver;而createDirectStream不会
- createStream使用的 Receiver 会分发到某个 executor 上去启动并接受数据;而createDirectStream直接在 driver 上接收数据
- createStream使用 Receiver 源源不断的接收数据并把数据交给 ReceiverSupervisor 处理最终存储为 blocks 作为 RDD 的输入,从 kafka 拉取数据与计算消费数据相互独立;而createDirectStream会在每个 batch 拉取数据并就地消费,到下个 batch 再次拉取消费,周而复始,从 kafka 拉取数据与计算消费数据是连续的,没有独立开
- 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 集成原理提供了两种不同的数据接收方式,分别是 Receiver-based Approach 和 Direct Approach(No Receivers)。Receiver-based Approach 是 Spark Streaming 早期的数据接收方式,具有...
Spark Streaming和Kafka集成是大数据处理领域中的常见组合,它们结合了Spark的实时处理能力与Kafka的消息队列优势。`spark-streaming-kafka-0-8-assembly_2.11-2.4.5`是Apache Spark的一个库,用于在Spark Streaming...
集成 Spark Streaming 和 Kafka 的方式主要有两种: 1. **Receiver-based Approach**: 在这种模式下,Spark Streaming 会启动一个 Receiver,通常是 KafkaReceiver,该 Receiver 在后台线程中从 Kafka 主题订阅并...
7. **推荐排序模型**:结合GBDT和LR的模型可以充分利用两种算法的优点。GBDT先对大量特征进行排序和筛选,减少特征维度,然后LR利用简化后的特征进行预测,有效降低计算复杂度,同时保持较高的预测精度。 8. **流程...
`SparkStreaming.zip` 文件可能包含了一个示例项目,演示了如何创建一个 Spark Streaming 应用来从 Kafka 消费数据。代码通常会包含以下步骤: 1. 创建 SparkConf 对象,配置 Spark 应用的属性,如应用程序名称、...
在容错方面,Spark Streaming支持两种容错机制:Executor端长时容错和Driver端长时容错。这些机制确保即使出现故障,应用的持续运行也不会受到影响。 Structured Streaming是Spark 2.x中引入的模块,其目的是提供一...
Spark Streaming支持从多种数据源接收数据流,如Kafka、Flume、Kinesis或Twitter等,并能够将处理后的结果推送到数据库或仪表板。 Tathagata“TD”Das是Spark Streaming的领头开发者,同时也是Apache Spark的核心...
本文主要介绍了两种创建DStream的方法:通过RDD队列和自定义数据源。 1. **通过RDD队列创建DStream**: 在这个例子中,我们首先创建一个SparkConf实例来配置Spark应用程序,设置master为"local[*]",表示在本地...
相比于传统的批处理技术,Spark Streaming提供了对实时数据流的支持,使得开发者能够在大数据环境中实现高效的数据处理任务。 #### 二、核心概念:DStream **DStream (Discretized Stream)** 是Spark Streaming中...
相比于传统的批处理,Spark Streaming 具备更高的实时性和更低的延迟,能够有效地处理来自不同数据源的实时数据流。 ##### 1.2 术语定义 - **离散流(Discretized Stream)或 DStream**:Spark Streaming 中的核心...
Kafka作为一个分布式流处理平台,负责实时数据的生产和消费,而Spark则以其高效的计算能力,尤其是Spark Streaming组件,为实时数据分析提供了强大支持。本篇文章将深入探讨基于Kafka和Spark构建的数据处理系统的...
在IT行业中,大数据处理与实时流计算是至关重要的技术领域,而Spark Streaming和Kafka作为这一领域的两大核心组件,常被结合使用以实现高效的数据处理和传输。本篇将详细探讨如何使用Java来实现Spark Streaming从...
总结来说,将MetaQ中的数据传递到Spark涉及的主要步骤包括:配置MetaQ与Kafka的连接,使用Spark Streaming从Kafka消费数据,使用Spark的DataFrame/Dataset API进行数据处理,以及选择合适的方式输出处理结果。...
Spark Streaming 是 Spark 用于实时数据处理的模块,它能从各种数据源(如 Kafka、Flume、Twitter 等)接收流数据,然后以微批次的形式处理这些数据。这种设计允许 Spark Streaming 拥有与批处理相似的 API,同时又...
最近我需要重建一个用于处理从Kafka接收到的消息的spark项目。 但是,原来的项目只是使用spark Streaming来接受,并没有真正通过streaming函数来处理消息。 而且处理消息的结构相当恶心,通过json格式编写的复杂配置...
4. Spark Streaming 接收数据的两种方式 * Receiver 方式:使用 Receiver 来接收数据,偏移量是由 ZooKeeper 来维护的,编程简单但是效率低。 * Direct 方式:使用 Direct 来接收数据,偏移量是由我们来手动维护的...
Spark Streaming能够接收来自多种源的数据流,如Kafka、Flume、Twitter等,然后以时间窗口为单位进行处理。它的DStream(Discretized Stream)抽象将连续的数据流划分为一系列离散化的批次,从而利用Spark核心的并行...
Kafka Connector 是 Apache Kafka 项目的一部分,它提供了一种标准的方式来连接 Kafka 集群与其他数据源或数据接收器。Kafka Connect 使得数据的摄取(ingestion)和分发变得高效且可靠,是大数据生态中的重要组件。...
创建出来的DStream支持两种操作:转化操作,会生成一个新的DStream输出操作(output operation),把数据写入外部系统中。 Spark Streaming架构 Spark Streaming使用mini-batch的架构,把流式计算当作一系列连续的小...