火花作业之间的巨大时间间隔

时间:2020-10-17 14:16:19

标签: java performance apache-spark time pivot

我创建并保留一个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 Ram)和一个主节点(具有15Gb Ram)。另外spark.shuffle.partitions是192。它挂起2个小时,没有任何反应。 Spark UI中没有任何活动。为什么挂了这么久?是DagScheduler吗?我该如何检查?如果您需要更多信息,请告诉我。

----编辑1 ----

等待近两个小时后,它继续进行,然后最终失败。以下是Spark UI的阶段和执行者选项卡: Stages Executors

此外,在worker节点的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 Runtime Environment继续运行。 本机内存分配(mmap)无法映射6434586624字节来提交保留的内存。 可能的原因: 系统没有物理RAM或交换空间 该进程在启用CompressedOops的情况下运行,并且Java Heap可能阻止了本机堆的增长 可能的解决方案: 减少系统上的内存负载 增加物理内存或交换空间 检查交换后备存储是否已满 减少Java堆大小(-Xmx / -Xms) 减少Java线程数 减少Java线程堆栈大小(-Xss) 使用-XX:ReservedCodeCacheSize =设置更大的代码缓存 JVM以基于零的压缩操作模式运行,在该模式下,Java堆位于 放置在前32GB地址空间中。 Java Heap基址是 本机堆增长的最大限制。请使用-XX:HeapBaseMinAddress 来设置Java Heap基础并将Java Heap放置在32GB以上的虚拟地址上。 该输出文件可能被截断或不完整。 内存不足错误(os_linux.cpp:2792),pid = 11877,tid = 0x00007f237c1f8700 JRE版本:OpenJDK运行时环境(8.0_265-b01)(内部版本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。

tasksSection

1 个答案:

答案 0 :(得分:0)

pivot在Spark中会生成一个额外的Stage,以获取枢轴值,该值发生在水下,可能需要一些时间,并取决于您的资源分配方式等。

相关问题