Scala Spark 2.2在内存或工作线程较多的情况下失败,在内存和工作线程很少的情况下成功

Scala Spark 2.2在内存或工作线程较多的情况下失败,在内存和工作线程很少的情况下成功,scala,apache-spark,memory,yarn,Scala,Apache Spark,Memory,Yarn,我们在Scala中有一个Spark 2.2 job Write,它运行在一个纱线簇中,执行以下操作: 将数千个小型压缩拼花文件(每个约15kb)读入两个数据帧 ​将数据帧连接到一列上 折叠所有列以清除某些数据 删除重复项 将结果数据帧写入拼花地板 下面的配置​ 通过java.lang.OutOfMemory java堆空间失败: ​--conf spark.warn.am.memory=4g --conf spark.executor.memory=20g --conf spark.warn.

我们在Scala中有一个Spark 2.2 job Write,它运行在一个纱线簇中,执行以下操作:

  • 将数千个小型压缩拼花文件(每个约15kb)读入两个数据帧
  • ​将数据帧连接到一列上
  • 折叠所有列以清除某些数据
  • 删除重复项
  • 将结果数据帧写入拼花地板
  • 下面的配置​ 通过java.lang.OutOfMemory java堆空间失败:

    • ​--conf spark.warn.am.memory=4g
    • --conf spark.executor.memory=20g
    • --conf spark.warn.executor.memoryOverhead=1g
    • --conf spark.dynamicAllocation.enabled=true
    • --conf spark.shuffle.service.enabled=true
    • --conf spark.dynamicAllocation.maxecutors=5
    • --conf spark.executor.cores=4
    • --conf spark.network.timeout=2000
    但是,如果我们完全删除spark.executor.memory,此作业将可靠地工作。这将为每个执行器提供1g的ram

    如果我们执行以下任一操作,此作业也会失败:

    • 增加遗嘱执行人
    • 增加默认并行性或spark.sql.shuffle.partitions
    有谁能帮我理解为什么更多的内存和更多的执行器会导致由于内存不足而导致作业失败?​


    手动设置这些参数将禁用。试着别管它,因为它是推荐给初学者的。在您可以在PROD设置中微调集群大小之前,它对于实验也很有用


    向Spark抛出更多内存/执行器似乎是一个好主意,但在您的情况下,这可能会导致额外的混乱和/或HDFS I/O吞吐量降低。这虽然有点过时,而且面向Cloudera用户,但它解释了如何通过正确调整执行器的大小来调整并行性。

    动态分配也会调整执行器内存?我认为这只是执行器的数量,每个执行器都有配置的内核和内存数量。无论如何,我现在正在运行一个测试,有两个执行器,每个执行器有30gb的ram,与每个执行器1gb的ram相比,速度非常慢。这就是你刚才提到的吞吐量下降吗?这是怎么发生的?