首页 文章

如何设置Apache Spark Executor内存

提问于
浏览
95

如何增加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 回答

  • 0

    你提到你在spark-shell上交互运行你的代码所以,如果没有为驱动程序内存或执行程序内存设置适当的值,那么spark默认为它分配一些值,这是基于它的属性文件(其中默认值是被提及) .

    我希望你知道有一个驱动程序(主节点)和工作节点( Actuator 被创建和处理)的事实,所以火花程序基本上需要两种类型的空间,所以如果你想设置驱动程序内存然后启动spark-shell .

    spark-shell --driver-memory“你的 Value ”并设置执行者内存:spark-shell --executor-memory“你的 Value ”

    那么我认为你可以选择你希望你的spark-shell使用的内存所需的值 .

  • 33

    显然,问题永远不会说本地模式而不是纱线 . 不知怎的,我无法让spark-default.conf改变工作 . 相反,我试过这个,它对我有用

    bin/spark-shell --master yarn --num-executors 6  --driver-memory 5g --executor-memory 7g
    

    (无法将执行程序内存减少到8g,因此纱线配置存在一些限制 . )

  • 0

    由于您在本地模式下运行Spark,因此您已经注意到设置 spark.executor.memory 将不会产生任何影响 . 原因是在启动 spark-shell 时启动的驱动程序JVM进程中的Worker "lives"和用于此的默认内存是 512M . 您可以通过将 spark.driver.memory 设置为更高的值来增加它,例如 5g . 你可以通过以下两种方式做到:

    • 在属性文件中设置它(默认为spark-defaults.conf),
    spark.driver.memory              5g
    
    • 或在运行时提供配置设置
    $ ./bin/spark-shell --driver-memory 5g
    

    请注意,这不能通过在应用程序中设置它来实现,因为到那时已经太晚了,该进程已经开始使用一些内存 .

    265.4 MB 的原因是Spark dedicates spark.storage.memoryFraction * spark.storage.safetyFraction占存储内存总量,默认情况下它们分别为0.6和0.9 .

    512 MB * 0.6 * 0.9 ~ 265.4 MB
    

    因此请注意,并非所有驱动程序内存都可用于RDD存储 .

    但是当你开始在集群上运行它时, spark.executor.memory 设置将在计算专用于Spark内存缓存的数量时接管 .

  • 2

    在spark / conf目录中创建一个名为spark-env.sh的文件并添加该行

    SPARK_EXECUTOR_MEMORY=2000m #memory size which you want to allocate for the executor
    
  • 2

    您可以使用以下示例构建命令

    spark-submit    --jars /usr/share/java/postgresql-jdbc.jar    --class com.examples.WordCount3  /home/vaquarkhan/spark-scala-maven-project-0.0.1-SNAPSHOT.jar --jar  --num-executors 3 --driver-memory 10g **--executor-memory 10g** --executor-cores 1  --master local --deploy-mode client  --name wordcount3 --conf "spark.app.id=wordcount"
    
  • 1

    您需要增加驱动程序内存 . 在Mac上(即在本地主服务器上运行时),默认驱动程序内存为1024M) . 默认情况下,380Mb被分配给执行者 .

    Screenshot

    增加[ --driver-memory 2G ]后,执行程序内存增加到~950Mb .
    enter image description here

  • 0

    根据驱动程序提供的指令运行spark任务需要Spark执行程序内存 . 基本上,它需要更多依赖于您提交的作业的资源 .

    Actuator 存储器包括执行任务所需的存储器加上开销存储器,其不应大于JVM和纱线最大容器尺寸的大小 .

    在spark-defaults.conf中添加以下参数

    spar.executor.cores=1
    
    spark.executor.memory=2g
    

    如果您使用任何群集管理工具(如 cloudera manageramabari ),请刷新群集配置以反映群集中所有节点的最新配置 .

    或者,我们可以将执行程序核心和内存值作为参数传递,同时运行 spark-submit 命令以及类和应用程序路径 .

    例:

    spark-submit \
    
      --class org.apache.spark.examples.SparkPi \
    
      --master yarn \
    
      --deploy-mode cluster \  # can be client for client mode
    
      --executor-memory 2G \
    
      --num-executors 5 \
    
      /path/to/examples.jar \
    
      1000
    
  • 150

    另请注意,对于本地模式,您必须在启动jvm之前设置驱动程序内存量:

    bin/spark-submit --driver-memory 2g --class your.class.here app.jar
    

    这将使用2G而不是默认的512M启动JVM .
    详情here

    对于本地模式,您只有一个执行程序,并且此执行程序是您的驱动程序,因此您需要设置驱动程序的内存 . *那就是说,在本地模式下,当你运行spark-submit时,一个JVM已经启动了默认的内存设置,所以在你的conf中设置“spark.driver.memory”实际上并不会为你做任何事情 . 相反,您需要按如下方式运行spark-submit

相关问题