我是Spark的初学者,我正在运行我的应用程序从文本字段中读取14KB数据,执行一些转换和操作(收集,收集地图)并将数据保存到数据库
我在我的macbook中本地运行16G内存,有8个逻辑内核。
Java Max堆设置为12G。
这是我用来运行应用程序的命令。
bin / spark-submit --class com.myapp.application --master local [*] - executor-memory 2G --driver-memory 4G /jars/application.jar
我收到以下警告
2017-01-13 16:57:31.579 [Executor task launch worker -8hread] WARN org.apache.spark.storage.MemoryStore - 没有足够的空间来缓存 rdd_57_0在内存中! (到目前为止计算的26.4 MB)
任何人都可以指导我这里出了什么问题,如何提高性能?还有如何优化漏斗?以下是我本地系统中发生的泄漏的视图
答案 0 :(得分:6)
运行内存过多的执行程序通常会导致过多的垃圾回收延迟。分配更多内存并不是神的想法。由于你只有14KB数据2GB执行器内存和4GB驱动程序内存绰绰有余。没有使用分配这么多的内存。你可以用100MB的内存来运行这个工作,性能会比2GB更好。
在运行应用程序时,驱动程序内存更有用,在纱线群集模式下,因为应用程序主机运行驱动程序。在这里,您以本地模式运行应用程序driver-memory
不是必需的。您可以从作业中删除此配置。
在您的应用程序中,您已分配
Java Max heap is set at: 12G.
executor-memory: 2G
driver-memory: 4G
总内存分配= 16GB,而你的macbook只有16GB内存。 在这里,您已将总RAM内存分配给spark应用程序。
这不好。操作系统本身消耗大约1GB内存,您可能运行其他也消耗RAM内存的应用程序。所以在这里你实际上分配了更多的内存。这是您的应用程序抛出错误Not enough space to cache the RDD
executor-memory 1G
或更少driver-memory
。提交你的工作。它会顺利运行。
如果您非常希望了解火花记忆管理技术,请参阅这篇有用的文章。
答案 1 :(得分:-1)
在本地模式下,您不需要指定master,使用默认参数就可以了。 官方网站称,“Spark的bin目录中的spark-submit脚本用于在集群上启动应用程序。它可以通过统一的界面使用Spark支持的所有集群管理器,因此您不必为每个集成管理器专门配置应用程序。一个。“。所以你最好在群集中使用spark-submit,在本地你可以使用spark-shell。