任何将Scalatra与Spark集成的代码示例

时间:2014-07-25 22:56:21

标签: apache-spark scalatra

我是Scalatra的新手。我一直在试验Spark。我想将Spark与Scalatra Web界面集成。到目前为止,我找到了两个将Scalatra与Spark集成的代码示例。一个是来自Github(下面的链接),并且似乎没有遵循Scalatra的文档中的正常构建配置,因此我无法使用该模型创建新的Scalatra-Spark项目。

https://github.com/ytaras/scalate_spark

我自己尝试集成Simple Spark操作会出现以下错误:

org.eclipse.jetty.server.AbstractConnector: method <init>()V not found
java.lang.NoSuchMethodError: org.eclipse.jetty.server.AbstractConnector: method <init>()V not found

我抛出错误的代码:

import org.apache.spark._
import org.apache.spark.SparkContext._

import scala.math.random

/** Computes an approximation to pi */
object SparkPi {
    lazy val sc = new SparkContext("local", "Spark Pi")

    def calcPi(slices: Int = 2) {

        println("SparkPi.calcPi - sc: " + sc)
        val n = 100000 * slices

        val count = sc.parallelize(1 to n, slices).map { i =>
          val x = random * 2 - 1
          val y = random * 2 - 1
          if (x * x + y * y < 1) 1 else 0
        }.reduce(_ + _)

        println("Pi is roughly " + 4.0 * count / n)    
    }
}

我不确定如何最好地指出我的Scalatra项目结构,这对于任何试图帮助我解决此问题的人来说可能都非常重要。但我根据他们的文档使用正常的Scalatra项目创建。我通过正常的Scalatra Servlet路由调用此SparkPi类:

get("/pi") {
    calcPi()
}

2 个答案:

答案 0 :(得分:1)

当错误的jetty库被引用为依赖项时会发生这种情况。 Spark 1.1.0支持Jetty版本7。

build.scala文件中,jetty-webapp的依赖关系树可能会将org.eclipse.jetty:jetty-servlet程序集包含为7.6.9.v20130131以外的版本。 Spark 1.1.0依赖于此版本的jetty-servlet

此处的解决方案是为jetty-servlet jetty-webapp创建一个排除项,但这可能会导致应用程序中的其他问题。

答案 1 :(得分:0)

我遇到了与Spark 1.2.1和Scalatra 2.3.0相同的错误。我最终让Scalatra和Spark一起工作,我必须做以下事情:

  • 将Scala版本更改为2.10.4(project / build.scala中的第13行)。 Spark文档说&#34; Spark 1.2.0使用Scala 2.10。要在Scala中编写应用程序,您需要使用兼容的Scala版本(例如2.10.X)。&#34; 2.10.4是最新的2.10.X版本。
  • 将Jetty版本更改为8.1.14.v20131031(在build.scala的libraryDependencies部分中)。这是为了匹配Spark 1.2.1 Maven包中列出的Jetty依赖关系

......它有效!哇噢!

这是GitHub上的完整工作项目,它使用Scalatra定义了一个调用Spark代码的JSON REST API:

https://github.com/curran/scalatra-spark