首先:我们的项目是多模块构建的,所以打包的时候会遇到各种模块之间依赖的问题,我们项目用到的是junit测试类,没有用main方法做测试,所以在打包运行的时候可能跟main函数运行方式有很大区别。
1. 测试类需要继承TestCase类,如需要运行ESReadTest,则需要将其继承TestCase:
2. 将需要导出的子模块所依赖的jar包导出:
(1) 方法一:通过运行mvn dependency:copy-dependencies –DoutputDirectory=lib导出:
进入datastore目录,输入命令,将子模块所需要的jar包导出到lib目录中。
执行成功后,能看到所依赖的jar包:
(2)方法二:在eclipse中,选择项目的pom.xml文件,点击右键菜单中的Run As,见下图红框中,在弹出的Configuration窗口中,输入 dependency:copy-dependencies后,点击运行
然后输入
(3) 方法三:通过可执行jar包导出:
在测试类中随便写一个main函数:
运行这个main函数,之后点击子模块导出可执行的jar包
然后用rar或者zip方式解压datastore.jar就能得到依赖的jar。
3. 将依赖的jar包拷贝到集群中,其中必须包含junit-4.12.jar这个jar包:
4. 将子模块打包:
右键需要打包的子模块,比如bigdataplatform-sdks-datastore
将子模块依赖的模块代码都需打包进去,否则会报方法找不到异常。见错误后面截图。
选择路径,命名jar包名称。
5. 将子模块中需要用到的数据集和配置文件都上传到Spark集群主节点:
例如ESReadTest需要用到datastore_config.properties这个配置文件,那么将这个配置文件上传到/home/hadoop/zjq这个目录中。如果需要用到数据集,那么则将数据集也上传到/home/hadoop/zjq这个目录下。(其中home/hadoop/zjq需要换成自己的目录,上传方式用WinSCP)。
代码中指定的路径只能写相对路径,比如:
不能写成“src/main/resources/datastore_config.properties”这种形式。否则会找不到文件。数据集路径也是一样的。
6. 将jar文件放到集群上:
运行命令:
java -cp .:/home/hadoop/zjq/lib/*:./testSpark.jarjunit.textui.TestRunner -m edu.fzu.bigdataplatform.sdk.datastore.operation.ESReadTest.testProcess
其中:
/home/hadoop/zjq/lib:表示jar包所在的路径
testSpark.jar:表示jar文件的名字
-m:表示运行方法,去掉这个参数表示运行整个类里面的所有测试方法
edu.fzu.bigdataplatform.sdk.datastore.operation.ESReadTest.testProcess:包名+类名+测试方法名
运行结果截图:
输出的运行结果:
Spark UI看到执行任务:
错误集合:
(1) 没有将依赖的模块打进jar包会出现找不到方法异常
(2) netty版本冲突
以下错误都是netty版本冲突,maven库很多包会下载依赖的jar,导致下载下来的jar包很多会出现版本冲突,比如这里的异常是因为:core包会下载netty 4.0.23版本包,但是datastore模块会下载netty 4.1.11版本包,导致放到集群中出现版本冲突报错,
解决方式:将netty包版本改成一样。
刚开始:
改完:
换版本的方式也很简单,直接在pom.xml里面写版本号,然后更新下来,去本地库就能找到这些jar包
是不是so easy,但是如果连这个都下载不了这个jar包的话,可能是没有这个版本的jar包,需要换一个版本,或者看看groupId等是不是写错了
(3) 以下这个问题比较low,运行过程中没有报错,但是程序一直卡在光标那不动,google很久,居然有人说在每个spark节点启动zookeeper就可以解决,内心os:这两个有关系吗,不过还是试了一下,结果跟想的一样,没啥关系。后面看了一下日志,发现Spark除了主节点是外网,其他都是内网,但是ES都是外网的,导致其他节点与ES通信不了,后面把ES换成内网IP就可以了。
(4)报以下错误
测试类没有继承TestCase这个类
即可