Java - Apache Spark通信

时间:2015-06-05 20:32:15

标签: java apache-spark

我对Spark很新,并且正在寻找一些指导: - )

Java MVC应用程序与Spark通信的典型方式是什么?为简化起见,假设我想计算某个文件中的单词,该文件的名称是通过GET请求提供给我的服务器的。

我最初的方法是打开上下文并在我的MVC应用程序内的类中实现转换/计算。这意味着在运行时我将不得不想出一个极好的火花核心罐。问题是:

也许Maven中的“提供”范围对我有帮助,但我正在使用蚂蚁。

我的应用程序 - 如页面中所建议的 - 已经有一个带有实现的jar(没有任何spark库),并且每次收到请求时都使用spark-submit。我想这会把结果留在某处。

我是否错过任何中途方法?

2 个答案:

答案 0 :(得分:2)

每次使用spark-submit都是一种沉重的重量,我建议使用某种长期运行的Spark Context。我认为您可能寻找的“中间路线”选项是让您的工作使用类似于IBM Spark Kernel,Zepplin或Ooyala的Spark Job Server。

答案 1 :(得分:2)

使用部署在Spark顶层的中间件服务有一个很好的做法,它管理它的上下文,工作失败引发了许多需要考虑的因素。

我会推荐Mist。它实现了Spark as a Service,并创建了一个统一的API层,用于在Big Data湖上构建企业解决方案和服务。

Mist支持Scala和Python作业执行。

快速入门如下:

  1. 将Mist包装器添加到Spark作业中:
    Scala示例:

    object SimpleContext extends MistJob {
        override def doStuff(context: SparkContext, parameters: Map[String, Any]): Map[String, Any] = {
            val numbers: List[BigInt] = parameters("digits").asInstanceOf[List[BigInt]]
            val rdd = context.parallelize(numbers)
            Map("result" -> rdd.map(x => x * 2).collect())
        }
    }
    

    Python示例:

    import mist
    class MyJob:
        def __init__(self, job):
            job.sendResult(self.doStuff(job))
        def doStuff(self, job):
            val = job.parameters.values()
            list = val.head()
            size = list.size()
            pylist = []
            count = 0
            while count < size:
                pylist.append(list.head())
                count = count + 1
                list = list.tail()
            rdd = job.sc.parallelize(pylist)
            result = rdd.map(lambda s: 2 * s).collect()
            return result
    
    if __name__ == "__main__":
        job = MyJob(mist.Job())
    
  2. 运行Mist服务:

    构建迷雾

    git clone https://github.com/hydrospheredata/mist.git
    cd mist
    ./sbt/sbt -DsparkVersion=1.5.2 assembly # change version according to your installed spark
    

    创建配置文件

    mist.spark.master = "local[*]"
    mist.settings.threadNumber = 16
    
    mist.http.on = true
    mist.http.host = "0.0.0.0"
    mist.http.port = 2003
    
    mist.mqtt.on = false
    
    mist.recovery.on = false
    
    mist.contextDefaults.timeout = 100 days
    mist.contextDefaults.disposable = false
    
    mist.contextDefaults.sparkConf = {
        spark.default.parallelism = 128
        spark.driver.memory = "10g"
        spark.scheduler.mode = "FAIR"
    }
    

    运行

    spark-submit    --class io.hydrosphere.mist.Mist \
                    --driver-java-options "-Dconfig.file=/path/to/application.conf" \ target/scala-2.10/mist-assembly-0.2.0.jar
    
  3. 尝试终端卷曲:

    curl --header "Content-Type: application/json" -X POST http://192.168.10.33:2003/jobs --data '{"jarPath":"/vagrant/examples/target/scala-2.10/mist_examples_2.10-0.2.0.jar", "className":"SimpleContext$","parameters":{"digits":[1,2,3,4,5,6,7,8,9,0]}, "external_id":"12345678","name":"foo"}'