首页 > 解决方案 > 如何检查 Spark 是否正在使用 OpenBlas?

问题描述

我最近下载并构建了 Spark 2.3.1。我使用这些命令下载并选择了 2.3.1 版本

git clone https://github.com/apache/spark.git   
cd spark
git checkout tags/v2.3.1

我希望提高我的应用程序的性能,并且遇到了建议更新 OpenBLAS 的分布式版本的文章,因此在构建 spark 时我使用了-Pnetlib-lgpl安装选项netlib-java

这是我使用的命令。

build/mvn -Pyarn -Phive -Phive-thriftserver  -DskipTests -Pnetlib-lgpl clean package

我如何知道/确保 spark 现在使用我使用上述命令安装的 netlib-java 中的 OpenBLAS,而不是随 Ubuntu 分发的 OpenBLAS?另外,这是更新 OpenBLAS 的正确方法还是我错过了什么?

附言

我运行了以下命令以查看它是否正确安装

import com.github.fommil.netlib.BLAS
println(BLAS.getInstance().getClass().getName())

结果是

com.github.fommil.netlib.NativeSystemBLAS

我使用以下链接

sudo update-alternatives --display liblapack.so
sudo update-alternatives --install /usr/lib64/libblas.so libblas.so /usr/lib64/atlas/libtatlas.so.3 1000
sudo update-alternatives --install /usr/lib64/libblas.so.3 libblas.so.3 /usr/lib64/atlas/libtatlas.so.3 1000
sudo update-alternatives --install /usr/lib64/liblapack.so liblapack.so /usr/lib64/atlas/libtatlas.so.3 1000
sudo update-alternatives --install /usr/lib64/liblapack.so.3 liblapack.so.3 /usr/lib64/atlas/libtatlas.so.3 1000

我正在使用 Ubuntu

Distributor ID: Ubuntu
Description:    Ubuntu 16.04.3 LTS
Release:    16.04
Codename:   xenial

标签: javaapache-sparkubuntublasopenblas

解决方案


既然您已经确认 Spark 使用的是本机 BLAS 库,请使用lsof它来找出托管工作程序的 JVM 进程究竟加载了哪个库。加载的库在lsof. 以下是使用英特尔 MKL 的 Spark 示例:

$ lsof -n -p 10202
...
java  10202 ubuntu  mem  REG  8,1  70211598  519025 /opt/intel/compilers_and_libraries_2019.3.199/linux/mkl/lib/intel64_lin/libmkl_core.so
java  10202 ubuntu  mem  REG  8,1    902768  521066 /opt/intel/compilers_and_libraries_2019.3.199/linux/mkl/wrapper/mkl_wrapper.so
...

10202是JVM进程的PID。输出包含每个打开文件的完整路径,因此您可以轻松判断是否使用了正确的库。


推荐阅读