在阅读ML模型时,Spark创建了太多线程

时间:2017-08-30 13:21:02

标签: multithreading apache-spark machine-learning apache-spark-mllib multilabel-classification

我有一个多标签文本分类问题,我尝试使用二进制相关性方法解决,通过为每个标签创建一个二进制分类器。 我必须阅读10000个模型分类器来执行我的分类阶段,在我的训练阶段之后,在我的所有文档上,使用spark。 但是由于一个未知的原因,当我尝试读取超过1000个模型时它变得非常慢,因为spark每次都会创建一个新线程,这会逐渐减慢进程,我不知道为什么。 这是解释我问题的最小代码。

package entrepot.spark;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.spark.ml.classification.MultilayerPerceptronClassificationModel;
import org.apache.spark.sql.SparkSession;

public class maintest {
    public static void main(String[] args) throws FileNotFoundException, IllegalArgumentException, IOException {
        try(SparkSession spark = SparkSession.builder().appName("test").getOrCreate()) {
            //Listing directories to get the list of labels
            Set<String> labels = new HashSet<>();
            FileStatus[] filesstatus = FileSystem.get(spark.sparkContext().hadoopConfiguration()).listStatus(new Path("C:\\Users\\*\\Desktop\\model\\"));
            for(int i = 0; i < filesstatus.length; i++) {
                if(filesstatus[i].isDirectory()) {
                    labels.add(filesstatus[i].getPath().getName());
                }
            }

            List<MultilayerPerceptronClassificationModel> models = new ArrayList<>();
            // Here is the problem
            for(String label : labels) {
                System.out.println(label);
                MultilayerPerceptronClassificationModel model = MultilayerPerceptronClassificationModel.load("C:\\Users\\*\\Desktop\\model\\" + label + "\\CL\\");
                models.add(model);
            }

            System.out.println("done");
        }
    }
}

我在Windows上使用Spark 2.1.1和Hadoop 2.7.3运行程序,使用以下命令行:

 .\bin\spark-submit^
 --class entrepot.spark.maintest^
 --master local[*]^
  /C:/Users/*/eclipse-workspace/spark/target/spark-0.0.1-SNAPSHOT.jar

要下载我的一个标签模型的小型重复样本,这里是链接:we.tl/T50s9UffYV(为什么我不能发布一个简单的链接?)

PS:即使模型是可序列化的,我也无法使用java集合和对象流一次保存和加载所有内容,因为我收到了scala转换错误。相反,我在每个模型上使用MLLib的save / load静态方法,导致数十万个文件。

0 个答案:

没有答案
相关问题