首页 > 解决方案 > 如何在使用 grpc 依赖项时加载 spark ml 模型?

问题描述

我对负载火花模型有疑问。在不使用 gRPC 依赖项的情况下完全可以正常工作。

这是我的 main.scala

import org.apache.spark.ml.tuning.CrossValidatorModel
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.Row

    object lr_model {
    val spark = SparkSession.builder().appName("ml model").master("local[*]").getOrCreate();

    val model = CrossValidatorModel.load("C:/Users/.....................")
    def testing(subject:String):String = {
        val datatest = spark.createDataFrame(Seq(("CATEGORY_SOCIAL",subject))).toDF("labelss","subjects")
        var result = model.transform(datatest).head().getDouble(6)
        return result 
    }

    def main(args: Array[String]): Unit = {
        println(testing("aaaa"))    
        spark.stop()
    }
}

这是我的 build.sbt

scalaVersion := "2.11.7"

PB.targets in Compile := Seq(
  scalapb.gen() -> (sourceManaged in Compile).value
)

val scalapbVersion =
    scalapb.compiler.Version.scalapbVersion
val grpcJavaVersion =
    scalapb.compiler.Version.grpcJavaVersion

libraryDependencies ++= Seq(
    // spark
    "org.apache.spark" %% "spark-core" % "2.3.1" ,
    "org.apache.spark" %% "spark-sql" % "2.3.1" ,
    "org.apache.spark" %% "spark-mllib" % "2.3.1" ,

    // protobuf
    "com.thesamet.scalapb" %% "scalapb-runtime" % scalapbVersion % "protobuf"

    //for grpc
    //"io.grpc" % "grpc-netty" % grpcJavaVersion
    //"com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapbVersion
)

但是当我使用 gprc 依赖项时,会出现这样的错误。

18/07/18 12:59:08 INFO SparkContext: Created broadcast 0 from textFile at ReadWrite.scala:387
[error] (run-main-0) java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V from class org.apache.hadoop.mapred.FileInputFormat
java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V from class org.apache.hadoop.mapred.FileInputFormat
        at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:312)
        at org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:200)
        at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:253)
        at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:251)
        at scala.Option.getOrElse(Option.scala:121)
        at org.apache.spark.rdd.RDD.partitions(RDD.scala:251)
        at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35)

它来自 grpc 的错误或我的代码错误?谢谢

标签: scalaapache-sparkdependenciessbtgrpc

解决方案


看起来 Spark 正在使用 Guava 14.0.1。gRPC-Java 需要 Guava 20 或更高版本。Spark 调用的方法是一个@BetaAPI(不应该从库中使用),它在 2013 年 9 月发布的 Guava 15.0 中已弃用,并在 2014 年 4 月发布的 Guava 17.0 中删除。您需要提交问题针对 Spark 更新他们的代码以使用/支持更新版本的 Guava。


推荐阅读