Spark任务提交jar包依赖解决方案(开发阶段多次上传jar包比较慢,怎么办?)

        通常我们将spark任务编写后打包成jar包,使用spark-submit进行提交,因为spark是分布式任务,如果运行机器上没有对应的依赖jar文件就会报ClassNotFound的错误。但是在开发阶段需要多次尝试上传到集群进行测试,如果采用jar-with-dependencies的形式,每次jar包都很大,上传会需要等好久,怎么办?

参照博主的Spark任务提交jar包依赖解决方案有三种:

方法一:spark-submit –jars

根据spark官网,在提交任务的时候指定–jars,用逗号分开。这样做的缺点是每次都要指定jar包,如果jar包少的话可以这么做,但是如果多的话会很麻烦。

spark-submit --master yarn-client --jars ***.jar,***.jar(你的jar包,用逗号分隔) mysparksubmit.jar

如果你使用了sbt的话,并且在build.sbt中配置好了依赖并下载完成,那么你可以直接去用户home目录下的.ivy/cache/中拷贝你的jar需要的jar包

方法二:extraClassPath

提交时在spark-default中设定参数,将所有需要的jar包考到一个文件里,然后在参数中指定该目录就可以了,较上一个方便很多:

spark.executor.extraClassPath=/home/hadoop/wzq_workspace/lib/*
spark.driver.extraClassPath=/home/hadoop/wzq_workspace/lib/*

需要注意的是,你要在所有可能运行spark任务的机器上保证该目录存在,并且将jar包考到所有机器上。这样做的好处是提交代码的时候不用再写一长串jar了,缺点是要把所有的jar包都拷一遍。

方法三:jar-with-dependencies

如果你还是觉得第二种麻烦,这种方法是将所有依赖的jar包包括你写的代码全部打包在一起。需要配置pom文件,其中有四种方式,具体请参考博主:maven打依赖包的四种方法
 

如果在开发阶段需要多次上传jar包,可以第一次的时候上传含有依赖包的文件:test1-1.0-SNAPSHOT-jar-with-dependencies.jarSpark任务提交jar包依赖解决方案(开发阶段多次上传jar包比较慢,怎么办?)_第1张图片

到每台机器的相同路径(我的放在了/opt/cloudera/parcels/CDH-5.9.2-1.cdh5.9.2.p0.3/lib/extraClass_w/lib/)下,以后每次上传的时候只需要上传test1-1.0-SNAPSHOT.jar文件即可(在改动期间不能pom的依赖jar包不能发生变化,不然需要重新上传),执行代码为

$SPARK_HOME/bin/spark-submit   --master yarn  --executor-memory 2g --driver-memory 1g --executor-cores 2 --jars "/opt/cloudera/parcels/CDH-5.9.2-1.cdh5.9.2.p0.3/lib/extraClass_w/lib/*"  --name hbase2hdfs --class com.tophant.Hbase2hdfs /opt/spark/bin/test/w/test1-1.0-SNAPSHOT.jar "freebuf_01-" "20190531" "20190531" "/url/w/data/" "www.freebuf.com:12321"

 

你可能感兴趣的:(大数据,hadoop)