使用资源编排服务(ROS)轻松玩转E-MapReduce(EMR)

前言

如果您还没有听说过资源编排服务(ROS),那么恭喜您,本文将带您走进一个新的世界,学习资源管理的新姿势。

当您在使用E-MapReduce(EMR)时,是否想过使用OpenAPI或者是SDK来创建实例?是否为太多的参数感到困扰,为不一样的参数名称形态看到困惑?尤其是要通过代码管理整个实例的生命周期感到烦恼?

但您本不该为此烦恼,不是吗?

其实您只是想创建若干个资源,您不想关心应该调用什么API,调用的过程是怎样的。您应该有这样一位帮您管理资源的“管家”,只需告诉他需要什么样的资源,他就能立刻帮您创建出来,接着就可以安心使用这些资源。而在不需要这些资源的时候,告诉管家把它们都清理掉,他就帮您办的妥妥当当。

ROS 就是您的资源管家,您只需通过一个模板告诉它资源配置,剩下的事情就交给他了。

本文将为您讲解如何通过ROS来轻松的管理EMR。

EMR 集群资源

在 ROS 中,想要创建 EMR 集群资源,需要在模板中声明 EMR::Cluster 资源类型以及一些配置参数。

EMR::Cluster 的详细文档可见https://help.aliyun.com/document_detail/130249.html

基于已有VPC资源创建Hadoop集群

假设我们已经有了VPC、VSwitch实例,想要通过EMR创建Hadoop集群。这个集群中有一个Master节点和两个Core节点,那么我们轻松写出如下模板:

{
  "ROSTemplateFormatVersion": "2015-09-01",
  "Resources": {
    "Cluster": {
      "Type": "ALIYUN::EMR::Cluster",
      "Properties": {
        "NetType": "vpc",
        "Name": "MyCluster",
        "ClusterType": "HADOOP",
        "ZoneId": "<ZoneId>",
        "EmrVer": "EMR-3.21.0",
        "ChargeType": "PostPaid",
        "SecurityGroupId": "<SecurityGroupId>",
        "VpcId": "<VpcId>",
        "VSwitchId": "<VSwitchId>",
        "UseLocalMetaDb": true,
        "HostGroup": [
          {
            "NodeCount": 1,
            "HostGroupType": "MASTER",
            "DiskCount": 1,
            "DiskCapacity": 40,
            "DiskType": "CLOUD_EFFICIENCY",
            "SysDiskCapacity": 40,
            "SysDiskType": "CLOUD_EFFICIENCY",
            "InstanceType": "ecs.g5.xlarge",
            "ChargeType": "PostPaid"
          },
          {
            "NodeCount": 2,
            "HostGroupType": "CORE",
            "DiskCount": 4,
            "DiskCapacity": 40,
            "DiskType": "CLOUD_EFFICIENCY",
            "SysDiskCapacity": 40,
            "SysDiskType": "CLOUD_EFFICIENCY",
            "InstanceType": "ecs.g5.xlarge",
            "ChargeType": "PostPaid"
          }
        ]
      }
    }
  },
  "Outputs": {
    "ClusterId": {
      "Value": { "Fn::GetAtt": ["Cluster", "ClusterId"] }
    }
  }
}

 

这里,先讲解下这个模板中的关键点:

  • ROSTemplateFormatVersion 声明了ROS模板的语法版本,取固定值 2015-09-01
  • Resources 声明了要创建的资源。它是一个字典:
    • 其键(如文中的Cluster)是资源的逻辑ID,可以在其他资源或输出中通过这个ID来引用资源的属性;
    • 其值是资源的配置,即要创建什么样的资源,它具有如下属性:
      • Type 是资源类型,如示例中的 ALIYUN::EMR::Cluster 表明要创建一个EMR集群
      • Properties 是资源属性,随资源类型的不同而不同。比如对于类型为 ALIYUN::EMR::Cluster 的资源来说,其属性有NetType、Name、ClusterType、HostGroup等属性,而每个属性的含义与EMR的创建集群API保持一致,可参考https://help.aliyun.com/document_detail/130249.html#title-vvt-45x-jjq 

