繁体   English   中英

Spark 局部变量广播到执行器

Spark local variable broadcast to executor

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

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 会自动将局部变量填充到执行器吗? 如果没有,执行者如何看到驱动程序的局部变量?

在此处输入图片说明

4 个回复

海·爱德华兹

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

干杯,

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

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

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

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

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

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

2 Spark:累加器和局部变量之间的差异

在探索Spark累加器时,我试图理解并展示Spark中的累加器和常规变量之间的区别。 但是输出似乎与我的期望不符。 我的意思是,累加器和计数器在程序末尾具有相同的值,并且能够在转换函数内读取累加器(根据文档,只有驱动程序才能读取累加器)。 难道我做错了什么? 我的理解正确吗? 输 ...

3 spark执行器是如何创建的?

我试图了解 spark executors 是如何启动的以及由谁启动的。 我的理解是 Driver 将负责一切,尤其是SparkSession.builder将创建与集群管理器和执行器的连接。 似乎构建器也会配置执行器。 这是否意味着执行程序是在builder.getOrCreate()期间由驱动程 ...

4 Spark 重新分区执行器

我有一个大约 100GB 的数据源,我正在尝试使用日期列对其进行分区。 为了避免分区内出现小块,我添加了一个 repartition(5) 以在每个分区内最多包含 5 个文件: 我的问题是,我分配的 30 个执行程序中只有 5 个实际在运行。 最后我得到了我想要的(每个分区中有 5 个文件), ...

5 Spark结构化流,执行器由于广播累积而导致内存不足故障

我们的ETL管道正在使用Spark结构化流传输来丰富传入数据(与静态数据帧结合),然后再存储到cassandra中。 当前,查询表是csv文件(在HDFS中),这些文件作为数据帧加载并在每个触发器上与每批数据结合在一起。 查找表数据帧似乎在每个触发器上广播并存储在内存存储中。 这吞噬了执行 ...

6 Spark执行器故障/并非所有执行器都同时执行

我是pyspark的新手,在执行作业时遇到一些问题。 我正在将作业发送到具有正确配置的2个执行程序的独立spark实例,有时两个执行程序开始并行工作并正确利用分配的资源,并且Job成功完成。 但是有时,只有一个执行程序开始工作,而另一个则在提交最初完美执行的SAME作业时保持闲置状态。 ...

7 Activiti执行局部变量

假设我有一个这样的过程: 两个子进程都具有并行基数。 我想在外部脚本任务中设置一个执行局部变量,并能够在内部脚本任务中获取该变量。 这样,每个内部子流程都可以从其各自的父子流程访问变量。 但这不是那么简单,因为外部脚本任务将在不是内部脚本任务的祖先(最终父代)的执行中执行。 ...

8 Spark中的执行器超时错误

我正在尝试执行以下操作: 取一个数据框 将其转换为rdd 执行一系列操作 按键减少+ rdds的并集 转换回数据框 保存到s3 我曾尝试使用数据帧,但在那种情况下,由于某些行的大小超过2GB,我最终遇到了OOM错误。 在作业运行期间 ...

9 Spark 执行器总是 EXIT

我有一个安装了 spark 的 2 节点集群,如下所示: 第一个节点:一个master和一个worker 第二个节点:另一个工人 每次我用命令$SPARK_HOME/sbin/start-all.sh启动集群时,我都会遇到第二个工人的异常; 执行器被立即创建和关闭。 这会导致执行器数量异 ...

10 Spark:整个执行器的唯一ID

是否可以在Spark中使用Accumulator生成唯一的ID,也可以在执行程序之间读取它,从而生成某种“唯一ID”? 从文档中可以理解,您只能从驱动程序访问它。 万一有其他替代方法吗? ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM