1. Dynamic Resource Allocation在AWS EMR Spark中已经默认配置好了。因此--num-executors只是job启动时的一个初始值,cluster会根据可用资源情况再自动分配。不要设置成太大,因为如果初始申请的资源超过现有资源,就会提交job失败。
2. CPU的申请和使用:yarn是hadoop 2的资源管理框架。在默认配置下,它和mesos (hadoop V1提供的资源管理框架)一样,只将内存作为可分配的资源。可以在Resource Manager的首页上,查看到资源分配模式:
可以在Scheduling Resource Type这个地方,看到只有MEMORY这一项,从而导致了Cluster的资源使用极不均衡,Memory被全部申请掉,但是vCore只是一个Container一个。
需要在capacity-scheduler.xml中,将resource-calculator的类型从DefaultResourceCalculator切换成DominantResourceCalculator。参考自http://stackoverflow.com/questions/32233162/spark-executor-cores-not-shown-in-yarn-resource-manager。
但是AWS EMR的配置方法比较特殊。首先需要在cluster创建的时候设置,然后对cluster原来不同文件的中的配置都通过一个json文件完成, 用不同的Classification值来分别指定。参考http://docs.aws.amazon.com/ElasticMapReduce/latest/ReleaseGuide/emr-configure-apps.html。修改完之后,可以看到Scheduling Resource Type的值变成了[MEMORY, CPU],并且内存和vCPU的比例和自己设置的--executor-cores、--executor-memory的比例是相关的了。
3. terminate cluster之后,日志文件并不会自动被删除,所以对于线上的训练工作,优先考虑设置好--log-uri --steps --auto-terminate,动态申请该cluster完成计算,以节省费用。例如可以使用如下的命令:
aws emr create-cluster \ --release-label emr-5.0.0 \ --instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=*** InstanceGroupType=CORE,InstanceCount=*,InstanceType=*** \ --use-default-roles \ --name "ing" \ --ec2-attributes KeyName=***,SubnetId=***,EmrManagedMasterSecurityGroup=***,EmrManagedSlaveSecurityGroup=*** \ --applications Name=Hadoop Name=Spark \ --termination-protected \ --enable-debugging \ --log-uri s3://path/of/log \ --configurations file://./aws_emr_cluster_init_conf.json \ --steps file://./aws_job_all_steps.json \ --auto-terminate
其中configurations的json文件是
[ { "Classification": "spark", "Properties": { "maximizeResourceAllocation": "true" } }, { "Classification": "capacity-scheduler", "Properties": { "yarn.scheduler.capacity.resource-calculator": "org.apache.hadoop.yarn.util.resource.DominantResourceCalculator" } } ]
steps的文件是:
[ { "Name": "data-preparing", "Type": "Spark", "ActionOnFailure": "CONTINUE", "Args": [ "--class", "main.class", "--deploy-mode", "cluster", "--master", "yarn", "--driver-cores", "15", "--driver-memory", "15G", "--executor-cores", "4", "--executor-memory", "5G", "--num-executors", "3", "s3://path/to/your/jar" ] },