我有一个Spark SQL,用于执行<10分钟,现在在群集迁移后3小时运行,需要深入了解它实际执行的操作。我是新手,请不要介意我问一些无关的东西。
增加spark.executor.memory
但没有运气。
环境:Azure存储上的Azure HDInsight Spark 2.4
SQL:读取并加入一些数据,最后将结果写入Hive Metastore。
spark.sql
脚本以下面的代码结尾:.write.mode("overwrite").saveAsTable("default.mikemiketable")
应用行为:在前15分钟内,它加载并完成大多数任务(199/200);只剩下1个执行程序进程,并且不断地重新读取/写入数据。因为现在它只留下1个执行者,我们需要等待3个小时才能完成此应用程序。
因此我将spark.executor.memory增加到20g,但没有任何改变。从Ambari和YARN我可以看出群集还剩下很多资源。
非常感谢任何指导。
我想从你的案例的一些观察开始:
作为解决方案,我会尝试接下来的几件事:
repartition()
或使用spark.sql.shuffle.partitions
的Spark设置增加分区数,使其符合上述要求,即1000或更多。partitionBy
引入分区数据,即日/月/年