我有一个运行在EMR上的spark应用程序(16个节点,1个主,15个核心,r3.2xlarge实例)。对于spark执行器配置,我们使用动态分配。
在将数据加载到RDD时,我发现有时当有大量数据(700 Gb)时,Spark会耗尽内存,但它不会使应用程序失败。而是应用程序挂起。我不确定为什么会发生这种情况,但这是我的理论:-
- 我们使用的数据帧可能是缓存的东西。
- spark标志spark. dynamicallocation . cachedexecutoridletimeout设置为无穷大
我的理论是,它可能是缓存的东西,而创建数据框架,但缓存从来没有放弃,这导致Spark挂起。
有两个解
- 增加集群大小(最坏的情况)
- 想办法在Spark应用程序中添加超时
- 以编程方式终止EMR步骤(找不到这样做的API)
关于怎么做有什么建议吗?
还有两种可能。要么分区太大,要么有严重的偏度(分区的大小变化很大)。
尝试使用重分区来增加分区的数量(从而减小分区的大小)。这将在执行器中随机重新洗牌数据(有利于减少偏度,但速度较慢)。理想情况下,我希望我的分区大小在64Mo左右,这取决于您的机器。