有了上面的模板,我们就可以通过ROS来轻松创建Hadoop集群了,关于控制台上的创建步骤,我们将在后文提及。

全新创建Hadoop集群

在上一个例子中,你可能有这样的疑问:

  • 如果是在已有VPC资源的情况下创建Hadoop集群,通过ROS写个模板来创建和通过EMR控制台来创建并没有任何优势,反而后者更快呢?
  • 模板中的一些参数(比如集群名称、集群类型、可用区等)是写死的,能否动态传入呢?

设想一下,现在我们需要全新地创建Hadoop集群,包括各种依赖的VPC资源。如果不用ROS,您需要:

  1. 在VPC控制台上创建VPC、VSwith实例
  2. 在ECS控制台上创建安全组实例
  3. 在EMR控制台上创建集群

而使用ROS后,在一个模板中就能做到这些事情。

我们也可以在模板中声明和引用参数,这样就能够做到同一份模板,使用不同的参数,以创建不同规格的资源。于是,就有了下面的模板:

{
  "ROSTemplateFormatVersion": "2015-09-01",
  "Parameters": {
    "ClusterName": {
      "Type": "String",
      "Description": "The EMR cluster name",
      "Default": "MyCluster"
    },
    "VpcName": {
      "Type": "String",
      "Description": "The VPC name",
      "Default": "EmrVpc"
    },
    "VSwitchName": {
      "Type": "String",
      "Description": "The VSwitch name",
      "Default": "EmrVSwitch"
    },
    "SecurityGroupName": {
      "Type": "String",
      "Description": "The security group name",
      "Default": "EmrSecurityGroup"
    },
    "ZoneId": {
      "Type": "String",
      "Description": "The security group name",
      "Label": "Security Group Name",
      "Default": "cn-beijing-g"
    },
    "InstanceType": {
        "Type": "String",
        "Description": "Instance type, <a href='#/product/cn-beijing/list/typeList' target='_blank'>View instance types</a>",
        "AllowedValues": [
          "ecs.g5.large",
          "ecs.g5.xlarge",
          "ecs.g5.2xlarge",
          "ecs.g5.3xlarge"
        ],
        "Default": "ecs.g5.large"
      }
  },
  "Resources": {
    "VPC": {
      "Type": "ALIYUN::ECS::VPC",
      "Properties": {
        "CidrBlock": "192.168.0.0/16",
        "VpcName": {
          "Ref": "VpcName"
        }
      }
    },
    "VSwitch": {
      "Type": "ALIYUN::ECS::VSwitch",
      "Properties": {
        "VpcId": {
          "Ref": "VPC"
        },
        "ZoneId": {
          "Ref": "ZoneId"
        },
        "VSwitchName": {
          "Ref": "VSwitchName"
        },
        "CidrBlock": "192.168.0.0/16"
      }
    },
    "SecurityGroup": {
      "Type": "ALIYUN::ECS::SecurityGroup",
      "Properties": {
        "SecurityGroupName": {
          "Ref": "SecurityGroupName"
        },
        "VpcId": {
          "Ref": "VPC"
        }
      }
    },
    "Cluster": {
      "Type": "ALIYUN::EMR::Cluster",
      "Properties": {
        "NetType": "vpc",
        "Name": "ros-emr-cluster-test",
        "ClusterType": "DRUID",
        "ZoneId": "cn-beijing-g",
        "EmrVer": "EMR-3.21.0",
        "ChargeType": "PostPaid",
        "SecurityGroupId": {
          "Ref": "SecurityGroup"
        },
        "VpcId": {
          "Ref": "VPC"
        },
        "VSwitchId": {
          "Ref": "VSwitch"
        },
        "UseLocalMetaDb": true,
        "HostGroup": [
          {
            "NodeCount": 1,
            "HostGroupType": "MASTER",
            "DiskCount": 1,
            "DiskCapacity": 40,
            "DiskType": "CLOUD_EFFICIENCY",
            "SysDiskCapacity": 40,
            "SysDiskType": "CLOUD_EFFICIENCY",
            "InstanceType": {
                "Ref": "InstanceType"
            },
            "ChargeType": "PostPaid"
          },
          {
            "NodeCount": 2,
            "HostGroupType": "CORE",
            "DiskCount": 4,
            "DiskCapacity": 40,
            "DiskType": "CLOUD_EFFICIENCY",
            "SysDiskCapacity": 40,
            "SysDiskType": "CLOUD_EFFICIENCY",
            "InstanceType": {
                "Ref": "InstanceType"
            },
            "ChargeType": "PostPaid"
          }
        ]
      }
    }
  },
  "Outputs": {
    "ClusterId": {
      "Value": { "Fn::GetAtt": ["Cluster", "ClusterId"] }
    }
  }
}

