前言
如果您还没有听说过资源编排服务(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,您需要:
- 在VPC控制台上创建VPC、VSwith实例
- 在ECS控制台上创建安全组实例
- 在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 控制台,点击”新建资源栈“,进入创建页面,输入写好的模板。
2. 点击下一步,进入配置界面,输入栈名、参数等信息,点击”创建“即可轻松创建出EMR集群。
3. 访问 ROS 控制台,即可看到创建出资源栈。
4. 点击栈名称,可看到更加详细的信息。下图展示了这个栈中的所有资源,也就是我们之前在模板中定义的VPC、VSwitch、安全组和EMR集群。
5. 当我们不需要这些资源时,在资源栈管理界面中点击”删除“,并在弹出的界面中勾选”释放资源“,即可一键删除所有资源。
小结
通过在模板中声明需要哪些资源(如VPC、EMR等),根据情况定义模板参数和输出,即可使用该模板在任意区域(Region)创建和管理这些资源。ROS 作为资源管家,会帮您处理好资源创建到删除的完整的生命周期。通过这种配置即代码(Config as Code)的方式,您可以轻松创建出想要的资源,从而把更多的精力放在业务逻辑上。
作为 ROS 轻松玩转各产品系列的开始,本文只是带您初步领略 ROS 的魅力。后续文章中,将会介绍更多的产品,总有一款会符合您的口味!