Spark 2.2.1运行报错:BONECP连接池未找到及Hive元存储实例化失败求助
我来帮你一步步排查这两个Spark 2.2.1的问题,都是实际使用中很常见的坑,咱们逐个解决:
问题1:未在CLASSPATH中找到"BONECP"连接池插件
这个错误是因为Spark 2.2.1默认使用BONECP作为JDBC连接池,但你的项目或运行环境中缺少对应的依赖包。这里有几种解决方式:
构建工具添加依赖:
如果用SBT构建项目,在build.sbt里加入:libraryDependencies += "com.jolbox" % "bonecp" % "0.8.0.RELEASE"如果是Maven,在
pom.xml中添加:<dependency> <groupId>com.jolbox</groupId> <artifactId>bonecp</artifactId> <version>0.8.0.RELEASE</version> </dependency>运行时指定依赖:
直接用spark-submit运行时,通过--jars参数指定BONECP的Jar包路径:spark-submit --jars /path/to/bonecp-0.8.0.RELEASE.jar your-app.jar替换为其他连接池(可选):
如果你不想用BONECP,也可以切换到HikariCP这类更流行的连接池。先添加HikariCP依赖,然后在spark-defaults.conf里配置:spark.sql.datasource.connectionPoolClass=com.zaxxer.hikari.HikariDataSource
问题2:SessionHiveMetaStoreClient实例化失败
这个异常说明Spark无法连接到Hive元存储,常见原因和解决方法如下:
检查Hive配置文件:
确保hive-site.xml配置正确,尤其是hive.metastore.uris参数(如果用远程元存储):<property> <name>hive.metastore.uris</name> <value>thrift://your-metastore-host:9083</value> </property>把这个文件放到Spark的
conf目录下,或者在spark-submit时用--files参数指定:spark-submit --files /path/to/hive-site.xml your-app.jar确认Hive元存储服务状态:
如果是远程元存储,必须确保Metastore服务已经启动。执行以下命令启动:hive --service metastore提示:可以用
nohup hive --service metastore &让服务后台运行。版本兼容性检查:
Spark 2.2.1默认适配Hive 1.2.1,如果你的集群Hive版本不一致,会出现依赖冲突。可以在spark-submit时指定对应版本的Hive依赖:spark-submit --packages org.apache.hive:hive-metastore:1.2.1 your-app.jar嵌入式Derby元存储问题:
如果用默认的嵌入式Derby,可能因为多进程访问导致锁或元数据损坏。解决方法:- 删除Spark工作目录下的
metastore_db文件夹 - 确保同一时间只有一个Spark应用访问Derby元存储
- 删除Spark工作目录下的
权限排查:
检查运行Spark应用的用户是否有权限访问Hive元存储的底层数据库(如MySQL/PostgreSQL),或者HDFS上的元数据存储路径。
内容的提问来源于stack exchange,提问作者Aswathy

