【问题标题】:The actual executor memory does not match the executoy-memory I set实际的执行器内存与我设置的执行器内存不匹配
【发布时间】:2017-04-12 02:25:27
【问题描述】:

我有一个 spark2.0.1 集群,有 1 个 Master(slaver1) 和 2 个 worker(slaver2,slaver3),每台机器都有 2GB RAM。当我运行命令时 ./bin/spark-shell --master spark://slaver1:7077 --executor-memory 500m 当我检查网络中的执行程序内存时(slaver1:4040/executors/)。我发现它是110MB。

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    你说的内存是Storage memory 其实Spark把内存[称为Spark Memory]分为2个Region,第一是Storage Memory,第二是Execution Memory

    总内存可以用这个公式计算 (“Java Heap” – “Reserved Memory”) * spark.memory.fraction

    只是给你一个概述存储内存是这个池用于存储 Apache Spark 缓存数据和临时空间序列化数据“展开”。此外,所有“广播”变量都作为缓存块存储在那里

    如果您想检查总内存,您可以转到 Spark UI Spark-Master-Ip:8080[default port] 在开始时您可以找到名为 MEMORY 的部分,即 spark 使用的总内存。

    谢谢

    【讨论】:

    • 这个公式???Java Heap(500MB) * spark.memory.fraction(default 0.6) * spark.memory.storyfraction(default 0.5)=150MB
    • 这个公式??? [Java Heap(500MB)-Reserved Memory(300MB)]*spark.memory.fraction(default 0.5)=100MB ≈ 110MB 在我的问题中
    • 这个公式来自 spark 1.6 版,可能会有所改变
    • 你的回答对我很有帮助
    【解决方案2】:

    从Spark 1.6版本开始,内存按照下图划分

    执行和存储内存之间没有硬性界限。存储内存比执行内存需要的多,反之亦然。这 执行和存储内存由 (ExecutorMemory-300Mb)* spark.memory.fraction 给出

    在您的情况下 (500-300)*).75 = 150mb 分配的执行器内存中会有 3% 到 5% 的错误。

    300Mb 为预留内存

    用户内存 = (ExecutorMemory-300)*).(1-spark.memory.fraction)。

    在你的情况下 (500-300)*).25 = 50mb

    Java Memory : Runtime.getRuntime().maxMemory()

    【讨论】:

      猜你喜欢
      • 2015-05-18
      • 2017-12-08
      • 2016-11-15
      • 1970-01-01
      • 2020-12-02
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      • 1970-01-01
      相关资源
      最近更新 更多