相较于上一个示例模板,此模板做了如下改动:

  • 新增了 Parameters,用于定义模板参数。比如我们定义了ClusterName、VpcName、VSwitchName、SecurityGroupName、ZoneId、InstanceType等参数,并给了默认值。尤其是对于参数InstanceType,我们通过AllowedValues限定了取值范围。这些参数在 Resources 中可以用 {"Ref": "<参数名称>"} 的形式进行引用
  • Resources 中新增了对网络资源的创建:
    • VPC实例 —— 自定义逻辑 ID为 VPC,类型为 ALIYUN::ECS::VPC
    • VSwitch实例 ——自定义逻辑 ID为 VSwitch,类型为 ALIYUN::ECS::VSwitch
    • 安全组实例 —— 自定义逻辑 ID为 SecurityGroup,类型为 ALIYUN::ECS::SecurityGroup
  • 在资源中,也可以通过 {"Ref": "<资源逻辑 ID>"} 的形式引用其他资源的实例 ID。如下例子中:
    • VpcId 引用自逻辑 ID 为 VPC 的实例 ID
    • ZoneId 引用自模板参数 ZoneId
    • VSwitchName 引用自模板参数 VSwitchName
    "VSwitch": {
      "Type": "ALIYUN::ECS::VSwitch",
      "Properties": {
        "VpcId": {
          "Ref": "VPC"
        },
        "ZoneId": {
          "Ref": "ZoneId"
        },
        "VSwitchName": {
          "Ref": "VSwitchName"
        },
        "CidrBlock": "192.168.0.0/16"
      }
    }

 

在写好上述模板后,我们就能通过ROS轻松创建出VPC、VSwitch、安全组和EMR集群。

 

ROS 控制台使用示例

1. 访问 ROS 控制台,点击”新建资源栈“,进入创建页面,输入写好的模板。

使用资源编排服务(ROS)轻松玩转E-MapReduce(EMR)

2. 点击下一步,进入配置界面,输入栈名、参数等信息,点击”创建“即可轻松创建出EMR集群。

使用资源编排服务(ROS)轻松玩转E-MapReduce(EMR)

3. 访问 ROS 控制台,即可看到创建出资源栈。

使用资源编排服务(ROS)轻松玩转E-MapReduce(EMR)

4. 点击栈名称,可看到更加详细的信息。下图展示了这个栈中的所有资源,也就是我们之前在模板中定义的VPC、VSwitch、安全组和EMR集群。

使用资源编排服务(ROS)轻松玩转E-MapReduce(EMR)

5. 当我们不需要这些资源时,在资源栈管理界面中点击”删除“,并在弹出的界面中勾选”释放资源“,即可一键删除所有资源。

 

使用资源编排服务(ROS)轻松玩转E-MapReduce(EMR)

小结

通过在模板中声明需要哪些资源(如VPC、EMR等),根据情况定义模板参数和输出,即可使用该模板在任意区域(Region)创建和管理这些资源。ROS 作为资源管家,会帮您处理好资源创建到删除的完整的生命周期。通过这种配置即代码(Config as Code)的方式,您可以轻松创建出想要的资源,从而把更多的精力放在业务逻辑上。

作为 ROS 轻松玩转各产品系列的开始,本文只是带您初步领略 ROS 的魅力。后续文章中,将会介绍更多的产品,总有一款会符合您的口味!

 

 

 

 

上一篇:OSS Select应用实践与使用技巧系列


下一篇:K8S有状态服务-OSS存储使用最佳实践