【发布时间】:2020-05-25 19:19:41
【问题描述】:
当我运行一个用 pyspark 编写的 spark 作业时,我运行了一个 jvm,它有一个我似乎无法设置的 Xmx1g 设置。这是ps aux 输出:
/usr/lib/jvm/jre/bin/java -cp /home/ec2-user/miniconda3/lib/python3.6/site-packages/pyspark/conf:/home/****/miniconda3/lib/python3.6/site-packages/pyspark/jars/* -Xmx1g org.apache.spark.deploy.SparkSubmit pyspark-shell
我的问题是,我该如何设置这个属性?我可以使用 SPARK_DAEMON_MEMORY 和 SPARK_DRIVER_MEMORY 设置主内存,但这不会影响 pyspark 的衍生进程。
我已经尝试过JAVA_OPTS 或实际查看包/bin 文件,但不明白这是在哪里设置的。
在工作上下文中设置 spark.driver.memory 和 spark.executor.memory 也没有帮助。
编辑:
在使用 spark-submit 提交作业后(代码和基础设施是从独立配置中进化而来的) - 一切都解决了。以编程方式提交(使用SparkConf)似乎覆盖了一些集群的设置。
【问题讨论】:
-
您能解释一下您要解决的问题吗? PySpark 将尊重
spark.*.memory属性,与任何其他包相同,但 JVM 堆与 PySpark 程序几乎无关。spark.*.memoryOverhead选项通常更到位。而SPARK_DAEMON_MEMORY是集群管理器属性,而不是应用程序,因此与spark.*.memory没有真正的关系(更不用说附近没有 Python 代码)。 -
如果你想限制 Python 堆大小 - How to limit the heap size?
-
我不确定我是否理解。这不是主(集群管理器)进程,也不是 python 进程。这是一个额外的 java 进程(运行
python-shell和SparkSubmit)在使用pyspark提交作业时产生。它从包本身添加到类路径 jar 并运行 jvm 来提交作业。我想改变它的堆大小。有可能吗? -
除了 JVM 驱动程序之外,PySpark 没有单独的 JVM,它尊重
spark.driver.memory。然而,这不是 Python 驱动程序内存。而我上面指出的是SPARK_DAEMON_MEMORY是独立集群配置,与应用无关(如果造成混淆,请见谅)。 -
我认为(如果我错了,请纠正我)这里的混淆是
start-master.sh所做的。 Master,是一个部分资源管理器(这里使用SPARK_DAEMON_MEMORY),它与驱动程序或应用程序无关。它是完全不同的,甚至不是强制性的组件。spark.driver.memory是驱动程序属性。它专门连接到由SparkSubmit启动的JVM - 这就是您使用spark.driver.memory的地方。最后是 Python 驱动程序,它是在使用 PySpark 时用于检测 JVM 驱动程序的纯 Python 进程。那里没有 JVM,所以 JVM 堆设置。有意义吗?
标签: apache-spark pyspark