【发布时间】:2021-06-07 09:45:16
【问题描述】:
TLDR:我有一个 pyspark 作业,当我在具有 16 个 vcpus 的 ec2 实例中运行它时,它会在 10 分钟内完成,但如果我使用它会冻结(它不会失败,只是永远不会完成)一个拥有超过 20 个 vcpus 的实例。我已经尝试了所有我能想到的方法,但我只是不知道为什么会这样。
全文:
我有大约 200 个小型 pyspark 作业,出于成本和灵活性的考虑,我使用带有 spark docker 的 aws batch 而不是 EMR 来执行这些作业。最近,我决定围绕这些作业的最佳配置进行试验,我意识到一些奇怪的事情:使用 16 个或更少 vcpus 快速完成(大约 10 分钟)的作业永远不会以 20 个或更多(我等了 3 小时)结束。我首先想到的是批处理或 ecs-agents 管理任务的方式可能有问题,所以我尝试直接在 ec2 中运行 docker 并遇到了同样的问题。然后我认为问题出在docker镜像上,所以我尝试创建一个新的:
- 第一个与 Spark 一起使用,根据 AWS 胶水兼容版本 (https://aws-glue-etl-artifacts.s3.amazonaws.com/glue-1.0/spark-2.4.3-bin-hadoop2.8.tgz) 安装
- 新版本是基于 ubuntu 20 并从 apache 镜像 (https://apache.mirror.digitalpacific.com.au/spark/spark-$SPARK_VERSION/spark-$SPARK_VERSION-bin-hadoop$HADOOP_VERSION.tgz) 安装的 spark
同样的事情发生了。然后我认为问题完全出在使用 docker 上,所以我直接在 ec2 中安装了所有东西,得到了相同的结果。尝试更改火花版本,也发生了同样的事情。认为这可能是硬件阻塞太多线程的问题,所以我切换到 AMD 的实例,没有任何改变。尝试修改一些配置,驱动程序使用的内存量,但总是有相同的结果:16个vcpus它工作,超过它,它停止。
其他细节:
- 根据日志,它似乎总是停在同一点:s3 上的 parquet 读取操作,但 parquet 文件非常小(> 1mb),所以我认为这不是实际问题。
- 之后它有时仍然有日志,但没有什么真正有用的,只是“INFO ContextCleaner: Cleaned accumulator”。
- 我使用 s3a 从 s3 读取文件。
- 我没有收到任何错误或火花日志。
感谢您对此事的任何帮助!
【问题讨论】:
标签: amazon-web-services docker apache-spark amazon-s3 pyspark