Spark:火花流中的接收器是瓶颈吗?

Posted

技术标签:

【中文标题】Spark:火花流中的接收器是瓶颈吗?【英文标题】:Spark: Is receiver in spark streaming a bottleneck? 【发布时间】:2016-03-14 06:09:48 【问题描述】:

我想了解接收器在 Spark Streaming 中的工作原理。据我了解,将有一个接收器任务在执行器中运行,收集数据并保存为 RDD。调用 start() 时接收器开始读取。需要澄清以下内容。

    Spark Streaming 作业启动多少个接收器?多个还是一个? 接收器是基于推送还是基于拉取? 在任何情况下接收器都会成为瓶颈吗? 为实现并行度,应在工作节点之间对数据进行分区。因此,对于流式数据,数据是如何在节点之间分布的。 如果新节点上基于批处理时间间隔形成一个新的RDD,那么SparkContext在Job提交后如何将transform函数序列化到节点上? 可以通过参数控制接收器的发射数量吗?

想了解 Spark Streaming 和接收器的结构。

【问题讨论】:

您指的是哪些接收器? Kafka 你的数据源是什么? @YuvalItzchakov 它可以是任何接收器。我想了解接收器在流媒体中的工作原理。 我不确定 Kinesis 接收器是否与 Kafka 接收器相同。如果我理解您的意思,底层消息代理可以确定不同的语义。 【参考方案1】:

我将根据我使用 Kafka 接收器的经验来回答,这似乎或多或少类似于 Kinesis 中的情况。

Spark Streaming 作业启动多少个接收器?。多个或一个。

您打开的每个接收器都是一个连接。在Kafka中,如果要从多个partition并发读取,需要开启多个receiver,并且通常union在一起。

接收器是基于推还是基于拉?

拉。在 Spark Streaming 中,每个批处理间隔(在创建 StreamingContext 时指定)从 Kafka 中提取数据。

接收器在任何情况下都会成为瓶颈吗?

广泛的问题。这取决于。如果您的批处理间隔很长并且您只有一个接收器,那么您的积压可能会开始填满。在您在流式传输作业中达到最佳平衡之前,这主要是反复试验。

为了达到并行度,数据应该在工作节点之间进行分区。所以对于流数据,数据是如何在节点间分布的。

您可以通过向底层数据源打开多个接收器来创建我之前所说的并发性。此外,在读取数据后,可以使用标准的 Spark 数据分区机制对其进行重新分区。

如果新节点上基于批处理时间间隔形成新的RDD,那么SparkContext在Job提交后如何将transform函数序列化到节点上。

通过使用选择的序列化程序并通过线路发送数据,它在阶段中序列化每个任务的方式相同。不知道我明白你的意思。

可以通过参数控制发射的接收器数量吗?

是的,您可以有一个配置参数来确定您打开的接收器的数量。这样的代码可以是这样的:

// This may be your config parameter
val numStreams = 5
val kafkaStreams = (1 to numStreams).map  i => KafkaUtils.createStream(...) 

val unifiedStream = streamingContext.union(kafkaStreams)
unifiedStream.print()

【讨论】:

以上是关于Spark:火花流中的接收器是瓶颈吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何增加火花流接收器

火花流中的广播变量空指针异常

生命中的火花|Spark

Spark 结构化流中的临时视图

Spark 流式接收器内存不足 (OOM)

使用 ForeachWriter 在 Spark 流中实现 Cassandra 接收器