如果我理解正确,当reduce任务开始收集其输入shuffle块(来自不同map任务的输出)时,它首先将它们保存在内存中(Q1).当执行器的shuffle-reserved内存量(在内存管理(Q2)更改之前)耗尽时,内存中数据被"溢出"到磁盘.如果spark.shuffle.spill.compress为true,那么内存中的数据将以压缩方式写入磁盘.
我的问题:
问题:我的理解是否正确?
Q1:reduce任务中收集的数据是否始终未压缩?
Q2:如何估计可用于收集shuffle块的执行程序内存量?
问题3:我已经看到了"当你的数据集无法适应内存时发生随机溢出"的说法,但我的理解是,只要shuffle-reserved执行器内存大到足以包含所有(未压缩)的shuffle输入块ACTIVE任务,然后不应该发生溢出,这是正确的吗?
如果是这样,为了避免溢出,需要确保在所有并行reduce方面任务中结束的(未压缩)数据小于执行程序的shuffle-reserved内存部分?
我在scala 2.11.7上遇到了上述错误:
def main(args: Array[String]): Unit = {
val x = typeOf[ org.apache.hadoop.io.Writable ]
println( x )
}
Run Code Online (Sandbox Code Playgroud)
我的编译过程的其他信息:
我已经缩小到重现所需的最低限度:
我有一个build.gradle项目,如下所示:
buildscript {
repositories {
mavenCentral()
maven {
name 'Shadow'
url 'http://dl.bintray.com/content/johnrengelman/gradle- plugins'
}
}
dependencies {
classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.1'
}
}
apply plugin: 'com.github.johnrengelman.shadow'
apply plugin: 'scala'
repositories {
mavenCentral()
}
dependencies
{
compile group: 'org.scala-lang', name: 'scala-library', version: '2.11.7'
compile group: 'org.scala-lang', name: 'scala-reflect', version: '2.11.7'
compile( "org.apache.hadoop:hadoop-common:2.4.0" )
}
Run Code Online (Sandbox Code Playgroud)
这是我的主要内容:
import scala.reflect.runtime.universe._
object Test
{
def main(args: Array[String]): …Run Code Online (Sandbox Code Playgroud) 我的应用程序 Spark 2.0.0 在 yarn 2.7.2 上运行。它成功完成,但 Yarn 将其标记为失败并显示错误:
Final app status: FAILED, exitCode: 16, (reason: Shutdown hook called before final status was reported.)
Run Code Online (Sandbox Code Playgroud)
我在执行程序和驱动程序上都没有看到错误,应用程序写入了它应该写入的数据。