我有一个使用Spark SQL构建的处理管道。目的是在第一步中从Hive读取数据并应用一系列功能操作(使用Spark SQL)以实现功能输出。现在,这些操作的数量很多(超过100个),这意味着我在单个管道中运行了大约50至60个Spark sql查询。虽然应用程序成功完成,没有任何问题,但我的工作重点已转移到优化整个过程。我已经能够使用spark.sql.shuffle.partitions加快执行速度,更改执行程序的内存,并将spark.memory.fraction的大小从默认的0.6减少到0.2。通过进行所有这些更改,我受益匪浅,整个执行时间从20-25分钟减少到10分钟左右。数据量约为10万行(源端)。
我从集群中得到的观察结果是: -作为应用程序ID的一部分触发的作业数为235。 -所有创建的工作的总阶段数约为600。 在两个节点的群集中使用-8执行程序(10个内核总共64 GB RAM)。 -Yarn的资源管理器UI(用于应用程序ID)变得非常慢,无法检索作业/阶段的详细信息。
在其中一个Spark调整视频中,我听说我们应该尝试将阶段数减少到最低限度,而且DAG的大小应该更小。有什么准则可以做到这一点。如何查找正在发生的改组的数量(我的SQL有很多联接和group by子句)。
我想对上述情况提出建议,说明可以做些什么以提高性能并处理JOIN / GROUP_BY繁重的SQL查询中的数据偏斜。
谢谢