【发布时间】:2021-01-31 19:39:12
【问题描述】:
我创建并保留了一个 df1,然后我在上面执行以下操作:
df1.persist (From the Storage Tab in spark UI it says it is 3Gb)
df2=df1.groupby(col1).pivot(col2) (This is a df with 4.827 columns and 40107 rows)
df2.collect
df3=df1.groupby(col2).pivot(col1) (This is a df with 40.107 columns and 4.827 rows)
-----it hangs here for almost 2 hours-----
df4 = (..Imputer or na.fill on df3..)
df5 = (..VectorAssembler on df4..)
(..PCA on df5..)
df1.unpersist
我有一个有 16 个节点的集群(每个节点有 1 个工作线程,有 1 个执行程序,4 个内核和 24Gb 内存)和一个主节点(15Gb 内存)。 spark.shuffle.partitions 也是 192。它挂了 2 个小时,没有任何反应。 Spark UI 中没有任何活动。为什么挂了这么久?是 DagScheduler 吗?我怎样才能检查它?如果您需要更多信息,请告诉我。
----已编辑 1----
在等待了将近两个小时后,它继续进行,然后最终失败。以下是 Spark UI 中的阶段和执行程序选项卡:
此外,在工作节点的 stderr 文件中它说:
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000003fe900000, 6434586624, 0) failed; error='Cannot allocate memory' (errno=12)
此外,似乎在stderr和stdout旁边的文件夹中生成了一个名为“hs_err_pid11877”的文件,上面写着:
Java 运行时环境的内存不足,无法继续。 本机内存分配 (mmap) 未能映射 6434586624 字节以提交保留内存。 可能的原因: 系统的物理 RAM 或交换空间不足 进程在启用 CompressedOops 的情况下运行,Java Heap 可能会阻止本机堆的增长 可能的解决方案: 减少系统上的内存负载 增加物理内存或交换空间 检查交换后备存储是否已满 减小 Java 堆大小 (-Xmx/-Xms) 减少 Java 线程数 减小 Java 线程堆栈大小 (-Xss) 使用 -XX:ReservedCodeCacheSize= 设置更大的代码缓存 JVM 以基于零的 Compressed Oops 模式运行,其中 Java 堆位于 放置在第一个 32GB 地址空间中。 Java 堆的基地址是 本机堆增长的最大限制。请使用 -XX:HeapBaseMinAddress 设置 Java 堆基数并将 Java 堆放置在 32GB 虚拟地址之上。 此输出文件可能被截断或不完整。 内存不足错误 (os_linux.cpp:2792), pid=11877, tid=0x00007f237c1f8700 JRE版本:OpenJDK Runtime Environment (8.0_265-b01) (build 1.8.0_265-8u265-b01-0ubuntu2~18.04-b01) Java VM:OpenJDK 64 位服务器 VM(25.265-b01 混合模式 linux-amd64 压缩 oops) 无法写入核心转储。核心转储已被禁用。要启用核心转储,请在再次启动 Java 之前尝试“ulimit -c unlimited”
...以及其他有关它失败的任务的信息,GC信息等..
----已编辑 2----
这是最后一个枢轴的任务部分(舞台图片中 id 为 16 的舞台).. 就在悬挂之前。似乎所有 192 个分区的数据量都差不多,从 15 到 20MB。
【问题讨论】:
-
您能否使用 Spark UI 中的任务详细信息更新您的问题?可能数据有偏差!从数据中提取一个小子样本并对其进行处理
-
非常感谢您的回答,尽管我不认为数据有偏差。我将上传阶段选项卡和执行程序选项卡。它完全适用于例如5.000 列(尽管它仍然在同一个位置挂起 10 分钟)。
-
我非常怀疑其中一个 groupby 会导致一些大分区和许多小分区,因此一些执行程序会承担繁重的工作,任务详细信息可能很有用,我的意思是任务详细信息“此mallikarjuna_g.gitbooks.io/spark/content/… 的“任务部分”
-
挂起通常发生在 spark 正在做一些元数据工作时。示例:当我尝试读取 90000 个文件时,它会挂起 15 分钟。在您的情况下,它也在尝试为即将到来的 Dataframe 创建一些元数据。 (4000 列:10 分钟,40000 列:100 分钟)。挂起与您的错误无关。但是,是的,这是不可取的。
-
您的两个错误都是 JVM 错误,应该还有另一个 Spark 输出错误,其堆栈跟踪可以提供更好的调试信息。但是,是的,它看起来像一个
oom问题。您使用的是哪个版本的火花?你在使用任何内存配置吗? @Des0lat0r
标签: java performance apache-spark time pivot