This seems a little confusing to me...it looks like this extends StorageStatusSparkListener because it needs access to the list of executors and their addresses through the storageStatusList member variable.  But for JobProgressListener, storageStatusList isn't really kept up to date correctly -- because onTaskEnd gets overridden by JobProgressListener, so the RDD info won't get correctly updated when the task ends.

I'd propose simplifying this by having JobProgressListener just extend the usual SparkListener.  Then, you need a way of getting the executors for the ExecutorTable on the stage status page.  But you can get the list of executor Ids / hostnames from the list of tasks (which works because you only care about the executors that are being used by one of the tasks anyway).