雖然目前大多數平臺內置Application在提交時,只配置了–num-executors和–executor-memory參數,但是其他APP的開發者可能會配置–executor-cores參數。
舉個例子:
./Spark-submit –master yarn-client –executor-cores 4 –num-executors 6 –executor-memory 10g –driver-memory 2g –class xxxApp xxJar –jars $SPARK_HOME/lib/postgresql-9.4-1201.jdbc41.jar
即有6個executor,每個executor的cores數目爲4。不過當你提交任務時,你一定會非常吃驚,因爲yarn 8088上展示的vcores會是7。看起來就像是參數設置並未生效一樣。
其實這是因爲我們的capacity schedule使用的是DefaultResourceCalculator,那麼DefaultResourceCalculator它在加載Container時其實僅僅只會考慮內存而不考慮cores。所以,如果我們想讓它既考慮內存也考慮cores的話,需要將$HADOOP_HOME/etc/Hadoop/capacity-scheduler.xml
中的:
<property>
<name>yarn.scheduler.capacity.resource-calculator</name>
<value>org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator</value>
</property>
修改爲:
<property>
<name>yarn.scheduler.capacity.resource-calculator</name>
<value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value>
</property>
請注意每個節點的配置文件都需要修改。並且重啓hadoop。
這是再提交spark application,vcores use的數目就對了。
25=4*6+1
另外,如果不期望在命令中寫executor-cores參數,可以在$SPARK_HOME/conf/spark-env.sh裏配置:
export SPARK_EXECUTOR_CORES=4
這樣默認executor-cores就爲4了。