gpt4 book ai didi

scala - 如何在 Play 框架的生产模式中包含文件

转载 作者:行者123 更新时间:2023-12-04 13:59:50 25 4
gpt4 key购买 nike

我的环境概述:
Mac OS Yosemite,Play 框架 2.3.7,sbt 0.13.7,Intellij Idea 14,java 1.8.0_25

我尝试在 Play 框架中运行一个简单的 Spark 程序,所以我只是在 Intellij 中创建了一个 Play 2 项目,并更改了一些文件如下:

应用程序/ Controller /Application.scala:

package controllers

import play.api._
import play.api.libs.iteratee.Enumerator
import play.api.mvc._

object Application extends Controller {

def index = Action {
Ok(views.html.index("Your new application is ready."))
}

def trySpark = Action {
Ok.chunked(Enumerator(utils.TrySpark.runSpark))
}

}

应用程序/实用程序/TrySpark.scala:
package utils

import org.apache.spark.{SparkContext, SparkConf}

object TrySpark {
def runSpark: String = {
val conf = new SparkConf().setAppName("trySpark").setMaster("local[4]")
val sc = new SparkContext(conf)
val data = sc.textFile("public/data/array.txt")
val array = data.map ( line => line.split(' ').map(_.toDouble) )
val sum = array.first().reduce( (a, b) => a + b )
return sum.toString
}
}

公共(public)/数据/array.txt:
1 2 3 4 5 6 7

配置/路由:
GET        /                    controllers.Application.index

GET /spark controllers.Application.trySpark

GET /assets/*file controllers.Assets.at(path="/public", file)

构建.sbt:
name := "trySpark"

version := "1.0"

lazy val `tryspark` = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "2.10.4"

libraryDependencies ++= Seq( jdbc , anorm , cache , ws,
"org.apache.spark" % "spark-core_2.10" % "1.2.0")

unmanagedResourceDirectories in Test <+= baseDirectory ( _ /"target/web/public/test" )

我输入 activator run要在开发模式下运行此应用程序,然后键入 localhost:9000/spark在浏览器中显示结果 28正如预期的那样。但是,当我想输入 activator start要在生产模式下运行此应用程序,它会显示以下错误消息:
[info] play - Application started (Prod)
[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000
[error] application -

! @6kik15fee - Internal server error, for (GET) [/spark] ->

play.api.Application$$anon$1: Execution exception[[InvalidInputException: Input path does not exist: file:/Path/to/my/project/target/universal/stage/public/data/array.txt]]
at play.api.Application$class.handleError(Application.scala:296) ~[com.typesafe.play.play_2.10-2.3.7.jar:2.3.7]
at play.api.DefaultApplication.handleError(Application.scala:402) [com.typesafe.play.play_2.10-2.3.7.jar:2.3.7]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$14$$anonfun$apply$1.applyOrElse(PlayDefaultUpstreamHandler.scala:205) [com.typesafe.play.play_2.10-2.3.7.jar:2.3.7]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$14$$anonfun$apply$1.applyOrElse(PlayDefaultUpstreamHandler.scala:202) [com.typesafe.play.play_2.10-2.3.7.jar:2.3.7]
at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:33) [org.scala-lang.scala-library-2.10.4.jar:na]
Caused by: org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: file:/Path/to/my/project/target/universal/stage/public/data/array.txt
at org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:251) ~[org.apache.hadoop.hadoop-mapreduce-client-core-2.2.0.jar:na]
at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:270) ~[org.apache.hadoop.hadoop-mapreduce-client-core-2.2.0.jar:na]
at org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:201) ~[org.apache.spark.spark-core_2.10-1.2.0.jar:1.2.0]
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:205) ~[org.apache.spark.spark-core_2.10-1.2.0.jar:1.2.0]
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:203) ~[org.apache.spark.spark-core_2.10-1.2.0.jar:1.2.0]

看来我的 array.txt文件未在生产模式下加载。如何解决这个问题?

最佳答案

这里的问题是 public当您在生产中运行时,您的根项目目录中的目录将不可用。它被打包为一个 jar(通常在 STAGE_DIR/lib/PROJ_NAME-VERSION-assets.jar 中),因此您将无法通过这种方式访问​​它们。

我可以在这里看到两个解决方案:

1) 将文件放在conf目录。这会起作用,但看起来很脏,特别是如果您打算使用更多数据文件;

2) 将这些文件放在某个目录中,并告诉 sbt 也将其打包。您可以继续使用 public目录虽然使用不同的目录似乎更好,特别是如果您想要更多的文件。

假设 array.txt被放置在一个名为 datafiles 的目录中在您的项目根目录中,您可以将其添加到 build.sbt :

mappings in Universal ++=
(baseDirectory.value / "datafiles" * "*" get) map
(x => x -> ("datafiles/" + x.getName))

不要忘记更改应用代码中的路径:
// (...)
val data = sc.textFile("datafiles/array.txt")

然后做一个干净的,当你运行 start , stagedist这些文件将可用。

关于scala - 如何在 Play 框架的生产模式中包含文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27632038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com