Spark启动报错无法加载native-hadoop库及JDK17访问异常如何解决
解决方案
核心报错根因
这个错误是JDK 17的模块化访问限制导致的:Spark 3.2.x版本底层依赖的sun.nio.ch.DirectBuffer属于JDK内部模块,JDK17默认不允许unnamed module访问该内部类,触发权限报错导致SparkContext初始化失败,后续才会出现spark变量找不到的衍生错误。
修复方案
方案1:单次启动临时加参数
启动spark-shell、spark-submit等命令时,手动添加JVM参数开放访问权限:
spark-shell --conf "spark.driver.extraJavaOptions=--add-exports java.base/sun.nio.ch=ALL-UNNAMED" --conf "spark.executor.extraJavaOptions=--add-exports java.base/sun.nio.ch=ALL-UNNAMED"
方案2:全局配置永久生效
编辑$SPARK_HOME/conf/spark-defaults.conf文件(如果不存在则复制同目录下的spark-defaults.conf.template重命名即可),末尾添加两行配置:
spark.driver.extraJavaOptions --add-exports java.base/sun.nio.ch=ALL-UNNAMED spark.executor.extraJavaOptions --add-exports java.base/sun.nio.ch=ALL-UNNAMED
保存后重启所有Spark服务,后续启动无需额外加参数。
方案3:降级JDK版本(兼容性最优)
Spark 3.2.x官方仅支持JDK 8、JDK 11版本,JDK 17是Spark 3.3及以上版本才正式兼容的。如果不需要使用JDK17的新特性,直接把JDK版本降级到8或11,更新JAVA_HOME环境变量即可,不需要修改任何Spark配置就能正常启动。
补充说明:开头的
WARN NativeCodeLoader是Hadoop原生库加载警告,不影响Spark核心运行,如需消除可在$SPARK_HOME/conf/spark-env.sh中添加export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native:$LD_LIBRARY_PATH即可。
内容的提问来源于stack exchange,提问作者CoderKasper
相关产品推荐
相关产品推荐

