1:现象:
我在本地运行的时候总是报错,这个错误经过我的排查是和引入的hbase的依赖有关系。报错如下:
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.conf.Configuration.getPassword(Ljava/lang/String;)[C
at org.apache.spark.SSLOptions$$anonfun$8.apply(SSLOptions.scala:188)
at org.apache.spark.SSLOptions$$anonfun$8.apply(SSLOptions.scala:188)
at scala.Option.orElse(Option.scala:289)
at org.apache.spark.SSLOptions$.parse(SSLOptions.scala:188)
at org.apache.spark.SecurityManager.<init>(SecurityManager.scala:117)
at org.apache.spark.SparkEnv$.create(SparkEnv.scala:236)
at org.apache.spark.SparkEnv$.createDriverEnv(SparkEnv.scala:175)
at org.apache.spark.SparkContext.createSparkEnv(SparkContext.scala:257)
at org.apache.spark.SparkContext.<init>(SparkContext.scala:424)
at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2520)
at org.apache.spark.sql.SparkSession$Builder$$anonfun$7.apply(SparkSession.scala:935)
at org.apache.spark.sql.SparkSession$Builder$$anonfun$7.apply(SparkSession.scala:926)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:926)
at com.weibo.hive2hbase.Testv$.main(Testv.scala:15)
at com.weibo.hive2hbase.Testv.main(Testv.scala)
这个错误很奇怪,后来经过排查我发现是和我引入的hbase-protocal 这个依赖有关系,但是我在项目中是需要这个依赖的,所以说pom文件里还必须有才行。
<dependency>-->
<!-- <groupId>org.apache.hbase</groupId>-->
<!-- <artifactId>hbase-protocol</artifactId>-->
<!-- <version>${hbase.version}</version>-->
<!-- </dependency>-->
最初的想法是去看相关的jar冲突,但是发现这个思路好像不对。有考虑过是因为不同的版本导致的问题,切换为2.x的hbase版本依旧是无法解决问题。
但是有个奇怪的现象就是:我打包到集群上之后运行spark-submit是ok的,但是在我本地就会出问题。此时我开始怀疑是集群上可能有我本地没有的依赖,然后才不会报错的。
2:去报错的地方看看:
为了彻底的去看看这个报错的地方我决定 debug到具体的位置去看看
定位进来之后发现:
是这里import 了 hadoop.conf.Configuration
定位到源码里发现位置是在:
spark-core里用到的
然后从这里进去看看可以定位到哪里,结果是定位到了hadoop-common包下面
解决方式一:
我是没有引入和这个hadoop-common 这个包的。也就是说spark-core 里使用到了这个依赖,然后hbase 引入的依赖里也用到了这个依赖,然后两者的依赖的版本可能还不一样。
使用插件分析果然是的,然后我就去看了下hbase 依赖的版本,果然是个低版本的,所以我就把hbase相关的hadoop-common 依赖都排除了。问题解决。
解决方式二:
前面说过,把jar包放到集群环境里就是没问题的,这个让我觉得可能是集群上有我本地没有的依赖,最后果然是的,
于是我就试着把
<!-- <dependency>-->
<!-- <groupId>org.apache.hadoop</groupId>-->
<!-- <artifactId>hadoop-common</artifactId>-->
<!-- <version>2.7.3</version>-->
<!-- </dependency>-->
这个包给加进去了,结果问题就解决了。
3:总结:
同一个问题我用了两种方式来解决这个问题,其实主要还是解决问题的思路。