性能调优
对于某些工作负载,可以提高性能通过在内存中缓存数据,或通过将一些实验性的选项。
在内存中缓存数据
火花SQL可以使用一个内存中的缓存表柱状通过调用格式spark.catalog.cacheTable(“表”)
或dataFrame.cache ()
。然后火花SQL将扫描只需要列将自动调整压缩以减少内存使用量和GC的压力。你可以叫spark.catalog.uncacheTable(“表”)
或dataFrame.unpersist ()
从内存中删除表。
内存缓存的配置可以使用完成setConf
方法SparkSession
或通过运行设置键=值
使用SQL命令。
属性名 | 默认的 | 意义 | 从版本 |
---|---|---|---|
spark.sql.inMemoryColumnarStorage.compressed |
真正的 | 当设置为true时,火花SQL将自动为每一列选择一个压缩编解码器基于统计的数据。 | 1.0.1 |
spark.sql.inMemoryColumnarStorage.batchSize |
10000年 | 控制批次柱状缓存的大小。大的批量大小可以提高内存利用率和压缩,但风险OOMs当缓存数据。 | 1.1.1 |
其他配置选项
以下选项还可以用于调优查询执行的性能。可能这些选项将在以后的版本中被弃用更优化的自动执行。
属性名 | 默认的 | 意义 | 从版本 |
---|---|---|---|
spark.sql.files.maxPartitionBytes |
134217728 (128 MB) | 的最大字节数当阅读文件打包成一个分区。这个配置是有效的只有当使用基于文件的资源如拼花、JSON和兽人。 | 2.0.0 |
spark.sql.files.openCostInBytes |
4194304 (4 MB) | 打开一个文件估计成本,衡量的字节数,可以扫描在同一时间。这是当把多个文件到一个分区使用。最好是高估,然后小文件将快于分区的分区大文件(计划)。这个配置是有效的只有当使用基于文件的资源如拼花、JSON和兽人。 | 2.0.0 |
spark.sql.files.minPartitionNum |
默认的并行性 | 建议(不能保证)最小数量的分割文件的分区。如果没有设置,默认值是“spark.default.parallelism”。这个配置是有效的只有当使用基于文件的资源如拼花、JSON和兽人。 | 3.1.0 |
spark.sql.broadcastTimeout |
300年 | 超时秒等待时间播出的广播连接 |
1.3.0 |
spark.sql.autoBroadcastJoinThreshold |
10485760 (10 MB) | 配置字节的最大尺寸表,将广播给所有工人当执行一个连接节点。通过将这个值设置为1,广播可以被禁用。注意,目前统计数据只支持蜂巢Metastore表的命令分析表<表> noscan计算统计数据 一直运行。 |
1.1.0 |
spark.sql.shuffle.partitions |
200年 | 配置分区的数量时使用移动数据连接或聚合。 | 1.1.0 |
spark.sql.sources.parallelPartitionDiscovery.threshold |
32 | 配置清单工作输入阈值,使并行路径。如果输入路径的数量大于这个阈值,火花将列出的文件用火花分布式工作。否则,它将回退顺序清单。此配置仅是有效使用基于文件的数据来源如镶花时,兽人和JSON。 | 1.5.0 |
spark.sql.sources.parallelPartitionDiscovery.parallelism |
10000年 | 输入路径配置的最大清单并行工作。如果输入路径的数量大于这个值,它将节流后使用这个值。此配置仅是有效使用基于文件的数据来源如镶花时,兽人和JSON。 | 2.1.1 |
SQL查询的连接策略提示
加入策略提示,即广播
,合并
,SHUFFLE_HASH
和SHUFFLE_REPLICATE_NL
,指导火花使用暗示策略在每个指定的关系当加入他们与另一个关系。例如,当广播
提示是用于表t1,广播加入(广播散列连接或广播嵌套循环联接取决于是否有等值连接键)与t1的构建方面将由火花即使大小的优先表t1的数据高于建议的配置spark.sql.autoBroadcastJoinThreshold
。
当双方指定不同的连接策略提示的加入,引起重视广播
提示了合并
提示了SHUFFLE_HASH
提示了SHUFFLE_REPLICATE_NL
提示。当双方指定的广播
提示或SHUFFLE_HASH
提示,火花将构建基于连接类型和大小的关系。
注意,不能保证火花会选择加入策略中指定的提示从一个特定的策略可能不支持所有连接类型。
更多细节请参考的文档加入提示。
SQL查询的合并提示
合并提示允许火花SQL用户控制输出文件的数量一样合并
,重新分区
和repartitionByRange
在数据集的API,他们可以用于性能调优和减少输出文件的数量。“合并”提示只有一个分区号作为参数。“再分配”提示分区号,列,或两个/两人作为参数。“REPARTITION_BY_RANGE”提示必须列名和分区号是可选的。“平衡”提示有一个初始分区编号,列,或两个/两人作为参数。
选择* / / * +合并(3)*从t;选择/ * +重新分区(3)* /*从t;选择* / / * +重新分区(c)*从t;选择/ * +重新分区(3 c) * /*从t;选择/ * +重新分区* /*从t;选择* / / * + REPARTITION_BY_RANGE (c)*从t;选择/ * + REPARTITION_BY_RANGE (3 c) * /*从t;选择/ * +平衡* /*从t;选择/ * +平衡(3)* /*从t;选择* / / * +平衡(c)*从t;选择/ * +平衡(3 c) * /*从t;
更多细节请参考的文档分区提示。
自适应查询执行
自适应查询执行(AQE)是一种优化技术在火花SQL利用运行时统计数据,选择最有效的查询执行计划,这是默认启用以来Apache 3.2.0火花。SQL可以打开和关闭AQE火花spark.sql.adaptive.enabled
作为一个伞配置。3.0的火花,AQE有三个主要功能:包括合并post-shuffle分区,将分类合并连接播放连接,和倾斜连接优化。
合并后调整分区
这个特性聚集post洗牌分区基于地图的输出数据时spark.sql.adaptive.enabled
和spark.sql.adaptive.coalescePartitions.enabled
配置是正确的。这个特性简化了洗牌的调优运行查询时分区号。你不需要设置一个合适的洗牌分区号适合你的数据集。火花在运行时可以选择适当的洗牌分区号一旦你设置一个足够大的初始数量的洗牌分区通过spark.sql.adaptive.coalescePartitions.initialPartitionNum
配置。
属性名 | 默认的 | 意义 | 从版本 |
---|---|---|---|
spark.sql.adaptive.coalescePartitions.enabled |
真正的 | 当真正的和spark.sql.adaptive.enabled 是真的,火花将会连续调整分区大小根据目标(指定的吗spark.sql.adaptive.advisoryPartitionSizeInBytes ),以避免太多的小任务。 |
3.0.0 |
spark.sql.adaptive.coalescePartitions.parallelismFirst |
真正的 | 时真的,火花忽略了目标指定的大小spark.sql.adaptive.advisoryPartitionSizeInBytes (默认64 mb)当合并相邻洗牌分区,只有尊重所指定的最小的分区大小spark.sql.adaptive.coalescePartitions.minPartitionSize (默认1 mb),最大化并行。这是为了避免性能使自适应查询执行时回归。建议将这个配置设置为错误和尊重目标指定的大小spark.sql.adaptive.advisoryPartitionSizeInBytes 。 |
3.2.0 |
spark.sql.adaptive.coalescePartitions.minPartitionSize |
1 mb | 合并后调整分区的最小大小。它的值可以最多20%的spark.sql.adaptive.advisoryPartitionSizeInBytes 。这是非常有用的,当目标大小分区合并期间被忽略,这是默认情况下。 |
3.2.0 |
spark.sql.adaptive.coalescePartitions.initialPartitionNum |
(没有) | 合并前洗牌分区的初始数量。如果没有设置,它等于spark.sql.shuffle.partitions 。这个配置只有当产生影响spark.sql.adaptive.enabled 和spark.sql.adaptive.coalescePartitions.enabled 都是启用的。 |
3.0.0 |
spark.sql.adaptive.advisoryPartitionSizeInBytes |
64 MB | 咨询大小字节的洗牌分区在自适应优化(当spark.sql.adaptive.enabled 是真的)。它生效当火花聚集小洗牌分区或分裂倾斜洗牌分区。 |
3.0.0 |
拆分倾斜调整分区
属性名 | 默认的 | 意义 | 从版本 |
---|---|---|---|
spark.sql.adaptive.optimizeSkewsInRebalancePartitions.enabled |
真正的 | 当真正的和spark.sql.adaptive.enabled 是真的,火花优化倾斜在RebalancePartitions洗牌分区,分裂他们较小的根据目标大小(指定的吗spark.sql.adaptive.advisoryPartitionSizeInBytes ),以避免数据倾斜。 |
3.2.0 |
spark.sql.adaptive.rebalancePartitionsSmallPartitionFactor |
0.2 | 一个分区将被合并在分裂期间,如果比这个因素将其规模很小spark.sql.adaptive.advisoryPartitionSizeInBytes 。 |
3.3.0 |
转换分类合并连接进行连接
AQE转换分类合并连接播放哈希连接时的运行时统计数据加入边是小于阈值自适应广播散列连接。这不是一样有效规划一个广播散列连接首先,但这总比继续做分类合并加入,我们可以节省连接双方的排序,并在本地读取洗牌文件节省网络流量(如果spark.sql.adaptive.localShuffleReader.enabled
是真的)
属性名 | 默认的 | 意义 | 从版本 |
---|---|---|---|
spark.sql.adaptive.autoBroadcastJoinThreshold |
(没有) | 配置字节的最大尺寸表,将广播给所有工人当执行一个连接节点。通过将这个值设置为1,广播可以被禁用。默认值是一样的spark.sql.autoBroadcastJoinThreshold 。注意,只有在使用这个配置自适应框架。 |
3.2.0 |
spark.sql.adaptive.localShuffleReader.enabled |
真正的 | 当真正的和spark.sql.adaptive.enabled 是真的,火花试图使用本地洗牌读者阅读当洗牌洗牌数据分区不需要,例如,在转换分类合并加入broadcast-hash加入。 |
3.0.0 |
转换分类合并连接散列连接
AQE转换分类合并加入打乱散列连接当所有帖子洗牌分区是小于一个阈值,最大阈值可以看到配置spark.sql.adaptive.maxShuffledHashJoinLocalMapThreshold
。
属性名 | 默认的 | 意义 | 从版本 |
---|---|---|---|
spark.sql.adaptive.maxShuffledHashJoinLocalMapThreshold |
0 | 每个分区配置字节的最大大小,可以允许建立本地散列映射。如果这个值不小于spark.sql.adaptive.advisoryPartitionSizeInBytes 和所有的分区大小不大于这个配置,加入选择更喜欢使用洗好的散列连接而不是分类合并连接的价值无关spark.sql.join.preferSortMergeJoin 。 |
3.2.0 |
优化斜加入
数据倾斜会严重降低连接查询的性能。在分类合并加入这个功能动态处理斜分裂和复制(如果需要)倾斜任务为大致均匀大小的任务。时生效spark.sql.adaptive.enabled
和spark.sql.adaptive.skewJoin.enabled
配置启用。
属性名 | 默认的 | 意义 | 从版本 |
---|---|---|---|
spark.sql.adaptive.skewJoin.enabled |
真正的 | 当真正的和spark.sql.adaptive.enabled 是真的,火花在分类合并加入动态处理斜分裂和复制(如果需要)倾斜分区。 |
3.0.0 |
spark.sql.adaptive.skewJoin.skewedPartitionFactor |
5.0 | 一个分区是倾斜的如果它的大小大于这个因素中位数相乘分区大小也比spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes 。 |
3.0.0 |
spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes |
256 mb | 一个分区是倾斜如果在字节大小大于这个阈值也大于spark.sql.adaptive.skewJoin.skewedPartitionFactor 中位数相乘分区大小。理想情况下,这个配置应该比spark.sql.adaptive.advisoryPartitionSizeInBytes 。 |
3.0.0 |
spark.sql.adaptive.forceOptimizeSkewedJoin |
假 | 时真的,力使OptimizeSkewedJoin,这是一个自适应规则优化倾斜连接以避免流浪者的任务,即使它引入了额外的洗牌。 | 3.3.0 |
Misc
属性名 | 默认的 | 意义 | 从版本 |
---|---|---|---|
spark.sql.adaptive.optimizer.excludedRules |
(没有) | 配置一系列规则自适应优化器被禁用,指定的规则是规则的名称和由逗号隔开。优化器将日志确实被排除的规则。 | 3.1.0 |
spark.sql.adaptive.customCostEvaluatorClass |
(没有) | 自定义成本评估者类用于自适应执行。如果不是,将使用自己的火花SimpleCostEvaluator 默认情况下。 |
3.2.0 |