【问题标题】:Amazon EMR use spot instances as core and Master Nodes using TerraformAmazon EMR 使用 Spot 实例作为核心,主节点使用 Terraform
【发布时间】:2018-10-30 20:46:17
【问题描述】:

我想使用 terraform 将 Spot 实例用于 EMR。我可以使用 CLI 做到这一点:

aws emr create-cluster --release-label emr-5.3.1 --service-role 
EMR_DefaultRole \
--ec2-attributes InstanceProfile=EMR_EC2_DefaultRole \
--instance-fleets 
InstanceFleetType=MASTER,TargetSpotCapacity=1,InstanceTypeConfigs= . 
['{InstanceType=m4.large,BidPrice=0.5}'] \
InstanceFleetType=CORE,TargetSpotCapacity=1,InstanceTypeConfigs= . 
['{InstanceType=m4.large,BidPrice=0.5}']`

但我在 terraform 中找不到实例队列功能。我怎样才能使用 terraform 完成同样的任务

【问题讨论】:

    标签: amazon-web-services terraform amazon-emr


    【解决方案1】:

    您可以在instance_group block 下为您的 EMR 集群使用的实例指定出价,以让 Terraform 为这些实例使用 Spot 实例。

    example in the aws_emr_cluster resource documentation 显示了如何指定它:

    resource "aws_emr_cluster" "emr-test-cluster" {
      name          = "emr-test-arn"
      release_label = "emr-4.6.0"
      applications  = ["Spark"]
      additional_info = <<EOF
    {
      "instanceAwsClientConfiguration": {
        "proxyPort": 8099,
        "proxyHost": "myproxy.example.com"
      }
    }
    EOF
    
      termination_protection = false
      keep_job_flow_alive_when_no_steps = true
    
      ec2_attributes {
        subnet_id                         = "${aws_subnet.main.id}"
        emr_managed_master_security_group = "${aws_security_group.sg.id}"
        emr_managed_slave_security_group  = "${aws_security_group.sg.id}"
        instance_profile                  = "${aws_iam_instance_profile.emr_profile.arn}"
      }
    
      instance_group {
          instance_role = "CORE"
          instance_type = "c4.large"
          instance_count = "1"
          ebs_config {
            size = "40"
            type = "gp2"
            volumes_per_instance = 1
          }
          bid_price = "0.30"
          autoscaling_policy = <<EOF
    {
    "Constraints": {
      "MinCapacity": 1,
      "MaxCapacity": 2
    },
    "Rules": [
      {
        "Name": "ScaleOutMemoryPercentage",
        "Description": "Scale out if YARNMemoryAvailablePercentage is less than 15",
        "Action": {
          "SimpleScalingPolicyConfiguration": {
            "AdjustmentType": "CHANGE_IN_CAPACITY",
            "ScalingAdjustment": 1,
            "CoolDown": 300
          }
        },
        "Trigger": {
          "CloudWatchAlarmDefinition": {
            "ComparisonOperator": "LESS_THAN",
            "EvaluationPeriods": 1,
            "MetricName": "YARNMemoryAvailablePercentage",
            "Namespace": "AWS/ElasticMapReduce",
            "Period": 300,
            "Statistic": "AVERAGE",
            "Threshold": 15.0,
            "Unit": "PERCENT"
          }
        }
      }
    ]
    }
    EOF
    }
      ebs_root_volume_size     = 100
    
      master_instance_type = "m3.xlarge"
      core_instance_type   = "m3.xlarge"
      core_instance_count  = 1
    
      tags {
        role     = "rolename"
        env      = "env"
      }
    
      bootstrap_action {
        path = "s3://elasticmapreduce/bootstrap-actions/run-if"
        name = "runif"
        args = ["instance.isMaster=true", "echo running on master node"]
      }
    
      configurations_json = <<EOF
      [
        {
          "Classification": "hadoop-env",
          "Configurations": [
            {
              "Classification": "export",
              "Properties": {
                "JAVA_HOME": "/usr/lib/jvm/java-1.8.0"
              }
            }
          ],
          "Properties": {}
        },
        {
          "Classification": "spark-env",
          "Configurations": [
            {
              "Classification": "export",
              "Properties": {
                "JAVA_HOME": "/usr/lib/jvm/java-1.8.0"
              }
            }
          ],
          "Properties": {}
        }
      ]
    EOF  
    
      service_role = "${aws_iam_role.iam_emr_service_role.arn}"
    }
    

    【讨论】:

    • 感谢您的指点,但是在 EMR 模块的文档中,它提到了投标价格。新的 AWS Spot 市场不需要设置实例价格,我也希望主节点和核心节点都是现货。然而 Terraform 文档提到:bid_price can not be set for the MASTER instance group, since that group must always be On-Demand
    • 所以只需将投标价格设置为与相同行为的按需价格相同?此外,如果 AWS API 现在允许您将 Spot MASTER 实例添加到您的 EMR 集群,那么文档也只是过时了,因为目前在 Terraform 代码中没有检查以防止这种情况发生。
    猜你喜欢
    • 1970-01-01
    • 2021-05-04
    • 2019-03-23
    • 2016-07-18
    • 1970-01-01
    • 2020-11-02
    • 2015-12-04
    • 1970-01-01
    • 2019-12-10
    相关资源
    最近更新 更多