解决使用HBase-Spark连接器时的NoClassDefFoundError: org/apache/spark/Logging异常
你遇到的这个NoClassDefFoundError其实很常见,核心原因是Spark 2.0.0已经彻底移除了org.apache.spark.Logging这个类——这个类在Spark 1.x中是公共API,但从Spark 2.0开始被标记为内部API并最终删除,而你用的HBase-Spark连接器版本大概率还依赖这个旧的类定义。
给你几个实用的解决方案:
优先选择:匹配HBase与Spark的兼容版本
不同版本的HBase对Spark的支持有明确对应关系。比如如果你用的是Spark 2.0.0,建议搭配HBase 1.2.x系列的hbase-spark连接器,同时要排除掉连接器自带的旧Spark依赖,避免版本冲突。在你的POM里可以这么配置:<dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-spark</artifactId> <version>1.2.6</version> <exclusions> <exclusion> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> </exclusion> </exclusions> </dependency>临时兼容方案:补充缺失的依赖包
如果暂时没法更换HBase版本,可以添加spark-tags依赖,这个包包含了Spark 2.x中保留的Logging相关兼容类,能补上这个缺失:<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-tags_2.11</artifactId> <version>2.0.0</version> <scope>provided</scope> </dependency>不过这个方案只是临时救急,长期来看还是建议版本匹配。
排查依赖冲突
用mvn dependency:tree命令生成项目的依赖树,检查是不是有其他第三方依赖偷偷引入了旧版本的Spark组件,导致类加载冲突。如果发现这种情况,直接用<exclusions>标签把冲突的依赖排除掉就行。
另外还要提醒你:保持所有Spark相关依赖的版本一致(你现在的spark-core和spark-sql都是2.0.0,这点做得很对),如果是在集群上运行,还要确保集群的HBase和Spark版本也和本地依赖匹配,不然很容易出现本地跑通集群报错的情况。
内容的提问来源于stack exchange,提问作者Mahesha999

