var countryMap = Map("Amy" -> "Canada", "Sam" -> "US", "Bob" -> "Canada")
val names = List("Amy", "Sam", "Eric")
sc.parallelize(names).flatMap(broadcastMap.value.get).collect.foreach(println)

//output
Canada
US

我正在 YARN 模式下运行这个 spark 作业,并且我确定驱动程序和执行程序不在同一个节点/JVM 中(见附图)。 由于 countryMap 不是广播变量,因此执行程序不应看到它,并且此代码不应打印任何内容。 但是,它打印了CanadaUS

我的问题是,如果它们是可序列化的,Spark 会自动将局部变量填充到执行器吗? 如果没有,执行者如何看到驱动程序的局部变量?

在此处输入图片说明

#1楼 票数:0

海·爱德华兹

当您调用将结果集带回驱动程序的collect ,尝试执行映射。 您可以找到映射的原因是生成的。

干杯,

#2楼 票数:0

局部变量:驱动程序和每个执行器,不需要序列化,在执行器/驱动程序中共享。 主要变量:驱动程序和任务的每个副本(隔离),需要序列化

#3楼 票数:0

Spark 操作通过一组阶段执行,由分布式“洗牌”操作分隔。 Spark 自动广播每个阶段内任务所需的公共数据 以这种方式广播的数据以序列化形式缓存并在运行每个任务之前反序列化。 这意味着显式创建广播变量仅在跨多个阶段的任务需要相同数据或以反序列化形式缓存数据很重要时才有用。

参考https://spark.apache.org/docs/2.3.0/rdd-programming-guide.html#broadcast-variables

基本上,驱动程序中的局部变量会自动广播给执行程序。 但是,当您需要跨不同阶段使用广播变量时​​,您需要创建广播变量。

#4楼 票数:0

为了让broadcastMap.value.get函数在集群上运行,Spark 需要序列化broadcastMap并发送到每个执行器,所以你有一个函数,数据已经以对象实例的形式附加到它上面。 如果您使broadcastMap类不可序列化 - 您将无法运行此代码。

因此,Spark 不会向执行程序填充局部变量,而是您明确告诉它序列化对象broadcastMap并分布式运行该对象的方法。

  ask by Edward Wang translate from so

未解决问题?本站智能推荐:

1回复

Spark:将广播变量传递给执行者

我正在使用以下代码将广播变量传递给我的所有执行者。 该代码似乎有效,但我不知道我的方法是否足够好。 只想看看是否有人有更好的建议。 非常感谢你! 其中myRddMap的类型为org.apache.spark.rdd.RDD[(String, (String, String))]
1回复

广播Spark作业的更新

我在这里已经看到了这个问题,但是他们本质上只专注于火花流传输,而我找不到适合批量处理的合适解决方案。 这个想法是循环几天,并且在每次迭代/每天,它都会更新有关前一天的信息(用于当前迭代)。 该代码如下所示: 使用broadcastMap.destroy()不会运行,因为它不允许我再次
1回复

带有广播加入的Spark流

我有一个火花流用例,其中我打算保持在每个执行器上广播和缓存数据集。 流中的每个微批处理都会从RDD中创建一个数据帧并加入该批处理。 下面给出的我的测试代码将对每个批次执行广播操作。 有没有办法只播放一次? 对于每个批次,都会读取此文件并进行广播。 关于广播数据集仅建议一次?
1回复

在广播变量中查找值

我想通过应用广播变量来加入两个集合。 我正在尝试实施Spark的第一个建议:将2元组键RDD与单键RDD结合在一起的最佳策略是什么? 但是,如此处所述: 广播变量无法获取我需要使用collect()而不是collectAsMAp()的所有数据 。 我尝试如下调整代码: 但是似
1回复

无法在转换中访问广播变量

我在转换函数中访问变量时遇到问题。 有人可以帮帮我吗? 这是我的相关课程和功能。 在另一个文件中: 每次运行时我都会SparkException: Failed to get broadcast_1_piece0 of broadcast_1尝试访问cache.value时S
6回复

如何更新火花流中的广播变量?

我相信,我有一个相对常见的 Spark 流用例: 我有一个对象流,我想根据一些参考数据进行过滤 最初,我认为使用广播变量实现这将是一件非常简单的事情: 但是,尽管很少,我的参考数据会定期更改 我的印象是我可以在驱动程序上修改和重新广播我的变量,它会传播给每个工作人员,但是Broadcast对象
1回复

Spark Streaming:广播变量,java.lang.ClassCastException

我尝试从存储在HDFS中的静态文本文件中读取数据,将其内容存储到ArrayBuffer中,而ArrayBuffer又应通过sparkContext.broadcast作为BroadcastVariable进行广播。 . 我正在使用cloudera的spark, 。 我使用spark-s
1回复

尝试在mapPartitionsWithIndex侧面广播时发生NullPointerException

我正在尝试在mapPartitionsWithIndex函数内部广播数组,但这会引发NullPointerException。 这是我的代码 var bestSolutions = bcWrapper(sc, (Array(): Array[BAT1], 3: Int)) // rdd.