apache-spark - Spark 广播连接将数据加载到驱动程序

标签 apache-spark

据我所知,当Spark执行广播连接时,它首先将最小的(广播)RDD收集到驱动程序以从中创建广播变量,然后才将其上传到每个目标节点。

如果广播 RDD > Spark.driver.memory,有时会导致驱动程序内存流出。

问题:为什么它会这样工作?仅在目标节点之间混洗广播数据会更有效,因为混洗的数据量是相同的,但我们可以避免驱动程序溢出。

示例:假设您有 3 个节点,每个节点上要广播 1 GB 的数据,并且每个节点的吞吐量为 1 GB/s。

Spark 方法 - 每个节点必须向驱动程序上传其数据片段 (1gb) 并下载广播变量 (3 * 1g = 3gb),因此每个节点总共应传输 4 GB,需要 4 秒。

随机播放方法 - 一个节点必须将 1GB 上传到另外 2 个节点并下载 1GB 来自这些。同样,总量为 4 GB,需要 4 秒。

最佳答案

首先广播连接用于连接一个大表和一个极小的表。

然后如果使用shuffle而不是把小df(table)收集回driver然后广播,你只会注意到小df被洗牌了,但实际上大df也同时被洗牌了,这是相当时间的消耗。

关于apache-spark - Spark 广播连接将数据加载到驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40303468/

相关文章:

apache-spark - Jupyter Notebook 上未显示结构化流输出

java - 线程中的异常 "main"java.lang.ClassNotFoundException : org. Spark_project.protobuf.GenerateMessage

apache-spark - AWS EMR Spark : Error: Cannot load main class from JAR

python - 使用 PySpark 读取 Excel 文件 : Failed to find data source: com. crealytics.spark.excel

apache-spark - Spark缓存对优化逻辑计划的影响

apache-spark - 如何以自定义格式加载带有时间戳的CSV?

hadoop - 如何从 pyspark 连接到 Teradata?

scala - Spark/Scala 并行写入 redis

scala - 如何计算 Spark RDD 的平均值?

scala - 将df.show()的内容另存为Spark-scala应用程序中的字符串