java—spark作业之间的巨大时间间隔

py49o6xq  于 2021-05-19  发布在  Spark
关注(0)|答案(1)|浏览(484)

我创建并持久化一个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个内核,24gbram)和一个主线程(15gbram)。spark.shuffle.partitions也是192。它挂了两个小时什么也没发生。spark ui中没有任何活动项。为什么挂这么久?它是达格吗?我怎么查?如果你需要更多的信息,请告诉我。
----编辑1----
在等待了将近两个小时之后,它继续进行,然后最终失败了。以下是spark ui中的“阶段”和“执行者”选项卡:


另外,在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\u err\u pid11877”的文件,上面写着:
内存不足,java运行时环境无法继续。本机内存分配(mmap)Map6434586624字节以提交保留内存失败。可能的原因:系统的物理ram或交换空间不足进程在启用压缩的情况下运行,java堆可能会阻碍本机堆的增长可能的解决方案:减少系统上的内存负载增加物理内存或交换空间检查交换备份存储是否已满减少java堆大小(-xmx/-xms)减少java线程数减少java线程堆栈大小(-xss)设置更大的代码缓存-xx:reservedcodecachesize=jvm以基于零的压缩oops模式运行,在这种模式下,java堆被放置在第一个32gb地址空间中。java堆基址是本机堆增长的最大限制。请使用-xx:heapbaseminaddress设置java堆基,并将java堆置于32gb虚拟地址之上。此输出文件可能被截断或不完整。内存不足错误(os\ U linux)。cpp:2792),pid=11877,tid=0x00007f237c1f8700 jre版本:openjdk运行时环境(8.0\u 265-b01)(内部版本1.8.0\u 265-8u265-b01-0ubuntu2~18.04-b01)java vm:openjdk 64位服务器vm(25.265-b01混合模式linux-amd64压缩oops)无法写入内核转储。核心转储已被禁用。要启用核心转储,请在再次启动java之前尝试“ulimit-c unlimited”
…以及其他关于它失败的任务的信息,gc信息等。。
----编辑2----
这里是最后一个透视图的任务部分(stages图片中id为16的stage)。。就在绞刑前。似乎所有192个分区的数据量都相当相等,从15到20mb。

8fsztsew

8fsztsew1#

pivot 在spark中,生成一个额外的阶段来获取pivot值,这在水下发生,可能需要一些时间,并且取决于资源的分配方式等。

相关问题