这个错误想必大家都遇到过,是使用了spark不支持的函数导致。
背景是这样的:我们有三个环境,开发环境、服务环境测试态,服务环境生产态。
这个作业在开发环境和服务环境生产态是可以正常运行的,但是在上线前夕,在服务环境测试态做最后的模拟上线,报错了,打印日志正是这个错误。
经查看,怀疑服务环境测试态的版本低于另外两个环境,所以出现这个问题。验证思路如下:查看spark-core的版本,进入到nodemanager节点的 /usr/hadoop3/spark2/jars 目录,spark-core是2.11版本,我们这里还使用了jodd工具包,解释下为什么我们在spark中使用这个包呢------
- 日期和时间处理:jodd-core-3.5.2提供了强大的日期和时间处理功能,可以帮助Spark更好地处理和操作与时间相关的数据。
- 缓存:jodd-core-3.5.2提供了一个缓存机制,可以帮助Spark更高效地缓存数据,从而提高数据处理的速度和效率。
- HTTP请求:jodd-core-3.5.2提供了一个简单的HTTP请求库,可以帮助Spark更好地与其他服务进行通信。
- 工具类:jodd-core-3.5.2还提供了一些其他的工具类和方法,例如文件操作、字符串处理等,这些工具类可以帮助Spark更好地处理数据和操作文件。
jodd-core-3.5.2这个jar包可以帮助Spark更好地处理和操作数据,提高数据处理的速度和效率,并且还可以帮助开发者更方便地进行开发。
就是这些原因。好,言归正传,然后我们把所有节点上的这个jodd都移动走,然后准备重新导入。
注意,如果你的jodd-core同时存在多个jar,也有可能报这个错。重点来了!!!我们正常环境确实有两个jodd-core jar包,一个是jodd-core 3.5.2, 一个是jodd-core 3.9.1 但是问题环境只有一个jodd-core 3.5.2,奇不奇怪??
解决办法肯定是将高版本的拷贝回来,保持和executor上一致。
但是依然报错,,查打印日志发现,实际运行时,没有检测到这个包,于是我们进入了提交spark程序的服务器 、data/project/dts-executor/plugins/sparkSQL目录,
和正常环境相比,少了个配置项,conf.spark.yarn.archive ,说明一下,算子加载的依赖包有两部分,一个是算子lib下的,另一个是spark客户端jars下的。没配置archive算子用的就是spark客户端下的jar包,配置archive,使用的是executor的lib。那就补上配置项。这样只有executor端本地有jar包,就不用去hdfs上找了。
最终,我们在nodemanager里放上了jodd 3.9.1的包,重跑成功。
全文完,讲的不清楚的地方多多包涵,文字功底有限。