11

我是 Spark 的初学者,我正在运行我的应用程序以从文本文件中读取 14KB 数据,进行一些转换和操作(收集、收集AsMap)并将数据保存到数据库

我在具有 16G 内存和 8 个逻辑核心的 macbook 中本地运行它。

Java 最大堆设置为 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 [执行任务启动 worker-8hread] 警告 org.apache.spark.storage.MemoryStore - 没有足够的空间在内存中缓存 rdd_57_0!(目前计算为 26.4 MB)

谁能指导我这里出了什么问题以及如何提高性能?另外如何优化 suffle-spill ?这是我本地系统中发生的泄漏的视图

在此处输入图像描述

4

2 回答 2

13

运行内存过多的执行程序通常会导致过多的垃圾收集延迟。所以分配更多的内存不是一个好主意。由于您只有 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

  1. 将 Java 堆分配给 12 GB 是没有用的。您需要将其减少到 4GB 或更少。
  2. 将执行程序内存减少到executor-memory 1G或更少
  3. 由于您在本地运行,driver-memory请从您的配置中删除。

提交你的工作。它会顺利运行。

如果您非常热衷于了解 Spark 内存管理技术,请参阅这篇有用的文章。

Spark on yarn executor 资源分配

于 2017-01-14T03:26:51.513 回答
-2

在本地模式下,您不需要指定master,使用默认参数就可以了。官网表示,“Spark bin 目录下的 spark-submit 脚本用于在集群上启动应用程序。它可以通过统一的界面使用 Spark 支持的所有集群管理器,因此您不必为每个应用程序专门配置one.".所以你最好在集群中使用spark-submit,在本地你可以使用spark-shell。

于 2017-01-14T03:25:46.473 回答