我尝试使用scala执行小计算。我正在使用datastax-4.6。 我有6个节点,每个16GB RAM和8个核心。当我尝试exexute scala程序时,它会显示以下错误。
错误的ActorSystemImpl:来自线程[sparkDriver-akka.actor.default-dispatcher-17]的未捕获的致命错误关闭了ActorSystem [sparkDriver] java.lang.OutOfMemoryError:Java堆空间。我为每台机器分配了2个核心,执行器内存为4GB,驱动程序内存为4GB。有什么建议??。
答案 0 :(得分:1)
直接引用Russ's article on Common Spark Troubleshooting(你应该读它!):
Spark Executor OOM:
如何在Spark上设置内存参数一旦应用程序 正在运行下一个最可能出现的错误,你将会看到一个OOM 火花执行者。 Spark是一个非常强大的工具 内存计算,但它的功率带来一些尖锐的边缘。该 执行者OOM的最常见原因是应用程序是 试图缓存或加载太多信息到内存中。取决于 你的用例有几个解决方案:
1)增加工作的并行性。尝试增加数量 你工作中的分区。通过将工作分成更小的一组 数据较少的信息必须驻留在给定的内存中 时间。对于Spark Cassandra Connector作业,这意味着减少 分割大小变量。变量, spark.cassandra.input.split.size,可以在命令中设置 如上所述或在SparkConf对象中。 对于其他RDD类型看 进入他们的api以确定他们如何确定分区 尺寸。
2)增加存储分数变量, spark.storage.memoryFraction。这可以在上面的任何一个上设置 命令行或SparkConf对象。这个变量准确设置 JVM将用于缓存和存储多少 RDD的。您可以将其设置为0到1之间的值,描述什么 执行程序JVM内存的一部分将专用于缓存RDD。如果 你有一份工作需要很少的随机记忆,但会 利用大量缓存的RDD来增加这个变量(例如:缓存 然后RDD在其上执行聚合。)
3)如果一切都失败了,你可以 每个工人只需要额外的公羊。对于DSE用户,请调整您的 spark-env.sh(或DSE 4.6中的dse.yaml文件)文件以增加SPARK_MEM 保留给Spark工作。您需要重新启动工作人员 这些新的内存限制生效(dse sparkworker restart。)然后 通过设置增加应用程序请求的ram数量 spark.executor.memory变量,无论是在命令行还是在 SparkConf对象。