第146课:Spark面试经典系列之Yarn Cluster生产环境下JVM的OOM和Stack Overflow问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tom_8899_li/article/details/71214227

Spark面试经典系列之Yarn Cluster生产环境下JVM的OOM和Stack Overflow问题

1、Spark on Yarn下JVM的OOM问题及解决方式
2、Spark中Driver的Stack Overflow的问题及解决方式

图146-1 Yarn Cluster生产环境下JVM的OOM和Stack Overflow问题

Spark on Yarn cluster mode: 此时有可能会报OOM的错误,具体来说:
由于Client模式下一定没有出现OOM,而在Cluster模式下一定出现了OOM,所以必然说明OOM是Driver导致的!
Driver在Client和Cluster模式下占用的内存都是一致的,例如都是100M,现在的问题是为什么在Client下的100M不会OOM,但是在Cluster模式下的100M会出现OOM?

更进一步:这个OOM是永久代产生的OOM

真相是:无论在Client模式还是在Cluster模式下,我们的Driver都是运行在JVM中的,而JVM一定有具体的例如永久代的配置参数等信息。在Client模式下,加载本地的配置信息的时候,Driver所在的JVM的永久代的默认大小是128MB,而在Cluster下默认的永久代的大小是82MB,当你的代码业务逻辑很多的时候,就要构造很多永久代的对象,此时的永久代消耗的大小例如说是100MB,所以在Client模式下可以成功运行,但是在Cluster模式下因为100M大于82M,所以就产生永久代的OOM问题,导致程序启动失败!

解决方式:
在spark-submit的时候设定conf部分的 spark.driver.extraJavaOptions: -XX:PermSize=256M -MaxPermSize-256M,现实生产环境下大多数都是使用Java7,Java8设置元数据空间。

Spark运行时候的StackOverflow问题:

之所以产生Stack Overflow,原因是在Stack方法栈中方法的调用链条太长所导致的,经典的过长链条有两种:
第一种:过于深度的递归
第二种:过于复杂的业务调用链条(很少见!)

在Spark中什么时候会出现Stack Overflow呢?

例如SQL语句中的条件组合太多,而SQL在Spark SQL中会通过Catalyst首先变成一棵树,并最终变成RDD的编程实现。在这个过程中,有可能把我们的SQL语句解析成为不断地递归调用,此时就有可能出现Stack Overflow的情况。什么样的SQL语句?例如:SELECT … FROM … WHERE ..OR…OR…OR…OR…

怎么办?
对于SQL的情况就要进行拆分!例如把一个很长的SQL语句变成很多小的SQL语句,构成很多子查询。

展开阅读全文

没有更多推荐了,返回首页