我有一个程序,其中通过这样的python脚本进行多个火花提交,
# test_python_script.py
import os
for i in range(3):
os.system('spark-submit test_spark_script.py')
在spark脚本中,我有多个spark转换,例如连接,枢轴,最后是保存在S3存储桶中。
脚本看起来像这样,
# test_spark_script.py
# start a session
spark = SparkSession.builder.appName("Test_app").getOrCreate()
df_file = spark.read.csv('file.csv')
df_file2 = spark.read.csv('file2.csv')
# Some transformations like multiple joins and pivots
# and finally a save in S3 bucket
df_final.repartition(1).write.mode('overwrite').csv(location, sep="|", header=True, compression="none")
# stop the session
spark.stop()
问题在于,每次迭代中,火花作业都会变慢。
我无法指出问题所在,但作业数量始终保持不变,只是任务持续时间和GC时间增加。
此外,我注意到的一件非常奇怪的事情是,即使我通过杀害火花工作,
yarn application -kill <id>
下一个提交的火花也将运行缓慢。
感谢您的帮助!
您的问题分为两个部分。因此,我将它们分开以更好地解释它们。
问题1:增加应用程序数量变得越来越慢的原因是什么?
说明:您的Spark提交使用了您的所有资源,因为您尚未设置提交将使用的核心和RAM数量。因此,随着您提交的应用程序数量的增加,它们共享资源,并且性能降低。
NOTE:如果您不在S3存储桶中,并且在内部运行应用程序,那么我要说的是,您必须考虑到您在磁盘上的读写操作,并且可能会遇到应用程序中的IO瓶颈,但这不是您的情况。
问题2:为什么要杀死工作,其余的工作仍然很慢?
说明:因为当您运行多个应用程序并且资源共享时,尽管您有杀死作业,但其余的spark-submit仍继续使用原来拥有的资源。
您可以通过设置每个应用程序的资源来测试上述说明(例如,如果您有10个内核,每个应用程序提供3个内核),然后您会发现,应用程序是否一起运行并不重要。