Ubuntu 20.04下Apache Spark 3.1.3的OpenBlas与Lapack无法工作求助
问题分析与解决方案
关于libgfortran5的兼容性
Ubuntu 20.04中libgfortran是虚拟包,无法直接安装,libgfortran5是对应GCC 9系列的官方替代包,完全兼容netlib对Fortran运行库的需求,这不是导致原生BLAS加载失败的根源。
解决update-alternatives报错问题
执行update-alternatives时提示"no alternatives for...",是因为Ubuntu 20.04安装libopenblas-base和libatlas3-base后,不会自动为这些库注册备选项,需要手动添加:
先确认已安装的BLAS/LAPACK库路径:
# 查看libblas.so.3的实际指向 ls -l /usr/lib/x86_64-linux-gnu/libblas.so.3 # 查看liblapack.so.3的实际指向 ls -l /usr/lib/x86_64-linux-gnu/liblapack.so.3正常情况下,
libopenblas-base安装后,这两个文件会指向libopenblas.so.0(OpenBLAS已整合LAPACK实现)。手动注册备选项(以OpenBLAS作为默认库为例):
# 注册libblas.so sudo update-alternatives --install /usr/lib/x86_64-linux-gnu/libblas.so libblas.so /usr/lib/x86_64-linux-gnu/libopenblas.so.0 100 # 注册libblas.so.3 sudo update-alternatives --install /usr/lib/x86_64-linux-gnu/libblas.so.3 libblas.so.3 /usr/lib/x86_64-linux-gnu/libopenblas.so.0 100 # 注册liblapack.so sudo update-alternatives --install /usr/lib/x86_64-linux-gnu/liblapack.so liblapack.so /usr/lib/x86_64-linux-gnu/libopenblas.so.0 100 # 注册liblapack.so.3 sudo update-alternatives --install /usr/lib/x86_64-linux-gnu/liblapack.so.3 liblapack.so.3 /usr/lib/x86_64-linux-gnu/libopenblas.so.0 100完成后再执行
update-alternatives --config libblas.so.3,就能正常选择默认BLAS库了。
让Spark正确加载原生BLAS库
排查依赖版本冲突:Spark 3.1.3默认依赖的netlib版本就是
1.1.2,你添加的pom依赖版本匹配,但要注意:- 若用sbt打包,确保
assembly插件没有排除netlib的原生库依赖; - 提交任务时建议用
--packages com.github.fommil.netlib:all:1.1.2参数,避免本地依赖与集群环境不一致。
- 若用sbt打包,确保
配置JVM原生库路径:Spark的JVM进程需要能找到系统安装的原生库,可通过两种方式配置:
- 修改Spark配置文件
spark-env.sh,添加:export SPARK_JAVA_OPTS="-Djava.library.path=/usr/lib/x86_64-linux-gnu" - 提交任务时直接指定:
spark-submit --conf "spark.executor.extraJavaOptions=-Djava.library.path=/usr/lib/x86_64-linux-gnu" \ --conf "spark.driver.extraJavaOptions=-Djava.library.path=/usr/lib/x86_64-linux-gnu" \ your_application.jar
- 修改Spark配置文件
验证加载结果:重新运行测试代码,若输出变为
com.github.fommil.netlib.NativeSystemBLAS或com.github.fommil.netlib.NativeRefBLAS,说明原生库加载成功,Spark日志中的警告也会消失。
额外检查
- 确保所有Spark Worker节点都安装了
libopenblas-base、libgfortran5包,并且配置了相同的java.library.path,Worker节点也需要加载原生库; - 查看Worker节点的日志,确认Worker进程能正常找到原生库,避免仅Driver加载成功的情况。
内容的提问来源于stack exchange,提问作者ktzan
相关产品推荐
相关产品推荐

