如何通过配置广播变量broadcast variable去优化Spark application
今天,想和大家分享一个我在公司工作中遇到的有趣的Spark-sql问题:由广播变量引起的大量ETL jobs异常。上周,突然好几个同事反应有大批量的etl jobs由于广播连接timeout和Spark executor JVM OOM的异常从而导致spark application执行失败,导致一部分下游数据报表的delay。
# WARN MemoryStore: Not enough space to cache broadcast_6 in memory! (computed 4.9 GiB so far)
23/02/23 09:20:55 WARN BlockManager: Persisting block broadcast_6 to disk instead.
# java.lang.OutOfMemoryError: Java heap space
在本文中,我将深入探讨这些问题的原因,并提供一些优化建议,可以更好地利用集群资源。
直接原因:EMR集群规模缩小
由于公司内部架构调整,我们的ETL job需要从AWS的spark-sql on EMR迁移到Spark-sql on EKS。随着迁移工作的进行,EMR集群的规模从稳定的40个节点减少到了大约22个节点。此外,我们团队最近