估计 Scala Spark 作业所需的内存
Estimating required memory for Scala Spark job
我正在尝试了解 Spark 作业需要多少内存。
当我 运行 作业时,我收到异常:
15/02/12 12:01:08 INFO rdd.HadoopRDD: Input split: file:/c:/data/example.txt:20661+20661
15/02/12 12:01:08 INFO rdd.HadoopRDD: Input split: file:/c:/data/example.txt:61983+20661
15/02/12 12:01:09 INFO rdd.HadoopRDD: Input split: file:/c:/data/example.txt:0+20661
15/02/12 12:01:09 INFO rdd.HadoopRDD: Input split: file:/c:/data/example.txt:61983+20661
15/02/12 12:01:09 INFO rdd.HadoopRDD: Input split: file:/c:/data/example.txt:41322+20661
15/02/12 12:01:09 INFO rdd.HadoopRDD: Input split: file:/c:/data/example.txt:20661+20661
15/02/12 12:01:11 ERROR executor.Executor: Exception in task 2.0 in stage 0.0 (TID 2)
java.lang.OutOfMemoryError: Java heap space
更多消息包含“15/02/12 12:01:08 信息 rdd.HadoopRDD:输入拆分:文件:/c:/data/example.txt:20661+20661”
已打印,只是 t运行为简洁起见将它们放在此处。
我正在记录计算,在大约 1'000'000 次计算后我收到上述异常。
完成作业所需的计算次数为 64'000'000
目前我使用的是 2GB 内存,所以这是否意味着 运行 内存中的这项工作不需要任何进一步的代码更改
2GB * 64 = 128GB 还是这种预测所需内存的方法过于简单?
每个拆分文件如“15/02/12 12:01:09 INFO rdd.HadoopRDD: Input split: file:/c:/data/example.txt:20661+20661”生成?这些未添加到文件系统,因为 "file:/c:/data/example.txt:20661+20661" 在本地计算机上不存在?
为了估算所需的内存量,我使用了这种方法:
使用http://code.google.com/p/memory-measurer/ as described at : Calculate size of Object in Java
设置完成后,可以使用以下代码估算 Scala 集合的大小,反过来这将指示 Spark 应用程序所需的内存:
object ObjectSizeDriver extends Application {
val toMeasure = List(1,2,3,4,5,6);
println(ObjectGraphMeasurer.measure(toMeasure));
println(MemoryMeasurer.measureBytes(toMeasure));
}
我正在尝试了解 Spark 作业需要多少内存。
当我 运行 作业时,我收到异常:
15/02/12 12:01:08 INFO rdd.HadoopRDD: Input split: file:/c:/data/example.txt:20661+20661
15/02/12 12:01:08 INFO rdd.HadoopRDD: Input split: file:/c:/data/example.txt:61983+20661
15/02/12 12:01:09 INFO rdd.HadoopRDD: Input split: file:/c:/data/example.txt:0+20661
15/02/12 12:01:09 INFO rdd.HadoopRDD: Input split: file:/c:/data/example.txt:61983+20661
15/02/12 12:01:09 INFO rdd.HadoopRDD: Input split: file:/c:/data/example.txt:41322+20661
15/02/12 12:01:09 INFO rdd.HadoopRDD: Input split: file:/c:/data/example.txt:20661+20661
15/02/12 12:01:11 ERROR executor.Executor: Exception in task 2.0 in stage 0.0 (TID 2)
java.lang.OutOfMemoryError: Java heap space
更多消息包含“15/02/12 12:01:08 信息 rdd.HadoopRDD:输入拆分:文件:/c:/data/example.txt:20661+20661” 已打印,只是 t运行为简洁起见将它们放在此处。
我正在记录计算,在大约 1'000'000 次计算后我收到上述异常。
完成作业所需的计算次数为 64'000'000
目前我使用的是 2GB 内存,所以这是否意味着 运行 内存中的这项工作不需要任何进一步的代码更改 2GB * 64 = 128GB 还是这种预测所需内存的方法过于简单?
每个拆分文件如“15/02/12 12:01:09 INFO rdd.HadoopRDD: Input split: file:/c:/data/example.txt:20661+20661”生成?这些未添加到文件系统,因为 "file:/c:/data/example.txt:20661+20661" 在本地计算机上不存在?
为了估算所需的内存量,我使用了这种方法:
使用http://code.google.com/p/memory-measurer/ as described at : Calculate size of Object in Java
设置完成后,可以使用以下代码估算 Scala 集合的大小,反过来这将指示 Spark 应用程序所需的内存:
object ObjectSizeDriver extends Application {
val toMeasure = List(1,2,3,4,5,6);
println(ObjectGraphMeasurer.measure(toMeasure));
println(MemoryMeasurer.measureBytes(toMeasure));
}