Spray,Slick,Spark - OutOfMemoryError:PermGen space

时间:2016-04-10 06:20:07

标签: scala apache-spark out-of-memory slick spray

我使用SpraySlick成功实现了一个简单的Web服务,该服务通过Spark ML预测管道传递传入的请求。在我尝试添加数据层之前,一切正常。我选择Slick似乎很受欢迎。

但是,我无法让它正常工作。我的大部分代码都基于Hello-Slick Activator Template。我像这样使用DAO对象:

object dataDAO {
  val datum = TableQuery[Datum]

  def dbInit = {
    val db = Database.forConfig("h2mem1")
    try {
      Await.result(db.run(DBIO.seq(
        datum.schema.create
      )), Duration.Inf)
    } finally db.close
  }

  def insertData(data: Data) = {
    val db = Database.forConfig("h2mem1")
    try {
      Await.result(db.run(DBIO.seq(
        datum += data,
        datum.result.map(println)
      )), Duration.Inf)
    } finally db.close
  }
}

case class Data(data1: String, data2: String)

class Datum(tag: Tag) extends Table[Data](tag, "DATUM") {
  def data1 = column[String]("DATA_ONE", O.PrimaryKey)
  def data2 = column[String]("DATA_TWO")
  def * = (data1, data2) <> (Data.tupled, Data.unapply)
}

我在Boot对象

中初始化我的数据库
object Boot extends App {
  implicit val system = ActorSystem("raatl-demo")
  Classifier.initializeData
  PredictionDAO.dbInit
  // More service initialization code ...
} 

我尝试在完成服务请求之前将记录添加到我的数据库

val predictionRoute = {
  path("data") {
    get {
      parameter('q) { query =>
        // do Spark stuff to get prediction
        DataDAO.insertData(data)
        respondWithMediaType(`application/json`) {
          complete {
            DataJson(data1, data2)
          }
       }
     }
   }
}

当我向我的服务发送请求时,我的应用程序崩溃

  

java.lang.OutOfMemoryError:PermGen space

我怀疑我是否错误地实施了Slick API。很难从文档中分辨出来,因为它将所有操作都填充到主方法中。

最后,我的conf与激活器ui相同

h2mem1 = {
  url = "jdbc:h2:mem:raatl"
  driver = org.h2.Driver
  connectionPool = disabled
  keepAliveConnection = true
}

之前有没有遇到过这个?我正在使用Slick 3.1

1 个答案:

答案 0 :(得分:3)

java.lang.OutOfMemoryError: PermGen space通常不会影响您的使用,这是oracle says about this

  

详细信息PermGen空间表示永久代已满。永久生成是堆的区域,其中存储类和方法对象。如果应用程序加载了大量类,则可能需要使用-XX:MaxPermSize选项增加永久代的大小。

我认为这不是因为Slick API的实现不正确。这可能是因为您正在使用多个框架来加载许多类。

您的选择是: