当前位置: 首页 > 知识库问答 >
问题:

Pyspark作业因VCPU过多而冻结

云卓
2023-03-14

TLDR:我有一个pyspark作业,当我在具有16个vcpus的ec2实例中运行它时,它会在10分钟内完成,但如果我使用具有超过20个vcpus的实例,它会冻结(它不会失败,只是永远不会完成)。我已经尝试了我能想到的一切,我只是不知道为什么会发生这种情况。

完整故事:

我有大约200个小型pyspark作业,出于成本和灵活性的考虑,我使用aws batch与spark dockers而不是EMR来执行这些作业。最近,我决定尝试这些作业的最佳配置,我意识到了一些奇怪的事情:一个用16个或更少的vCPU快速完成(大约10分钟)的作业永远不会以20个或更多的vCPU结束(我等了3个小时)。我首先想到的是,这可能是批处理或ecs代理管理任务的方式有问题,所以我尝试直接在ec2中运行docker,但遇到了同样的问题。然后我认为问题出在docker图像上,所以我尝试创建一个新图像:

  • 第一个根据AWS glue兼容版本安装的spark(https://aws-glue-etl-artifacts.s3.amazonaws.com/glue-1.0/spark-2.4.3-bin-hadoop2.8.tgz)

同样的事情发生了。然后我决定问题根本在于使用docker,所以我将所有东西都直接安装在ec2中,得到了相同的结果。尝试更改spark版本,也发生了同样的事情。我认为这可能是硬件阻塞太多线程的问题,所以我切换到AMD的一个实例,没有任何改变。尝试修改一些配置,驱动程序使用的内存量,但结果总是一样的:16个vCPU它工作,超过它,它停止。

其他详情:

  • 根据日志,它似乎总是在同一点停止:s3上的拼花读取操作,但拼花文件非常小(

我很感谢你在这件事上的帮助!

共有1个答案

鲁博瀚
2023-03-14
  1. 停止使用Hadoop 2.7二进制文件。它们已经过时了,尤其是对于S3连接性。将所有hadoop 2.7工件替换为Hadoop 2.8工件,或者最好是Hadoop 3.2或更高版本,具有一致的依赖项。
  2. 将spark.hadoop.fs.s3a.experimental.fadvise设置为随机。

如果您仍然看到问题,请查看是否可以在hadoop 3.3. x上复制它们,如果可以:提交错误。

(2021-03-9的建议正确;它在SO中未经编辑的时间越长,就越不应该被相信)

 类似资料:
  • 我正在将游戏的场景从启动页面切换到游戏,如果我单独玩,游戏场景效果很好,但当我从启动页面切换后玩游戏时,游戏会冻结一段时间。 是什么原因导致我的主游戏在切换场景后冻结了一段时间(一段时间后再次启动),我确信游戏在没有切换场景的情况下运行良好。 程序的控制流程是——从播放器开始,startuppage场景被加载到舞台,如果按下播放按钮,则在主控制器中,场景被切换到我的游戏场景。问题只会在切换场景时出

  • 通过使用会话窗口与相当高级的组一起运行流数据流管道,在运行几个小时后,我遇到了问题。工作在workers中扩展,但后来开始获得日志负载,其内容如下 记录此代码的转换位于“group by”-块之后,并执行对外部服务的异步HTTP调用(使用)。 你知道为什么会这样吗?与异步、伸缩或按策略分组有关? 作业ID:2018-01-29_03_13_40-12789475517328084866 SDK:A

  • 我正在处理一些奇怪的错误信息,我认为这可以归结为内存问题,但我很难确定它,可以从专家那里得到一些指导。 我有一个两台机器的Spark(1.0.1)集群。两台机器都有8个核心;一台有16GB内存,另一台有32GB内存(这是主)。我的应用程序涉及计算图像中的成对像素亲和力,尽管我测试的图像到目前为止只有1920x1200大,16x16小。 我确实必须改变一些内存和并行性设置,否则我会得到显式的OutO

  • 我们正在运行SonarQube 4.5.1,并使用Jenkins和SonarQube插件运行项目分析。从三天前开始,我们在一些作业中遇到以下错误消息。 如果我将URL复制到浏览器,我会收到以下消息: “您仅被授权执行本地(试运行)SonarQube分析,而无需将结果推送到SonarQube服务器。请与您的SonarQube管理员联系。” 背景 "期望selectOne()返回一个结果(或null)

  • 问题内容: 如何在不冻结程序的情况下用Java执行进程?我已经尝试过使用SwingWorker,但是我还不太了解它是如何工作的。 我还有其他方法可以做到这一点吗?我想在我的JDroidLib中使用类似的东西。有关完整的源代码,请查看GitHub:http : //github.com/Team-M4gkBeatz/JDroidLib 提前致谢! 编辑: 感谢您的回答。但是我有一个带有几种方法的类(

  • 我的理解是,这是SparkR的一个非常基本的功能,所以我真的不知道为什么它不能工作。由于某种原因,当我使用直接从数据源读取时,我没有问题。还有,我注意到错误行中的数字“:stage xxx中的task 0..”每次失败时递增1。 我还注意到,错误似乎来自于执行程序找不到的二进制文件,尽管我不确定为什么这只会发生在从本地data.frames创建的SparkDataFrames中,而不是从外部数据源