Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark svd性能Pypark vs scipy_Apache Spark_Machine Learning_Scipy_Svd - Fatal编程技术网

Apache spark svd性能Pypark vs scipy

Apache spark svd性能Pypark vs scipy,apache-spark,machine-learning,scipy,svd,Apache Spark,Machine Learning,Scipy,Svd,使用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.nu

使用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)
输出:

索引材料行数=2000

索引表列=6000

spark
df
有100个分区,我用20个执行器运行这个作业

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

from scipy.sparse.linalg import svds

u, s, vt = svds(tfidf_sparse, k=100)

对于小型数据集,像spark这样的分布式系统有一个缺点。当您想要处理的数据不适合单个计算机的内存时,它们开始变得有用

以下是spark比scipy慢的其他潜在原因的不完整列表:

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

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

  • 与使用最佳设置安装spark相比,使用最佳设置安装scipy更容易:

    与为spark安装相同的依赖项相比,使用BLAS(一组加速线性代数例程)安装/配置Scipy更容易。例如,如果您通过conda(来自发行版)使用Scipy,那么它已经配置好了blas依赖项。鉴于 Spark默认使用线性代数操作的普通java实现,并要求您自己(在每个执行器上)配置blas,以获得更好的性能(有关更多信息,请查看)。您的系统可能没有安装BLAS依赖项

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

    您应该使用更新的ML API版本。几个堆栈溢出线程解释了为什么应该使用较新的API。您可以勾选此项以了解大致情况:

    通常,您应该使用pyspark.ml中的API而不是pypsark.mllib(如果您使用的是scala,则使用org.apache.spark.ml而不是org.apache.spark.mllib)。所以,再次尝试使用和基准测试重写代码

  • 更不用说spark在每次执行开始时都会等待资源,这会根据集群的容量降低作业的总体时间


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

    我认为svd在spark ml中不可用api@devツ 不是。但是我试图给出一个总体想法,除了我上面提到的,基于RDD的API比基于数据帧的API慢。