第一点是,如果有足够的资源(例如节点、CPU 和内存)可供 yarn 使用,它可以使用动态分配来创建具有适当默认内核和内存分配的 spark worker。
在我的情况下,我需要关闭动态分配,因为我的资源水平非常低。
所以我从 pyspark 设置了以下值:
conf = (SparkConf().setAppName("simple")
.set("spark.shuffle.service.enabled", "false")
.set("spark.dynamicAllocation.enabled", "false")
.set("spark.cores.max", "1")
.set("spark.executor.instances","2")
.set("spark.executor.memory","200m")
.set("spark.executor.cores","1")
注意:这里设置的值基本上应该小于实际可用资源。但是,此处的值太小可能会导致内存不足问题或作业运行时性能下降问题。
The complete code gist of a sample job is available here
对于这个 pyspark 案例,另一个需要注意的重点是 Spark on Yarn 可以在两种模式下运行
- 集群模式——spark驱动在spark主节点中运行
- 客户端模式 - spark 驱动程序从运行交互式 shell 的客户端运行。
集群模式不太适合交互式使用 Spark。需要用户输入的 Spark 应用程序(例如 spark-shell 和 pyspark)需要 Spark 驱动程序在启动 Spark 应用程序的客户端进程内运行。
客户端模式可以在如下环境中设置
export PYSPARK_SUBMIT_ARGS='--master yarn --deploy-mode client pyspark-shell'