第一个问题
对于spark 2.3.2版本,使用的依赖如下,在本地执行测试的时候报错误:
Exception in thread “main” java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.elapsedMillis()J
经过查资料,原因应该是这个spark版本中的guava版本为 16.0.1 ,该版本中移除了相关方法,所以会导致报错。
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.3.2</version>
</dependency>
解决方法:排除依赖,如下
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.3.2</version>
<exclusions>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
</exclusions>
</dependency>
补充:经过试验后,直接添加guava的低版本依赖也可以(见问题三),不需要在spark的依赖中添加exclusion
第二个问题
当spark任务需要添加hive支持时,即初始化sparkseeion时,添加如下代码.enableHiveSupport(),例:
SparkSession sparkSession = SparkSession
.builder()
.appName("app")
.master("local[*]")
.enableHiveSupport()
.getOrCreate();
这时如果没有相关依赖会报以下错误:
Exception in thread “main” java.lang.IllegalArgumentException: Unable to instantiate SparkSession with Hive support because Hive classes are not found.
添加如下依赖解决:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.11</artifactId>
<version>2.3.2</version>
</dependency>
第三个问题
基于前两个问题,当依赖中同时有上述两项时,如果想要使用hive支持,那么按照问题一的解决办法,排除相关依赖后,即便有hive的相关依赖,也同样会报第二个问题的错误:
Exception in thread “main” java.lang.IllegalArgumentException: Unable to instantiate SparkSession with Hive support because Hive classes are not found.
推测可能启用hive支持,还是需要这个guava组件,于是在pom文件中添加guava 的低版本依赖,问题三解决!如下:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>14.0.1</version>
</dependency>
写在最后:解决问题过程中并未具体研究 guava 的相关资料(用途和版本一概不知……),所以如有不当,还请多多指正