spark应用提交报错解决

老样子,菜鸡一只!如果有什么说错的,还请大家见谅~!!也希望大家帮我指出改正。


本次测试的spark版本是2.2.X的,从打包开始,打包有两种方式,一种是maven打包,一种是idea打包(据说这种打包方式叫SBT?maybe把),然后打出来的包也有两种,一种叫胖包,一种叫瘦包。我先打了胖包(胖包就是把项目中所有依赖的jar包都打进去,如果依赖多的话,能达到好几百M,瘦包就是单纯打包你的代码),然后就开始我的测试之路了!

1、Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
at sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:284)
at sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:238)
at java.util.jar.JarVerifier.processEntry(JarVerifier.java:316)
at java.util.jar.JarVerifier.update(JarVerifier.java:228)

at java.util.jar.JarFile.initializeVerifier(JarFile.java:383)

这种错误,是我在老版本(spark-1.6.X)遇到的,这报错看不懂吧,百度下就好了,很简单。

解决方式:

在linux中执行命令,其实就是删除META-INF下面的一些七七八八的东西,具体为什么,我也不知道

zip -d <你的jar包名称.jar> META-INF/*.RSA META-INF/*.DSA META-INF/*.SF


2、classnotfound!类似下面这种:


扫描二维码关注公众号,回复: 4099871 查看本文章


解决方式:


1、有百分之80是你spark-submit脚本中的--class指定位置有误,这种时候可以用反编译工具或者解压缩工具把你的jar包打开看看,你的类到底在哪个文件夹里面,比如说我的类名是Test,一般来说是在com.XXX.XXX.Test

2、测试的时候用的spark2.2的版本,我发现我的路径没错,但还是报了classnotfound,因此我猜测是胖包的问题,所以我打了一个瘦包,一模一样的脚本,但是执行成功了,所以我将胖包执行了如上的zip -d XXXX命令,然后解决了这个问题。


3、[Stage 26:=>                                                    (24 + 8) / 1099]

接着我开始运行程序,但是无论我怎么增加并行度和增加核心数,发现每个stage的并行度永远只有8???

具体如何增加并行度,其实就是增加分区或者设置conf.set("spark.default.parallelism", "500")类似这种方式,但是所有的方式都不生效,后来知道原因的我眼泪掉下来!

1、原因:我发现代码中的master(local[*])并没有注释掉!因此数据是在本地跑的,为了进一步验证我的想法,我执行了如下命令:

查看物理cpu个数
grep 'physical id' /proc/cpuinfo | sort -u
2
查看核心数量
grep 'core id' /proc/cpuinfo | sort -u | wc -l
4
查看线程数

grep 'processor' /proc/cpuinfo | sort -u | wc -l

8

果然我的并行度最大只能是8。。。。。

2、解决方式:

把代码中的local注释掉,在脚本中写--master yarn  --deploy-mode cluster或者client,我是在测试,所以使用client

4、java.lang.OutOfMemoryError: Java heap space


1、原因:

就是运行的时候JVM内存不够,个人感觉是比如在代码中创建对象啊,或者你把数据collect转换成数组等类型的操作,又或者数据量大,全部返回到driver端导致的

2、解决方法:

--driver-memory 3G 

通过这种方式加到driver端的内存


--conf spark.executor.extraJavaOptions="-XX:MaxPermSize=64m -XX:MaxDirectMemorySize=1536m -Xmn100m" 

通过这种方式设置JVM的参数,比如让永久代的内存变为64M(因为这块内存要用来加载一些底层的类和对象,而且往往是程序关闭前一直要使用的)


5、Exception in thread "main" org.apache.spark.SparkException: Job aborted due to stage failure: Task 30 in stage 31.0 failed 4 times, most recent failure: Lost task 30.3 in stage 31.0 (TID 1998, irs-cdh-40.irs-qb.com, executor 154): ExecutorLostFailure (executor 154 exited caused by one of the running tasks) Reason: Container killed by YARN for exceeding memory limits. 5.5 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.

1、原因:

这个报错,看起来就是单个container申请的资源暴增,超过了yarn限制的最大值5.5GB,导致yarn手动把这个container干掉了。

2、解决方法:

在报错的最后一句,告诉了我这个考虑下这个参数,这个是设置yarn的堆外内存Consider boosting spark.yarn.executor.memoryOverhead.加大这个值,可以避免这个异常,但是占用的资源就比较多

与之对应的参数是-XX:MaxDirectMemorySize(可以调小这个值,让堆内进行GC,不过也不能太小,否则会报Direct buffer memory异常)

3、建议:

遇到这个报错,还是把GC的信息打印出来看看,看看内存的占用是什么情况,选择增大第一个值还是减小第二个值

具体设置可以参考(无名氏0428)大神的文章:https://blog.csdn.net/ainidong2005/article/details/53152605

6、最后就是资源的调整

一开始设置的每个exe核心数和内存较多,发现资源申请不下来,导致程序比单机还慢,因此转换策略,将每个executor的资源调小,然后申请更多的executor来处理数据,果然申请到资源了,而且效果显著,最后脚本如下

/XXX/XXXX/XXX/bin/spark2-submit \
--master yarn \
--deploy-mode client \
--executor-memory 2G \
--driver-memory 3G \
--num-executors 20 \
--executor-cores 1 \
--conf spark.yarn.executor.memoryOverHead=2048 \
--conf spark.executor.extraJavaOptions="-XX:MaxPermSize=64m -XX:MaxDirectMemorySize=1536m -Xmn100m" \
--class com.XXX.XXX.XXX \
/home/XXX/XXX.jar


额,其实对于JVM中的各块内存的设置,本人还不是特别的清晰,不知是否有大神写出相关的软文,可以推荐下,让我学习学习,本文纯属个人心路历程,如果有什么说的不对的地方,还请大家指出改正!

猜你喜欢

转载自blog.csdn.net/lsr40/article/details/80018798