我的应用程序使用Apache Spark进行后台数据处理,使用Play Framework作为前端界面。
在Scala应用程序中使用Play Framework将其与TypeSafe激活器一起使用的最佳方法。
现在,问题在于我想将此应用程序部署到spark集群。
关于一个人如何使用spark-submit
将SBT应用程序部署到集群,有很好的文档,但是如何处理基于激活器的应用程序?
请注意,我了解如何使用this link激活器使用Spark,我的问题是关于在群集上部署应用程序,例如EC2等。
顺便说一下,应用程序是用Scala编写的。
我愿意接受诸如解耦两个应用程序并允许它们进行交互的建议。除非我不知道如何做到这一点,所以如果您建议非常感谢参考文献。
更新
我尝试在激活器项目中向build.sbt
文件添加依赖项,但我收到以下错误:
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[error] impossible to get artifacts when data has not been loaded. IvyNode = org.slf4j#slf4j-api;1.6.1
[trace] Stack trace suppressed: run last *:update for the full output.
[error] (*:update) java.lang.IllegalStateException: impossible to get artifacts when data has not been loaded. IvyNode = org.slf4j#slf4j-api;1.6.1
以下是我在build.sbt文件中添加依赖项的方法:
// All the apache spark dependencies
libraryDependencies ++= Seq(
"org.apache.spark" % "spark-core_2.10" % sparkVersion % "provided" withSources(),
"org.apache.spark" % "spark-sql_2.10" % sparkVersion % "provided" withSources(),
"org.apache.spark" % "spark-streaming_2.10" % sparkVersion % "provided" withSources(),
"org.apache.spark" % "spark-mllib_2.10" % sparkVersion % "provided" withSources()
)
和解析器:
// All the Apache Spark resolvers
resolvers ++= Seq(
"Apache repo" at "https://repository.apache.org/content/repositories/releases",
"Local Repo" at Path.userHome.asFile.toURI.toURL + "/.m2/repository", // Added local repository
Resolver.mavenLocal )
任何解决方法?
答案 0 :(得分:1)
激活者只是有三个变化:
所以你读到的关于sbt的一切都适用。如果你愿意,你也可以在项目中使用sbt,但除非你使用“new”或“ui”,否则它是一样的
你的问题的简短回答可能是使用sbt-native-packager插件及其“阶段”任务;播放文档有一个描述这个的部署部分。
答案 1 :(得分:0)
事实证明,Play框架和Apache Spark的一个问题是依赖冲突,可以通过从Spark依赖列表中排除依赖关系来轻松解决。
// All the apache spark dependencies
libraryDependencies ++= Seq(
"org.apache.spark" % "spark-core_2.10" % sparkVersion % "provided" withSources() excludeAll(
ExclusionRule(organization = "org.slf4j")
),
"org.apache.spark" % "spark-sql_2.10" % sparkVersion % "provided" withSources(),
"org.apache.spark" % "spark-streaming_2.10" % sparkVersion % "provided" withSources(),
"org.apache.spark" % "spark-mllib_2.10" % sparkVersion % "provided" withSources()
)
此外,要在控制台中使用,可以轻松地将以下内容添加到build.sbt
文件中,以便直接导入基本的spark包。
/// console
// define the statements initially evaluated when entering 'console', 'consoleQuick', or 'consoleProject'
// but still keep the console settings in the sbt-spark-package plugin
// If you want to use yarn-client for spark cluster mode, override the environment variable
// SPARK_MODE=yarn-client <cmd>
val sparkMode = sys.env.getOrElse("SPARK_MODE", "local[2]")
initialCommands in console :=
s"""
|import org.apache.spark.SparkConf
|import org.apache.spark.SparkContext
|import org.apache.spark.SparkContext._
|
|@transient val sc = new SparkContext(
| new SparkConf()
| .setMaster("$sparkMode")
| .setAppName("Console test"))
|implicit def sparkContext = sc
|import sc._
|
|@transient val sqlc = new org.apache.spark.sql.SQLContext(sc)
|implicit def sqlContext = sqlc
|import sqlc._
|
|def time[T](f: => T): T = {
| import System.{currentTimeMillis => now}
| val start = now
| try { f } finally { println("Elapsed: " + (now - start)/1000.0 + " s") }
|}
|
|""".stripMargin
cleanupCommands in console :=
s"""
|sc.stop()
""".stripMargin
现在,主要问题是应用程序的部署。通过运行play框架,在集群上启动多个节点的应用程序很麻烦,因为HTTP请求处理程序必须具有一个特定的URL。 可以通过在主节点上启动Play Framework实例并将URL指向其IP来解决此问题。