OutofMemoryErrory使用sbt assembly

时间:2015-06-17 22:44:44

标签: jar cassandra apache-spark sbt

我们正在尝试创建一个包含一个小scala源文件和大量依赖项的胖jar文件(使用spark和cassandra的简单mapreduce示例):

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import com.datastax.spark.connector._
import org.apache.spark.SparkConf

object VMProcessProject {

    def main(args: Array[String]) {
        val conf = new SparkConf()
            .set("spark.cassandra.connection.host", "127.0.0.1")
             .set("spark.executor.extraClassPath", "C:\\Users\\SNCUser\\dataquest\\ScalaProjects\\lib\\spark-cassandra-connector-assembly-1.3.0-M2-SNAPSHOT.jar")
        println("got config")
        val sc = new SparkContext("spark://US-L15-0027:7077", "test", conf)
        println("Got spark context")

        val rdd = sc.cassandraTable("test_ks", "test_col")

        println("Got RDDs")

        println(rdd.count())

        val newRDD = rdd.map(x => 1)
        val count1 = newRDD.reduce((x, y) => x + y)

    }
}

我们没有build.sbt文件,而是将jar放入src / main / scala目录中的lib文件夹和源文件,并使用sbt run运行。我们的assembly.sbt文件如下所示:

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.13.0")

当我们运行sbt程序集时,我们收到以下错误消息:

...
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: java heap space
    at java.util.concurrent...

我们不确定如何更改jvm设置以增加内存,因为我们使用sbt程序集来制作jar。此外,如果我们编写代码或构建项目的方式存在严重错误,那么我们也会帮助我们。试图建立一个基本的火花计划让人头疼不已!

4 个答案:

答案 0 :(得分:6)

我将spark作为非托管依赖项(将jar文件放在lib文件夹中)包含了大量内存,因为它是一个巨大的jar。

相反,我创建了一个build.sbt文件,其中包含spark作为提供的非托管依赖项 其次,我使用值JAVA_OPTS创建了环境变量-Xms256m -Xmx4g,它将最小堆大小设置为256兆字节,同时允许堆增长到最大大小为4千兆字节。这两个组合允许我使用sbt assembly

创建一个jar文件

有关提供的依赖项的更多信息:

https://github.com/sbt/sbt-assembly

答案 1 :(得分:5)

sbt本质上是一个java进程。您可以尝试调整OutOfMemory问题的sbt运行时堆大小。

对于0.13.x,sbt使用的默认内存选项是

-Xms1024m -Xmx1024m -XX:ReservedCodeCacheSize=128m -XX:MaxPermSize=256m

您可以通过执行类似

的操作来扩大堆大小
sbt -J-Xms2048m -J-Xmx2048m assembly

答案 2 :(得分:0)

我以前遇到过这个问题。对于我的环境,设置Java_ops不起作用。 我使用以下命令,它可以正常工作。

  1. 设置SBT_OPTS =“-Xmx4G”
  2. sbt程序集

没有内存不足的问题。

答案 3 :(得分:0)

这对我有用:

sbt -mem 2000 "set test in assembly := {}" assembly