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,都无效。
sc.setMaster("local[4]");
, 但是我是提交yarn-cluster模式, 将改行注释,问题解决。
5、程序退出, 但是UI上显示正常 参考: https://blog.csdn.net/u011291159/article/details/51161977
ApplicationMaster: Final app status: SUCCEEDED, exitCode: 0