maybe i think it has another environment.it schedule a single executor to a worker for every application.memory depends on the cores of assigning to worker,not the config 'spark.executor.memory'. because for application  master assign different cores to executor,but these executors have the same memory.