我最近下载并构建了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或我错过了什么?
PS
我运行以下命令以查看它是否已正确安装
import com.github.fommil.netlib.BLAS 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使用您通过-Pnetlib-lgpl
选项安装的netlib-java中的OpenBLAS,而不是系统默认的OpenBLAS,您可以采取以下步骤进行验证:
查看Spark配置:首先检查Spark的构建日志。在执行mvn
命令时,如果有与netlib-java相关的输出信息,这将是一个很好的指示,表明该库已被正确包含在Spark的构建过程中。
检查Spark作业的日志:当您运行Spark应用程序时,可以在其日志中寻找有关BLAS库加载的线索。特别是关注那些提及到netlib-java
或OpenBLAS
的条目。如果Spark成功地使用了netlib-java中的OpenBLAS,那么应该能在日志中找到相关引用。
Java系统属性和环境变量:在启动Spark应用时,可以通过设置Java系统属性来强制指定BLAS库的路径。虽然这不是直接验证的方法,但可以间接确保您的应用使用预期的库。例如,可以通过如下方式设置(注意这需要在启动Spark应用时添加JVM参数):
spark-submit --conf "spark.executor.extraJavaOptions=-Dcom.github.fommil.netlib.BLAS=com.github.fommil.netlib.F2jBLAS" ...
这里假设F2jBLAS
是netlib-java项目中对OpenBLAS的一个包装实现。
代码验证:您已经尝试通过代码来验证BLAS库是否被正确加载,这是个好方法。不过,请注意,直接在代码中导入com.github.fommil.netlib.BLAS
和NativeSystemBLAS
类,并不能直接证明Spark在运行时使用的是哪个版本的OpenBLAS。为了更准确地验证,您可以在Spark作业中加入一些日志打印,比如通过System.out.println(BLAS.getInstance().getClass().getName())
来获取实际使用的BLAS实例类型。
性能比较:最后,一个间接但实用的验证方法是对比性能。如果更新后的OpenBLAS确实带来了性能提升,这从侧面说明Spark正在使用它。当然,性能测试需要在控制其他变量的情况下进行,以确保结果的准确性。
综上所述,结合上述方法,尤其是检查Spark日志和在应用中加入日志打印,应该是最直接有效的验证手段。如果您发现尽管采取了措施,Spark仍然没有使用预期的OpenBLAS版本,可能需要回溯构建过程,确认所有依赖都正确无误地下载并集成到了Spark中。