svd性能pyspark vs scipy

使用pyspark计算SVD:

rdd = MLUtils.convertVectorColumnsFromml(df.select("ID","TF_IDF")).rdd
index_mat = IndexedRowMatrix(rdd)

print('index_mat rows = {}'.format(index_mat.numRows()))
print('index_mat columns = {}'.format(index_mat.numCols()))

svd = index_mat.computeSVD(k=100,computeU=True)

输出:

  

index_mat行= 2000

     

index_mat列= 6000

spark df具有100个分区,我正在与20个执行程序一起运行此作业。

这需要一个多小时。在1分钟内运行使用scipy的类似代码。

from scipy.sparse.linalg import svds

u,s,vt = svds(tfidf_sparse,k=100)
seaxon 回答:svd性能pyspark vs scipy

对于小型数据集,像spark这样的分布式系统有一个缺点。当您要处理的数据无法容纳在单台计算机的内存中时,它们开始变得有用。

以下是火花不如scipy慢的潜在其他原因的不完整列表:

  1. 首先是因为网络通信时间:

    对于适合单个计算机内存的小型数据集,使用单个节点的pandas,numpy和scipy之类的工具将花费较少的时间移动数据并专注于实际计算。而您在spark中使用的20个执行程序将不得不花费更多时间通过网络传输数据。因此,对于分布式系统,网络速度,带宽和拥塞程度等其他因素也会影响性能。

  2. 与以最佳设置安装spark相比,以最佳设置安装scipy更容易:

    使用BLAS安装/配置Scipy更加容易:与为spark安装相同的依赖项相比,一组加速的线性代数例程。例如,如果您通过conda(来自anaconda发行版)使用Scipy,则它已经带有经过良好配置的blas依赖项。鉴于, 默认情况下,Spark使用线性代数运算的原始Java实现,并要求您(在每个执行程序上)自行配置blas以获得更好的性能(有关更多信息,请查看mllib dependencies)。可能是您的系统没有安装BLAS依赖项。

  3. 您正在使用基于RDD的旧机器学习库:mllib API。

    您应该使用较新的ML API版本。几个Stack-overflow线程解释了为什么您应该转向较新的API。您可以检查这一点以获得总体思路:What's the difference between Spark ML and MLLIB packages

    通常,您应该使用pyspark.ml中的API而不是pypsark.mllib(如果使用的是Scala,则使用org.apache.spark.ml而不是org.apache.spark.mllib)。因此,尝试再次使用ml API重写代码并进行基准测试。

更不用说spark在每次执行开始时都会等待资源,这可能会降低作业的总体时间,具体取决于集群的容量。

如果您需要更多详细信息,请提供一个可重现的示例,包括数据以及有关数据集大小(观察数和大小以GB为单位)的更多信息。

本文链接:https://www.f2er.com/3151563.html

大家都在问