为什么spark默认不添加性能配置?

Why doesn't spark add performance configurations by default?

我正在阅读一些 spark 优化技术,发现了一些我们需要启用的配置,例如

spark.conf.set("spark.sql.cbo.enabled", true)
spark.conf.set("spark.sql.adaptive.enabled",true)
spark.conf.set("spark.sql.adaptive.coalescePartitions.enabled",true)
spark.conf.set("spark.sql.adaptive.skewJoin.enabled",true)

我是否可以为我所有的 Spark 作业启用它,即使我不需要它?包括它有什么缺点?为什么 spark 默认不提供这种性能?我应该什么时候使用什么?

它不会启用这些功能,因为它们比不使用它们的风险要大一些。为了拥有最多的 stable 平台,默认情况下不启用它们。 Databricks 大声疾呼的一件事是 CBO 严重依赖 table 统计数据。因此,当您的 table 统计数据发生显着变化时,您需要定期更新这些。我遇到了一些边缘情况,在这种情况下,我必须删除 CBO 才能完成我的查询。 (我认为这与计算错误的地图侧连接有关。)

spark.sql.adaptive.skewJoin.enabled也是如此。这仅在 table 统计数据是最新的并且您有偏差时才有用。如果没有数据统计信息,它可能会使您的查询花费更长的时间。

spark.sql.adaptive.coalescePartitions.enabled 看起来也不错,但应该用于特定类型的性能调整。这里有旋钮和杠杆可以用来提高性能。

这些设置通常很有帮助,但实际上可能掩盖了您可能想知道的问题。是的,它们很有用,是的,你应该使用它们。或许你应该在需要它们之前将它们关闭。通常,您可以通过了解 Spark 作业及其正在执行的操作来调整 Spark 作业的算法,从而获得更好的性能。如果您默认打开所有这些,您可能 in-depth 不理解或您的选择的含义。

(Java/Python 不要强迫您管理内存。这种对您所使用内容的含义及其对性能的影响缺乏理解的情况通常是通过新的性能问题偷偷摸摸的艰难方式学到的开发人员。)这是一个类似的教训,但更险恶,因为现在他们切换到自动修复你的错误查询,你真的会在不了解他们的价值的情况下学会成为专家吗?

TLDR:除非你需要它们,否则不要打开它们,或者当你需要做一些快速而肮脏的事情时打开它们。

希望对您的理解有所帮助。