如何增加Apache spark executor节点的可用内存?
我有一个2 GB的文件,适合加载到Apache Spark . 我正在1台机器上运行apache spark,所以驱动程序和执行程序在同一台机器上 . 该机器有8 GB的内存 .
当我在将文件设置为缓存在内存中后尝试计算文件的行时,我得到以下错误:
2014-10-25 22:25:12 WARN CacheManager:71 - Not enough space to cache partition rdd_1_1 in memory! Free memory is 278099801 bytes.
我查看了文档here并在 $SPARK_HOME/conf/spark-defaults.conf
中将 spark.executor.memory
设置为 4g
UI显示此变量在Spark环境中设置 . 你可以找到截图here
但是,当我转到Executor tab时,我的单个Executor的内存限制仍然设置为265.4 MB . 我还是得到了同样的错误 .
我尝试了here提到的各种事情,但我仍然得到错误,并且不清楚我应该在哪里更改设置 .
我正在从spark-shell以交互方式运行我的代码
8 回答
你提到你在spark-shell上交互运行你的代码所以,如果没有为驱动程序内存或执行程序内存设置适当的值,那么spark默认为它分配一些值,这是基于它的属性文件(其中默认值是被提及) .
我希望你知道有一个驱动程序(主节点)和工作节点( Actuator 被创建和处理)的事实,所以火花程序基本上需要两种类型的空间,所以如果你想设置驱动程序内存然后启动spark-shell .
spark-shell --driver-memory“你的 Value ”并设置执行者内存:spark-shell --executor-memory“你的 Value ”
那么我认为你可以选择你希望你的spark-shell使用的内存所需的值 .
显然,问题永远不会说本地模式而不是纱线 . 不知怎的,我无法让spark-default.conf改变工作 . 相反,我试过这个,它对我有用
(无法将执行程序内存减少到8g,因此纱线配置存在一些限制 . )
由于您在本地模式下运行Spark,因此您已经注意到设置
spark.executor.memory
将不会产生任何影响 . 原因是在启动 spark-shell 时启动的驱动程序JVM进程中的Worker "lives"和用于此的默认内存是 512M . 您可以通过将spark.driver.memory
设置为更高的值来增加它,例如 5g . 你可以通过以下两种方式做到:请注意,这不能通过在应用程序中设置它来实现,因为到那时已经太晚了,该进程已经开始使用一些内存 .
265.4 MB 的原因是Spark dedicates spark.storage.memoryFraction * spark.storage.safetyFraction占存储内存总量,默认情况下它们分别为0.6和0.9 .
因此请注意,并非所有驱动程序内存都可用于RDD存储 .
但是当你开始在集群上运行它时,
spark.executor.memory
设置将在计算专用于Spark内存缓存的数量时接管 .在spark / conf目录中创建一个名为spark-env.sh的文件并添加该行
您可以使用以下示例构建命令
您需要增加驱动程序内存 . 在Mac上(即在本地主服务器上运行时),默认驱动程序内存为1024M) . 默认情况下,380Mb被分配给执行者 .
增加[ --driver-memory 2G ]后,执行程序内存增加到~950Mb .
根据驱动程序提供的指令运行spark任务需要Spark执行程序内存 . 基本上,它需要更多依赖于您提交的作业的资源 .
Actuator 存储器包括执行任务所需的存储器加上开销存储器,其不应大于JVM和纱线最大容器尺寸的大小 .
在spark-defaults.conf中添加以下参数
如果您使用任何群集管理工具(如 cloudera manager 或 amabari ),请刷新群集配置以反映群集中所有节点的最新配置 .
或者,我们可以将执行程序核心和内存值作为参数传递,同时运行
spark-submit
命令以及类和应用程序路径 .例:
另请注意,对于本地模式,您必须在启动jvm之前设置驱动程序内存量:
这将使用2G而不是默认的512M启动JVM .
详情here: