pyspark系列10-Spark SQL性能调优常用参数介绍

一.在内存中缓存数据

Spark SQL可以通过调用Spark.catalog.cachetable ("tableName")或DataFrame.cache()来使用内存中的columnar格式缓存表。然后Spark SQL将只扫描所需的列,并自动调优压缩以最小化内存使用和GC压力。你可以调用spark.catalog.uncacheTable("tableName")从内存中删除表。

内存缓存的配置可以在SparkSession上使用setConf方法或者使用SQL运行SET key=value命令来完成。

参数名 默认值 参数说明 启始版本
spark.sql.inMemoryColumnarStorage.compressed true 当设置为true时,Spark SQL会根据数据统计自动为每列选择压缩编解码器。 1.0.1
spark.sql.inMemoryColumnarStorage.batchSize 10000 控制柱状缓存的批大小。更大的批处理大小可以提高内存利用率和压缩,但在缓存数据时可能会带来OOMs风险。 1.1.1

二.其它配置项

还可以使用以下选项调优查询执行的性能。随着更多的优化被自动执行,这些选项可能会在未来的版本中被弃用。

参数名 默认值 参数说明 启始版本
spark.sql.files.maxPartitionBytes 134217728 (128 MB) 读取文件时装入单个分区的最大字节数。此配置仅在使用基于文件的源(如Parquet、JSON和ORC)时有效。 2.0.0
spark.sql.files.openCostInBytes 4194304 (4 MB) 打开一个文件的估计成本,由可以在同一时间扫描的字节数来衡量。当将多个文件放入一个分区时使用。最好是高估,那么带有小文件的分区将比带有大文件的分区更快(这是首先安排的)。此配置仅在使用基于文件的源(如Parquet、JSON和ORC)时有效。 2.0.0
spark.sql.files.minPartitionNum Default Parallelism 建议的(不是保证的)最小分割文件分区数。如果没有设置,默认值是' spark.default.parallelism '。此配置仅在使用基于文件的源(如Parquet、JSON和ORC)时有效。 3.1.0
spark.sql.broadcastTimeout 300 broadcast join 等待时间的超时(秒) 1.3.0
spark.sql.autoBroadcastJoinThreshold 10485760 (10 MB) 配置在执行联接时将广播到所有工作节点的表的最大字节大小。通过将此值设置为-1,可以禁用广播。注意:目前统计只支持运行ANALYZE TABLE COMPUTE statistics noscan命令的Hive Metastore表。 1.1.0
spark.sql.shuffle.partitions 200 配置将数据变换为连接或聚合时要使用的分区数量。 1.1.0
spark.sql.sources.parallelPartitionDiscovery.threshold 32 配置阈值以启用作业输入路径的并行列出。如果输入路径数大于该阈值,Spark将通过Spark分布式作业列出文件。否则,它将退回到顺序列表。此配置仅在使用基于文件的数据源(如Parquet、ORC和JSON)时有效。 1.5.0
spark.sql.sources.parallelPartitionDiscovery.parallelism 10000 配置作业输入路径的最大列出并行度。如果输入路径的数量大于这个值,它将被降低到使用这个值。与上面一样,此配置仅在使用基于文件的数据源(如Parquet、ORC和JSON)时有效。 2.1.1

三.SQL查询连接的hint

join策略提示BROADCAST、MERGE、SHUFFLE_HASH和SHUFFLE_REPLICATE_NL,在将指定的关系加入到另一个关系时,指示Spark对每个指定的关系使用暗示策略。例如,在表' t1 '上使用BROADCAST提示时,广播加入(广播散列连接或广播嵌套循环联接取决于是否有等值连接键)与t1的构建方面将由火花即使大小的优先表t1的建议的统计配置spark.sql.autoBroadcastJoinThreshold之上。

当连接两端指定了不同的连接策略提示时,Spark会优先考虑BROADCAST提示而不是MERGE提示,优先考虑SHUFFLE_HASH提示而不是SHUFFLE_REPLICATE_NL提示。当双方都指定了BROADCAST提示或SHUFFLE_HASH提示时,Spark将根据连接类型和关系的大小选择构建端。

请注意,不能保证Spark会选择提示中指定的连接策略,因为特定的策略可能不支持所有的连接类型。

-- We accept BROADCAST, BROADCASTJOIN and MAPJOIN for broadcast hint
SELECT /*+ BROADCAST(r) */ * FROM records r JOIN src s ON r.key = s.key

