+86 135 410 16684Mon. - Fri. 10:00-22:00

AWS EMR Spark on yarn 使用记录

AWS EMR Spark on yarn 使用记录

AWS EMR Spark on yarn 使用记录

1. Dynamic Resource Allocation在AWS EMR Spark中已经默认配置好了。因此–num-executors只是job启动时的一个初始值,cluster会根据可用资源情况再自动分配。不要设置成太大,因为如果初始申请的资源超过现有资源,就会提交job失败。

 

2. CPU的申请和使用:yarn是hadoop 2的资源管理框架。在默认配置下,它和mesos (hadoop V1提供的资源管理框架)一样,只将内存作为可分配的资源。可以在Resource Manager的首页上,查看到资源分配模式:

182351_BN2M_2283449

可以在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"
        ]
    },