解决sparn yarn-cluster第三方依赖包的加载

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wuxintdrh/article/details/83743420

1、最简单粗暴的方式, 打一个fatjar.

2、禁止应用程序将依赖的Jar包传到HDFS,将spark-assembly.jar放在该目录中。

是Spark自己将运行时候需要依赖的Java包上传到HDFS上,而且每次运行Spark Application的时候都会上传,这时候你会发现你的hdfs://mycluster/user/iteblog/.sparkStaging目录下面存在了大量的Jar文件,这最少存在两个不好的地方:
  1、每次上传Jar文件,多少也会影响到程序的运行速度;
  2、当在HDFS中上传了大量的Jar文件,这会产生大量的小文件,会对HDFS有影响。
  所以我们想是否可以在HDFS上面建立一个公共的lib库存放目录,每次运行Spark的时候,只要我们程序依赖的Jar包存在HDFS中的lib库中,那么这时候我们就不上传该Jar
在spark-defaults.conf中配置。

   spark.yarn.jar 
   spark.yarn.jars hdfs://chb0-179004/spark_libs/*.jar
   spark.yarn.archive

设置后,将不会在上传了

	Source and destination file systems are the same. 
	Not copying hdfs://chb0-179004:8020/hdp/apps/2.6.1.0-129/spark/spark-hdp-assembly.jar

但是,将应用依赖的第三方依赖包上传到该目录中, 无法加载第三方依赖

3、通过--jars指定第三方依赖,由于这个方式, 每个jar都需要列出,使用","分割, 如果jar太多手动去写,肯定麻烦, 我们可以通过shell脚本

jarlib="lib"
CLASS_PATH="smsRun.sh"
for i in `ls $jarlib/*.jar`; do
CLASS_PATH="$CLASS_PATH","$i";   //格式化jar包路径
done
//执行命令   --jars  $CLASS_PATH
spark-submit  --master yarn-cluster --num-executors 1 --driver-memory 2g --executor-memory 512M --class com.nokia.uba.analysis.spark.mcSms.SmsAnalysisJob --jars  $CLASS_PATH walrusAnlysis.jar 20181102 02

可以从日志中看出第三方jar的上传。任务执行成功
在这里插入图片描述

4、突然运行程序, 显示依赖缺少, 但是运行日志开始显示,明明已经上传到了集群, 跑一会就包file not find.
一开始以为是内存不足,但是调节了driver-memory, executor-memory,都无效。
在这里插入图片描述

最后在程序中,发现初始化conf的时候, 还设置sc.setMaster("local[4]");, 但是我是提交yarn-cluster模式, 将改行注释,问题解决。

5、程序退出, 但是UI上显示正常
参考: https://blog.csdn.net/u011291159/article/details/51161977

ApplicationMaster: Final app status: SUCCEEDED, exitCode: 0

猜你喜欢

转载自blog.csdn.net/wuxintdrh/article/details/83743420