我原以为我很了解纱线架构上的火花,但现在我想知道:当我启动时
spark-submit --master yarn-cluster --class com.domain.xxx.ddpaction.DdpApp --num-executors 24 --deploy-mode cluster --driver-memory 4g --executor-memory 2g --executor-cores 1 --conf "spark.yarn.jar=/spark/lib/spark-assembly-1.1.0-hadoop2.4.0.jar" ddpaction-3.1.0.jar yarn-cluster config.yml
失败
# Native memory allocation (malloc) failed to allocate 2863333376 bytes for committing reserved memory
我启动spark-submit的服务器的可用内存不足2GB,这会导致错误,但驱动程序应该执行的资源管理器的驱动程序内存参数远远超过4GB。在我的理解中,驱动程序内存值只应该在资源管理器中的纱线集群上检查和分配,为什么会在以纱线集群模式启动spark-submit的服务器上分配?
这是Spark-1.4.0中修复的一个错误。请参阅Spark-3884
在spark-submit脚本中似乎有一个糟糕的简化:
elif [ "$1" = "--driver-memory" ]; then
export SPARK_SUBMIT_DRIVER_MEMORY=$2
因此,spark-submit使用驱动程序内存参数值来设置其分配的内存;这只适用于yarn客户端模式,而不适用于yarm集群。我解决了我的问题,将这些线路替换为:
elif [ "$1" = "--spark-submit-memory" ]; then
export SPARK_SUBMIT_DRIVER_MEMORY=$2
所以现在我可以设置(如果需要的话)分配给spark-submit的内存为一个不同值的驱动程序。