R与Hive(Spark)连接异常求助:Linux服务器报NoClassDefFoundError
问题分析与解决办法
这个java.lang.NoClassDefFoundError错误指向很明确——你的Linux R服务器上缺少Hive JDBC驱动运行必需的Apache HttpClient相关依赖包。
为什么Windows能正常运行,Linux却报错?
Windows环境能顺利连接,大概率是因为你的Windows系统Java环境的classpath中已经默认包含了这些依赖类,或是你之前配置环境时无意间把相关jar包加入了classpath;而Linux服务器上你只单独放置了hive-jdbc-1.2.1-spark2-amzn-0.jar,这个jar本身并不包含org.apache.http.client.CookieStore这类依赖类,JVM在运行时找不到对应类,就抛出了错误。
具体解决步骤
下载完整的依赖jar包
Hive JDBC驱动依赖多个第三方库,除了Apache HttpClient(包含CookieStore类),还需要Commons Logging、Commons Codec等。你可以:- 直接去Maven中央仓库搜索对应版本的依赖包,选择和
hive-jdbc-1.2.1-spark2-amzn-0兼容的版本(建议选4.x系列的HttpClient版本); - 如果服务器上安装了Maven,也可以用命令自动下载所有依赖到指定目录:
mvn dependency:copy-dependencies -DoutputDirectory=~/Drivers/Spark/ -Dartifact=org.apache.hive:hive-jdbc:1.2.1-spark2-amzn-0
- 直接去Maven中央仓库搜索对应版本的依赖包,选择和
修改R代码加载所有依赖
把下载好的所有依赖jar包放到~/Drivers/Spark/目录下,然后修改JDBC驱动加载代码,将所有jar包路径用逗号分隔传入:library(rJava) library(RJDBC) # 列出所有需要的jar包路径 jar_paths <- c( "~/Drivers/Spark/hive-jdbc-1.2.1-spark2-amzn-0.jar", "~/Drivers/Spark/httpclient-4.5.13.jar", "~/Drivers/Spark/httpcore-4.4.14.jar", "~/Drivers/Spark/commons-logging-1.2.jar", "~/Drivers/Spark/commons-codec-1.15.jar" ) driver <- JDBC("org.apache.hive.jdbc.HiveDriver", jar_paths, identifier.quote="`") url <- "jdbc:hive2://<MyIP>:10001" conn <- dbConnect(driver, url)验证兼容性
如果运行后仍出现新的NoClassDefFoundError,说明还有遗漏的依赖,继续补充对应的jar包即可,注意保持依赖版本和Hive JDBC版本的兼容性。
内容的提问来源于stack exchange,提问作者Alexandr Fruman
相关产品推荐
相关产品推荐

