性能调优

对于某些工作负载,可以提高性能通过在内存中缓存数据,或通过将一些实验性的选项。

在内存中缓存数据

火花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_HASHSHUFFLE_REPLICATE_NL,指导火花使用暗示策略在每个指定的关系当加入他们与另一个关系。例如,当广播提示是用于表t1,广播加入(广播散列连接或广播嵌套循环联接取决于是否有等值连接键)与t1的构建方面将由火花即使大小的优先表t1的数据高于建议的配置spark.sql.autoBroadcastJoinThreshold

当双方指定不同的连接策略提示的加入,引起重视广播提示了合并提示了SHUFFLE_HASH提示了SHUFFLE_REPLICATE_NL提示。当双方指定的广播提示或SHUFFLE_HASH提示,火花将构建基于连接类型和大小的关系。

注意,不能保证火花会选择加入策略中指定的提示从一个特定的策略可能不支持所有连接类型。

火花(" src ")。加入(火花(“记录”)。提示(“广播”),“关键”)。显示()
火花(" src ")。加入(火花(“记录”)。提示(“广播”),“关键”)。显示();
火花(" src ")。加入(火花(“记录”)。提示(“广播”),“关键”)。显示()
src< -sql(“从src SELECT *”)记录< -sql(“SELECT * FROM记录”)(加入(src,提示(记录,“广播”),src美元关键= =记录美元关键))
我们接受广播,BROADCASTJOIN和MAPJOIN广播提示选择* / / * +广播(r)*记录r加入src年代r关键=年代关键

更多细节请参考的文档加入提示

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.enabledspark.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.enabledspark.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.enabledspark.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
Baidu
map