java - 如何检查 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
解决方案
既然您已经确认 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。输出包含每个打开文件的完整路径,因此您可以轻松判断是否使用了正确的库。
推荐阅读
- html - boostrap 浮动标签与 jquery 验证标签冲突
- python - 按名称切片数据框的列
- python - 如何结合动态数量(150-200)的异步函数进行计算
- javascript - 对象访问括号符号
- iis - 如何在 Microsoft Edge (Chromium) 中防止在特定 IIS Web 应用程序中以及仅在该应用程序中缓存页面
- java - 如何在 Kuma 或任何其他服务网格的另一个 SpringBoot 应用程序中注入 SpringBoot 应用程序作为 SideCar 代理
- python - 在命令行中使用参数运行 Flask 应用程序
- azure - Azure 应用服务和基础结构维护
- hibernate - JPA/Java Play 新行在更新时创建
- c - zmq_socket() 挂在 eventfd() 系统调用上