关于spark.sql.autoBroadcastJoinThreshold设置

今天使用spark对一组大数据进行合并作join操作,一直都报下面的错:

Exception in thread “broadcast-exchange-0” java.lang.OutOfMemoryError: Not enough memory to build and broadcast the table to all worker nodes

想来想去,之前也跑过这类的任务,并且都没有类似的情况,从问题来分析说是内存溢出了,也就是说明广播内存不够用。但我不断设整任务的内存资源,无论是executor还是driver的内存都分配多一倍了,但是还是不起作用。于是回来看看自己配置的优化参数:

spark.config=spark.reducer.maxSizeInFlight:64m,spark.shuffle.file.buffer:128k,spark.shuffle.io.maxRetries:10,spark.shuffle.io.numConnectionsPerPeer:10,spark.shuffle.io.retryWait:30s,spark.rdd.compress:true,spark.io.compression.codec:org.apache.spark.io.SnappyCompressionCodec,spark.io.compression.snappy.blockSize:18k,spark.serializer:org.apache.spark.serializer.KryoSerializer,spark.sql.shuffle.partitions:300,spark.default.parallelism:50,spark.rpc.numRetries:3,spark.rpc.retry.wait:4s,spark.locality.wait.process:10,spark.locality.wait.node:5,spark.locality.wait.rack:3,spark.speculation:true,spark.speculation.multiplier:20,spark.shuffle.consolidateFiles:true,spark.sql.autoBroadcastJoinThreshold:209715200

一个个分析,发现spark.sql.autoBroadcastJoinThreshold是刚增加上的参数,在另一个项目中作一些广播限制的操作,再去官网看下此配置的作用:

意思说这个配置的最大字节大小是用于当执行连接时,该表将广播到所有工作节点。通过将此值设置为-1,广播可以被禁用。

于是将此配置设整下,结果任务正常跑完。此处记录下,以示记忆。

 

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: spark.sql.autobroadcastjointhreshold是一个Spark SQL配置属性,用于控制自动广播连接的阈值。当一个表的大小小于或等于该阈值时,Spark SQL会自动将其广播到所有的执行器节点,以提高连接性能。默认值为10MB。 ### 回答2: spark.sql.autobroadcastjointhresholdSpark SQL中的一个配置参数,它用于控制触发自动广播连接操作的阈值。 在Spark SQL中,连接是非常常见的操作。如果连接的两个表中的至少一个表非常小,那么可以使用广播连接(broadcast join)来处理连接操作。广播连接是一种特殊类型的连接,其中一个小表广播到所有的执行器节点上,然后另一个大表进行连接操作。由于广播操作的数据规模相对较小,因此这种连接方式比较高效,可以节省大量的Shuffle操作的时间和资源。 现在问题来了,什么样的表才算是小表呢?这就需要用到spark.sql.autobroadcastjointhreshold这个参数了。这个参数默认值是10MB,表示如果表大小小于10MB,Spark会自动将其广播。 当Spark SQL执行一个连接时,Spark会估算出要在连接操作中传输的数据的大小。如果估计的大小小于配置参数spark.sql.autobroadcastjointhreshold,则Spark会将该表广播到所有执行器节点。否则,Spark将使用普通的连接方式来执行连接操作。 手动设置广播连接也是比较容易的。只需要使用broadcast函数将小表广播,然后执行连接操作即可。与自动广播连接相比,手动设置广播连接可以更精确地控制连接的方式,同时避免无意中广播一些较大的数据集。 总之,spark.sql.autobroadcastjointhresholdSpark SQL中一个重要的配置参数,它可以帮助我们实现更高效的连接操作。在实践中,我们应该结合实际情况进行调整,以尽可能地减少Shuffle操作,从而提高性能和扩展性。 ### 回答3: spark.sql.autobroadcastjointhreshold是一个Spark SQL参数,用于控制自动广播连接的阈值。当启用自动广播连接时,Spark会自动将小表广播到较大的表中,以避免在连接时产生过多的网络传输。自动广播连接在执行一些常见的连接查询时非常有用,可以大大提高查询效率。但是,如果阈值设置不当,会导致广播连接成为性能瓶颈。 参数值应该是一个数值,表示可以无需广播的表大小的阈值,以字节为单位。默认阈值为10MB,如果一个表的大小小于或等于10MB,则自动进行广播连接。如果一个表的大小大于10MB,则广播连接不会自动执行,而是使用一般的连接(shuffled)方式。 自动广播连接的优点是可以极大地提高Spark SQL的查询效率。由于表较小,将其直接广播到较大的表中是更高效的方式,可以避免大量的数据传输和网络延迟。此外,自动广播连接还可以减少内存的使用,因为广播的表只需要在每个节点中保存一个副本,而不是在每个节点中都复制一份。 然而,如果阈值设置不当,将会带来一些缺点。如果阈值设置得太小,会导致广播连接过于频繁,这可能会导致内存不足或网络拥塞,从而降低查询性能。如果阈值设置得太大,将会使一些本来可用广播连接优化的查询忽略掉,导致性能下降。 总的来说,spark.sql.autobroadcastjointhreshold可以帮助我们优化Spark SQL的查询性能,但是我们需要谨慎地设置阈值,以避免出现不必要的性能瓶颈。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值