Coalesce hint允许Spark SQL用户控制输出文件的数量,就像Dataset API中的Coalesce、repartition和repartitionByRange一样,它们可以用于性能调优和减少输出文件的数量。COALESCE hint只有一个分区号作为参数。“REPARTITION”提示有一个分区号、列或它们都作为参数。“REPARTITION_BY_RANGE”提示必须有列名,分区号是可选的。

SELECT /*+ COALESCE(3) */ * FROM t
SELECT /*+ REPARTITION(3) */ * FROM t
SELECT /*+ REPARTITION(c) */ * FROM t
SELECT /*+ REPARTITION(3, c) */ * FROM t
SELECT /*+ REPARTITION_BY_RANGE(c) */ * FROM t
SELECT /*+ REPARTITION_BY_RANGE(3, c) */ * FROM t

四.自适应查询执行

Adaptive Query Execution (AQE)是Spark SQL中的一种优化技术,它利用运行时统计信息来选择最高效的查询执行计划。默认情况下AQE是禁用的。Spark SQL可以使用Spark.SQL.adaptive.enabled的伞配置来控制是否打开/关闭。从Spark 3.0开始,AQE中有三个主要特性,包括合并shuffle后分区、将排序合并连接转换为广播连接以及倾斜连接优化。

五.合并分区后重新组合

当spark.sql.adaptive.enabled和spark.sql.adaptive.coalescePartitions.enabled配置都为true时,该特性根据map输出统计信息来合并post shuffle分区。这个特性简化了运行查询时shuffle分区号的调优。您不需要设置合适的shuffle分区号来适合您的数据集。一旦您通过Spark .sql. adaptive.coalescepartitions . initialpartitionnum配置设置了足够大的初始shuffle分区数,Spark就可以在运行时选择适当的shuffle分区号。

参数名 默认值 参数说明 启始版本
spark.sql.adaptive.coalescePartitions.enabled true 当true和Spark .sql. adaptive_enabled为true时,Spark会根据目标大小(由Spark .sql. adaptive_advisorypartitionsizeinbytes指定)合并连续的shuffle分区,以避免过多的小任务。 3.0.0
spark.sql.adaptive.coalescePartitions.minPartitionNum Default Parallelism 合并后的最小洗牌分区数。如果不设置,则默认为Spark集群的默认并行度。此配置仅在spark.sql. adaptive.net enabled和spark.sql. adaptive.net coalescepartitions .enabled同时启用时有效。 3.0.0
spark.sql.adaptive.coalescePartitions.initialPartitionNum 200 合并前的初始shuffle分区数。默认情况下它等于spark.sql.shuffle.partitions。此配置仅在spark.sql. adaptive.net enabled和spark.sql. adaptive.net coalescepartitions .enabled同时启用时有效。 3.0.0
spark.sql.adaptive.advisoryPartitionSizeInBytes 64 MB 自适应优化期间shuffle分区的建议大小(当spark.sql. adaptive_enabled为true时)。当Spark对小shuffle分区或斜shuffle分区进行合并时生效。 3.0.0

六.将排序合并联接转换为广播联接

当任何连接侧的运行时统计数据小于广播散列连接阈值时,AQE将排序合并连接转换为广播散列连接。这不是一样有效规划一个广播散列连接首先,但这总比继续做分类合并加入,我们可以节省连接双方的排序,并在本地读取洗牌文件节省网络流量(如果spark.sql.adaptive.localShuffleReader.enabled被设置为true)

七.优化倾斜连接

数据倾斜会严重降低连接查询的性能。该特性通过将倾斜任务拆分(如果需要的话还可以复制)为大小大致相同的任务,动态处理排序-合并连接中的倾斜任务。当spark.sql.adaptive.enabled和spark.sql.adaptive.skewJoin.enabled配置同时启用时生效。

参数名 默认值 参数说明 启始版本
spark.sql.adaptive.skewJoin.enabled true 当true和Spark .sql.adaptive.enabled为true时,Spark通过拆分(并在需要时复制)倾斜分区来动态处理排序-合并连接中的倾斜。 3.0.0
spark.sql.adaptive.skewJoin.skewedPartitionFactor 10 如果一个分区的大小大于这个因子乘以中值分区大小,并且大于spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes,则认为该分区是倾斜的。 3.0.0
spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes 256MB 如果分区的字节大小大于这个阈值,并且大于spark.sql.adaptive.skewJoin.skewedPartitionFactor乘以分区中值大小,则认为该分区是倾斜的。理想情况下,该配置应该设置为大于spark.sql.adaptive.advisoryPartitionSizeInBytes。 3.0.0

参考:

1.http://spark.apache.org/docs/latest/sql-performance-tuning.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容