Spark&Hadoop:scala编写spark任务jar包,运行无法识别main函数,怎么办?

  昨晚和同事一起看一个scala写的程序,程序都写完了,且在idea上debug运行是ok的。但我们不能调试的方式部署在客户机器上,于是打包吧。打包时,我们是采用把外部引入的五个包(spark-assembly-1.5.1-hadoop2.6.0.jar、commons-logging.jar、fastjson-1.2.10.jar、sqljdbc4.jar、log4j.jar)打包到我们的jar包中。好了,一切都好了。。。在java -jar demo.jar方式运行,以及把它拷贝到spark集群中,使用spark-submit方式调教都不好用。爆出error都是一致的:找不到main函数。

      好吧,找原因吧。

  1. 是不是发布的jar包有问题?
  2. 是不是在artifcates中设置有问题?
  3. 难道是打包环境设置错误了?
  4. 。。。

  一顿神找呀。

  不行我们写个原始的scala程序,只写一个main函数,通过jar测试下,看是否可行。。。结果:不错奥,这个test.jar不负众望的运行起来了;

  那引入外部包,并打包到jar下运行看看。。。结果:把jar包打包进来运行就不好用了。

  那我们在cmd下运行附带有外部包的jar文件。。。结果:可以的;那我们就走了打包时不附带外部包的方式运行。

当然,按道理说把外部引入的jar文件打包的我们的jar包中,这种处理方案应该是可行的,我们这里就绕过了这个条路。通过spark提交时制定外部引入包,发现也是可行的。下边就介绍下,这两种运行方式的具体操作步骤:

  • cmd下运行jar包方式,执行spark任务:

1、打包时,需要注意不要引入其他包:

2、我把生成的文件拷贝到D盘根目录,结构如下:

3、执行cmd执行命令为:
java -cp D:\xxx\Jars\spark-assembly-1.5.1-hadoop2.6.0.jar;D:\xxx\Jars\commons-logging.jar;D:\xxx\Jars\fastjson-1.2.10.jar;D:\xxx\Jars\sqljdbc4.jar;D:\xxx\Jars\log4j.jar;D:\xxx\scalatest20161031.jar testobject

4、结果:

 

  • 在集群服务器上使用.sh文件调spark-submit命令方式提交任务:

备注:打包时依然不包含外部包到jar包中。

1、test_submit.sh文件内容如下: 

#!/bin/sh
spark-submit --master spark://172.21.7.10:7077 --jars ./Jars/spark-assembly-1.5.1-hadoop2.6.0.jar,./Jars/commons-logging.jar,./Jars/fastjson-1.2.10.jar,./Jars/sqljdbc4.jar,./Jars/log4j.jar --class testobject --executor-memory 15G --total-executor-cores 8 scalatest20161031.jar

2、集群节点上文件存储结构:

hadoop@hadoop-master:/$ cd /home/hadoop/xxx/
hadoop@hadoop-master:~/xxx$ ls
Jars  scalatest20161031.jar  test_submit.sh
hadoop@hadoop-master:~/xxx$ cd Jars
hadoop@hadoop-master:~/xxx/Jars$ ls
commons-logging.jar  fastjson-1.2.10.jar  log4j.jar  spark-assembly-1.5.1-hadoop2.6.0.jar  sqljdbc4.jar
hadoop@hadoop-master:~/xxx/Jars$

3、执行提交命令:

hadoop@hadoop-master:~/xxx/Jars$ cd ..
hadoop@hadoop-master:~/xxx$ ls
Jars  scalatest20161031.jar  test_submit.sh
hadoop@hadoop-master:~/xxx$ ./test_submit.sh
16/11/14 04:06:29 INFO spark.SparkContext: Running Spark version 1.5.1
16/11/14 04:06:29 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
16/11/14 04:06:29 INFO spark.SecurityManager: Changing view acls to: hadoop
16/11/14 04:06:29 INFO spark.SecurityManager: Changing modify acls to: hadoop
16/11/14 04:06:29 INFO spark.SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(hadoop); users with modify permissions: Set(hadoop)
16/11/14 04:06:30 INFO slf4j.Slf4jLogger: Slf4jLogger started
16/11/14 04:06:30 INFO Remoting: Starting remoting

以上是和同事一起闯过的坑,必须记录下来。。。分享给大家吧。 

  

posted @ 2016-11-14 10:04  cctext  阅读(5574)  评论(0编辑  收藏  举报