scala - 如何在使用 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 的错误或我的代码错误?谢谢
解决方案
看起来 Spark 正在使用 Guava 14.0.1。gRPC-Java 需要 Guava 20 或更高版本。Spark 调用的方法是一个@Beta
API(不应该从库中使用),它在 2013 年 9 月发布的 Guava 15.0 中已弃用,并在 2014 年 4 月发布的 Guava 17.0 中删除。您需要提交问题针对 Spark 更新他们的代码以使用/支持更新版本的 Guava。
推荐阅读
- xslt - 使用 DeltaXML 进行比较时,将括号作为单词的一部分
- laravel - laravel 登录后重定向到原始路径(不使用 laravel make:auth)
- vba - VBA代码使用Excel中另一个子的密码
- python - Pandas 部分字符串匹配,包含反向
- javascript - 单击 Chrome 后会播放 Onmouseover 事件声音
- python - TensorFlow 检测 API 中的 SSD 锚点
- vba - ActiveDocument.Printout 问题
- javascript - 如何承诺不需要调用其回调的函数?
- qt - Qt:无法正确设置 qComboBox 的背景颜色
- ios - 动态更改线条颜色核心图