当前位置: 首页 > 知识库问答 >
问题:

火花SQL:为什么火花不一直做广播

穆商震
2023-03-14

我在aws s3和emr上使用Spark 2.4进行项目,我有一个左连接,有两个巨大的数据部分。火花执行不稳定,它经常因内存问题而失败。

集群有10台m3.2xlarge类型的机器,每台机器有16个vCore、30 GiB内存、160个SSD GB存储。

我有这样的配置:

          "--executor-memory",
          "6512M",
          "--driver-memory",
          "12g",
          "--conf",
          "spark.driver.maxResultSize=4g",
          "--conf",
          "spark.sql.autoBroadcastJoinThreshold=1073741824",

左侧连接发生在 150GB 的左侧和大约 30GB 的右侧之间,因此有很多随机播放。我的解决方案是将右侧切得足够小,例如 1G,这样就不会随机播放数据,而是广播数据。唯一的问题是在第一个左连接之后,左侧已经有右侧的新列,所以接下来的左侧连接将有重复列,如col1_right_1、col2_right_1、col1_right_2、col2_right_2,我必须将 col1_right_1/col1_right_2 重命名为 col1_left, col2_right_1/col2_right_2 至 col2_left。

所以我想知道,为什么Spark允许随机播放,而不是到处使用广播。广播不应该总是比随机播放快吗?为什么Spark不像我说的那样加入,切成一小块然后广播?

共有1个答案

融修平
2023-03-14

让我们看看这两个选项。如果我理解正确,您正在为数据框架的每一部分执行广播和连接,其中块的大小是最大广播阈值。这里的优势是,您基本上通过网络发送只有一个数据框架,但您正在执行多个连接。要执行的每个连接都有一个开销。从:

广播的数据集在执行器计算机上可用后,它将与其他数据集的每个分区联接。也就是说,对于其他数据集的每一行(在每个分区中)的连接列的值,将从广播数据集中提取相应的行并执行连接。

这意味着,对于每批广播联接,在每个分区中,您必须查看整个其他数据集并执行联接。

排序合并或哈希连接必须执行随机(如果数据集分区不相等),但它们的连接效率更高。

 类似资料:
  • 我有一张小桌子(2k)的记录和一张大桌子(5 mil)的记录。我需要从小表中获取所有数据,只从大表中获取匹配数据,因此我在下面执行了查询

  • 一些脚本在工作时什么也不做,当我手动运行它们时,其中一个失败了,出现了以下消息: 错误SparkUI:未能绑定SparkUI java.net.bindexception:地址已在使用:服务“SparkUI”在重试16次后失败! 所以我想知道是否有一种特定的方法来并行运行脚本?

  • 由于,我检查了一个spark作业的输出拼花文件,该作业总是会发出声音。我在Cloudera 5.13.1上使用了 我注意到拼花地板排的大小是不均匀的。第一排和最后一排的人很多。剩下的真的很小。。。 拼花地板工具的缩短输出,: 这是已知的臭虫吗?如何在Spark中设置拼花地板块大小(行组大小)? 编辑: Spark应用程序的作用是:它读取一个大的AVRO文件,然后通过两个分区键(使用

  • 我想注册一个UDAF类(用Scala或Python编写)并在SparkSQL中使用它。 例如: 模拟代码 然后我可以直接在spark sql中使用udaf,如下所示: Spark仅提供了Spark.udf。registerJavaFunction方法注册UDF类。 有人知道如何注册UDAF吗?

  • 我是Spark的新手。我尝试在本地模式(windows)下使用spark java将csv文件保存为parquet。我得到了这个错误。 原因:org.apache.spark.Spark异常:写入行时任务失败 我引用了其他线程并禁用了spark推测 set("spark.speculation "," false ") 我还是会出错。我在csv中只使用了两个专栏进行测试。 输入: 我的代码: 请帮

  • 我想了解以下关于火花概念的RDD的事情。 > RDD仅仅是从HDFS存储中复制某个节点RAM中的所需数据以加快执行的概念吗? 如果一个文件在集群中被拆分,那么对于单个flie来说,RDD从其他节点带来所有所需的数据? 如果第二点是正确的,那么它如何决定它必须执行哪个节点的JVM?数据局部性在这里是如何工作的?