使用Spark配置Java堆空间

时间:2015-02-12 04:03:29

标签: java scala hadoop apache-spark

我正在尝试通过对spark中的小数组进行过采样来创建一个包含几百兆字节的文件,并将其作为目标文件另存为spark-ec2脚本创建的hdfs系统:

//Accepted arguments
val URI = args(0)
val repNum = args(1).toInt

//Create a LabeledPoint array of size 2
val labelPts = sc.parallelize(Array(LabeledPoint(1.0, Vectors.dense(1.0, 0.0, 3.0, 4.0, 5.0, 7.0, 8.0)),
  LabeledPoint(1.0, Vectors.dense(3.0, 1.0, 2.0, 8.0, 6.0, 9.0, 9.0))))

//Oversampling repNum LabeledPoints from the array above
val overSample = labelPts.takeSample(true, repNum, 1)

//output oversampling result as object
sc.parallelize(overSample).saveAsObjectFile(URI)

群集由脚本创建:

spark-ec2 -k spark -i ~/.ssh/spark.pem -s 1 launch my-spark-cluster

我的捆绑火花应用程序由脚本提交:

./spark-submit \
--class SimpleApp \
--master spark://ec2-52-1-94-89.compute-1.amazonaws.com:7077 \
--executor-memory=4g \
--driver-memory=4g \
--conf spark.akka.frameSize=10000 \
--conf spark.core.connection.auth.wait.timeout=1000 \
~/oversample-assembly-1.0.jar \
hdfs://ec2-52-1-94-89.compute-1.amazonaws.com:9000/user/root/oversampleOut \
70000000

然后抛出EXCEPTION: java.lang.OutOfMemoryError: Java heap space。我不知道它有什么问题,因为如果我的repNum设置为6000000,则没有错误,输出文件大约是490m,所以我怀疑java堆空间仍然是512m的上限,但是我已设置--executor-memory=4g,此群集中的工作节点具有7.5GB内存。这有什么问题?

1 个答案:

答案 0 :(得分:0)

您可以使用sparks run time选项spark.executor.extraJavaOptions提供额外的java选项,还可以使用spark.storage.memoryFraction减少用于缓存的内存,详情请参阅link