可以在Spark批处理上创建模型并在Spark流中使用它吗?

时间:2016-05-09 11:11:36

标签: apache-spark machine-learning spark-streaming

我可以在Spark批处理中创建模型并在Spark流上使用它进行实时处理吗?

我已经在Apache Spark网站上看到了各种示例,其中训练和预测都建立在相同类型的处理(线性回归)上。

2 个答案:

答案 0 :(得分:5)

  

我可以在Spark批处理中创建模型并在Spark流上使用它进行实时处理吗?

当然,是的。在spark社区,他们称之为离线培训在线预测。 spark中的许多训练算法允许您将模型保存在文件系统HDFS / S3上。流应用程序可以加载相同的模型。您只需调用模型的预测方法进行预测。

请参阅this link中的Streaming + MLLib部分。

例如,如果您想离线训练DecisionTree并在线进行预测......

批量申请 -

    val model = DecisionTree.trainClassifier(trainingData, numClasses, categoricalFeaturesInfo,impurity, maxDepth, maxBins)
    model.save(sc, "target/tmp/myDecisionTreeClassificationModel")

在流媒体应用程序中 -

    val sameModel = DecisionTreeModel.load(sc, "target/tmp/myDecisionTreeClassificationModel")
    sameModel.predict(newData)

答案 1 :(得分:1)

这是我刚刚实施的另一个解决方案。

我在spark-Batch中创建了一个模型。 假设最终的模型对象名称是regmodel。

final LinearRegressionModel regmodel =algorithm.run(JavaRDD.toRDD(parsedData));

和spark上下文名称为sc

JavaSparkContext sc = new JavaSparkContext(sparkConf);

现在在相同的代码中,我使用相同的sc

创建火花流
final JavaStreamingContext jssc = new JavaStreamingContext(sc,new Duration(Integer.parseInt(conf.getWindow().trim())));

做这样的预测:

JavaPairDStream<Double, Double> predictvalue = dist1.mapToPair(new PairFunction<LabeledPoint, Double,Double>() {
                private static final long serialVersionUID = 1L;
                @Override
                public Tuple2<Double, Double> call(LabeledPoint v1) throws Exception {
                    Double p = v1.label();
                    Double q = regmodel.predict(v1.features());
                    return new Tuple2<Double, Double>(p,q);
                }
            });