如何将基于TypeSafe Activator的应用程序部署到Apache Spark集群?

时间:2015-03-17 12:01:52

标签: scala apache-spark typesafe-activator

我的应用程序使用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 )

任何解决方法?

2 个答案:

答案 0 :(得分:1)

激活者只是有三个变化:

  • 用于从模板创建项目的“新”命令
  • 用于打开教程UI的“ui”命令
  • 如果您单独键入“激活器”,则尝试猜测是否打开ui。强制命令行,使用“activator shell”

所以你读到的关于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来解决此问题。