关于spark.sql.autoBroadcastJoinThreshold设置

本文详细解析了在使用Spark处理大数据进行join操作时遇到的内存溢出错误,并分享了通过调整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,广播可以被禁用。

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

 

以下是对这些参数的分析: #### `spark.sql.hive.convertMetastoreParquet=false` 这个参数用于控制 Spark 是否将 Hive Metastore 中的 Parquet 表自动转换为 Spark 内部的 Parquet 表。当设置为 `false` 时,Spark 不会进行自动转换,而是直接使用 Hive 的 Parquet 表。在某些情况下,例如需要与 Hive 保持一致的 Parquet 表处理逻辑时,这个参数是可以使用的。 #### `spark.sql.autoBroadcastJoinThreshold=-1` `spark.sql.autoBroadcastJoinThreshold` 参数用于控制自动广播小表的阈值,单位是字节。当设置为 `-1` 时,会禁用自动广播连接功能。在某些场景下,如小表数据量较大,广播会消耗过多内存,或者希望手动控制广播操作时,这个参数可以使用。 #### `hive.resultset.use.unique.column.names=false` 这个参数是 Hive 的配置参数,用于控制查询结果集中列名是否使用唯一名称。当设置为 `false` 时,查询结果集中的列名不会强制使用唯一名称。在需要与旧版本 Hive 兼容,或者对列名唯一性没有严格要求的场景下,这个参数可以使用。 #### `spark.sql.autoBroadcastJoinThreshold=10485760` 当设置为 `10485760`(即 10MB)时,Spark 会自动广播大小小于 10MB 的表,以优化连接操作。在小表数据量通常小于 10MB,并且希望通过广播小表来提高连接性能的场景下,这个参数可以使用。不过需要注意的是,前面已经设置了 `spark.sql.autoBroadcastJoinThreshold=-1` 禁用了自动广播,这两个设置会相互冲突,需要根据实际情况选择其中一个。 #### `spark.sql.broadcastTimeout=1800` `spark.sql.broadcastTimeout` 参数用于设置广播操作的超时时间,单位是秒。当设置为 `1800` 时,广播操作的超时时间为 30 分钟。在网络环境不稳定,或者广播操作可能需要较长时间完成的场景下,这个参数可以使用。 ### 代码示例 在 Spark设置这些参数的示例代码如下: ```python from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("ParameterSettingExample") \ .config("spark.sql.hive.convertMetastoreParquet", "false") \ .config("spark.sql.autoBroadcastJoinThreshold", "-1") \ .config("hive.resultset.use.unique.column.names", "false") \ .config("spark.sql.broadcastTimeout", "1800") \ .getOrCreate() # 如果要使用 spark.sql.autoBroadcastJoinThreshold=10485760,需要注释掉上面的 -1 设置 # spark.conf.set("spark.sql.autoBroadcastJoinThreshold", "10485760") ```
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值