- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定一个简单的案例类
case class Rating(user: Int, item: Int, rating: Double)
和两个RDD[Rating]
:我们得到的 OOME 在两个 RDD 之间有大约 700 万个条目。
我们配置了一个具有 30.4GB RAM 的单个执行器。对于每个 Rating
条目来说,这是一个巨大的开销。我无法证明这一点:Int 和 Double 的原始原语在 64 位平台上是 8 个字节。那么同样的 Java 表示以及 Case 类都会有开销。但总而言之,对于 JVM 中的单个 Rating
条目,我们仍然应该小于 200 字节。
假设有 30.4GB RAM 和 7M 对象 - 那么每个对象的表观内存使用量将超过4KB。那不计算。
这里是集群和作业信息,显示单个执行器有 30.4GB:
请注意,我们还通过在 KryoSerializer
中注册 Rating
类来启用 kryo
序列化并启用
spark.rdd.compress=true
这些并没有影响 OOME。
RDD
表示形式是否会使内存使用量膨胀得更多?或者问题是大多数执行器 RAM 根本没有被用于此目的 - 并且 OOME 是由于其他原因而发生的?
这是最终的 OOME - 它在作业开始几秒钟后发生:
[Dec 06 22:37:32] Generated an implicit feedback dataset with 4501305 ratings for training and 2247105 for test.
Generated dataset in 2644ms
[Stage 0:> (0 + 1) / 2]Exception in thread "dispatcher-event-loop-5" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2271)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
at java.io.ObjectOutputStream$BlockDataOutputStream.write(ObjectOutputStream.java:1852)
at java.io.ObjectOutputStream.write(ObjectOutputStream.java:708)
at java.nio.channels.Channels$WritableByteChannelImpl.write(Channels.java:458)
at org.apache.spark.util.SerializableBuffer$$anonfun$writeObject$1.apply(SerializableBuffer.scala:49)
at org.apache.spark.util.SerializableBuffer$$anonfun$writeObject$1.apply(SerializableBuffer.scala:47)
at org.apache.spark.util.Utils$.tryOrIOException(Utils.scala:1219)
at org.apache.spark.util.SerializableBuffer.writeObject(SerializableBuffer.scala:47)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1495)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
at org.apache.spark.serializer.JavaSerializationStream.writeObject(JavaSerializer.scala:44)
at org.apache.spark.serializer.JavaSerializerInstance.serialize(JavaSerializer.scala:101)
at org.apache.spark.scheduler.cluster.CoarseGrainedSchedulerBackend$DriverEndpoint$$anonfun$launchTasks$1.apply(CoarseGrainedSchedulerBackend.scala:226)
at org.apache.spark.scheduler.cluster.CoarseGrainedSchedulerBackend$DriverEndpoint$$anonfun$launchTasks$1.apply(CoarseGrainedSchedulerBackend.scala:225)
at scala.collection.immutable.List.foreach(List.scala:318)
at org.apache.spark.scheduler.cluster.CoarseGrainedSchedulerBackend$DriverEndpoint.launchTasks(CoarseGrainedSchedulerBackend.scala:225)
at org.apache.spark.scheduler.cluster.CoarseGrainedSchedulerBackend$DriverEndpoint.org$apache$spark$scheduler$cluster$CoarseGrainedSchedulerBackend$DriverEndpoint$$makeOffers(CoarseGrainedSchedulerBackend.scala:196)
at org.apache.spark.scheduler.cluster.CoarseGrainedSchedulerBackend$DriverEndpoint$$anonfun$receive$1.applyOrElse(CoarseGrainedSchedulerBackend.scala:123)
注意:如果我们使用稍微少的数据 - 例如具有 500 万个 Rating
的 RDD
则作业可以相对较快(< 40 秒)成功完成。
因此,我们不确定哪些因素将 Spark Worker 的实用性限制在如此低的内存限制范围内。
最佳答案
问题的较大部分似乎是 DRIVER
程序需要的 RAM 比预期多得多。
驱动程序不执行任何 collect
、take
、groupBy
等操作,而仅执行 count
的操作。不确定为什么 count
需要驱动程序上的大量资源。当我们缩小驱动程序详细信息时,将在此处添加更多详细信息。
关于scala - 小数据大小与可用内存的执行程序 OutOfMemoryExceptions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41021362/
我是 Haskell 世界的新手,我编译了一个简单的 exe.program main = do putStrLn "Hello, what's your name?" name
我正在使用 JUnit,现在我想在运行测试之前执行 Java 程序(主方法)。 即在我的项目中,我有一个包含一个具有 main 方法的类的包。我想在运行测试之前运行它(可能在一个单独的进程中),因为被
我的代码是: char* arg_list[] = { "gnuplot", "gnuplot_script.sh", NULL }; printf("Ready %s %s\n", arg_list
exec() 似乎在服务器上启用(function_exists('exec') 返回 true,并且命令未在 'disable_functions' 变量中列出)但我们得到 警告:出于安全原因,ex
我想从 Adobe AIR 应用程序中按下一个按钮并执行一些已安装的程序。例如,我会有一个名为“Start Winamp”的按钮。当按下它时,它应该直接启动 Winamp.exe...我不想执行一
我学习 CS 有一段时间了,似乎我(或我的许多 friend )从来不了解在制作、安装等方面幕后发生的事情。 纠正我,但是 make 是一种编译一组文件的方法吗? 在 Windows 上“将程序安装到
如何执行 MemoryStream 中的程序,这样我就不必先将它保存到硬盘上。该文件可能不会临时保存到硬盘。该程序必须在内存中 100% 正常运行。 static string s
我使用了一个程序(在 Windows 上),我不会透露其名称,它可以从命令行打开而无需通过任何身份验证。我正在尝试创建一些安全措施以防止其他人以这种方式访问它。 我计划用批处理文件替换这个程序的内
我正在开发一个 Web 应用程序,但我陷入了困境: 我想创建一个简单的标签来触发本地程序的执行如gedit、mozilla firefox等 我的项目基于 HTML、Javascript 和 PHP。
我有一个 C++ 程序需要 root 权限才能执行某些功能。如果我在 su 模式下运行编译后的代码,例如 linux-c5b6:/home/suman # 它满足了我的要求,但是在运行时我想检查我的进
我正在创建一个 shell 副本,但在执行自制程序时遇到了问题。我的意思是,当我想执行诸如 java、ls、wc 等之类的东西时,一切都很好......已经存在于路径变量。 现在我希望能够执行“myl
我试图让一些值显示在电子墨水显示器上(通过 SPI)。我已经编写了软件来初始化显示并显示作为命令行参数传递的值。问题是,由于电子墨水技术,显示需要几秒钟才能完全实现,所以此时显示程序也在运行。 另一个
所以我在 Oracle 11g 上创建了以下过程: create or replace PROCEDURE calc_fee (proc_borrowed_date IN Borrowing.borr
我想让 Maven 目标触发 java 类的执行。我正在尝试使用以下行迁移 Makefile: neotest: mvn exec:java -Dexec.mainClass="org.dha
我想用 os.system 运行命令,但出现错误 c:/fe ' is not recognized as an internal or external command, operable prog
我将Spark 1.5.2用于Spark Streaming应用程序。 Web UI的“执行者”选项卡中的存储内存是什么?如何达到530 MB?如何更改该值? 最佳答案 小心:您使用的非常,非常老旧且
我正在阅读 GitLab CI Multirunner documentation它介绍了如何设置 GitLab CI Multirunner 执行器,但我似乎无法在文档或在线搜索中找到有关更改初始设
我是 C 编程新手。我正在尝试使用 fork()、exec() 和 waitpid() 运行由用户指定的路径给出的程序命令。我已经尝试让它正确运行几个小时了,但我不断收到错误,我不知道如何排除故障,一
我是 Java 和 Selenium 的初学者,我在工作时遇到了 JavascriptExecutor。 想知道:虽然 Remote webdriver 和 Firefox driver 实现了 ja
我正在尝试通过 linux c++ 中的邮件命令发送电子邮件,但 execl 导致错误。 如何使用 exec 发送此命令? /bin/echo llol | /usr/bin/mail -s "tes
我是一名优秀的程序员,十分优秀!