Scala Spark 2.2在内存或工作线程较多的情况下失败,在内存和工作线程很少的情况下成功
我们在Scala中有一个Spark 2.2 job Write,它运行在一个纱线簇中,执行以下操作: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.
- --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.sql.shuffle.partitions
手动设置这些参数将禁用。试着别管它,因为它是推荐给初学者的。在您可以在PROD设置中微调集群大小之前,它对于实验也很有用
向Spark抛出更多内存/执行器似乎是一个好主意,但在您的情况下,这可能会导致额外的混乱和/或HDFS I/O吞吐量降低。这虽然有点过时,而且面向Cloudera用户,但它解释了如何通过正确调整执行器的大小来调整并行性。动态分配也会调整执行器内存?我认为这只是执行器的数量,每个执行器都有配置的内核和内存数量。无论如何,我现在正在运行一个测试,有两个执行器,每个执行器有30gb的ram,与每个执行器1gb的ram相比,速度非常慢。这就是你刚才提到的吞吐量下降吗?这是怎么发生的?