声明:
本博客欢迎转载,但请保留原作者信息,并请注明出处!
作者:郭德清
团队:华为杭州OpenStack团队
Sahara支持三种集群操作:创建集群、扩容/减容集群、删除集群。每种操作都有对应的一些中间状态。通过集群的状态,可以清楚地看到集群目前处于哪个阶段。本文主要是罗列了三种操作可能出现的一些状态。
一、创建集群
- Validating
Sahara会对输入的数据做检查,在sahara/service/api.py的create_cluster方法中:
cluster =g.change_cluster_status(cluster, "Validating") plugin.validate(cluster)
validate主要是对集群的一些服务的检验,比如vanilla的hadoop 1.2.1的插件中,会检查namenode节点是不是只有一个,jobtracker和oozie节点是不是大于1个。具体的方法可以看:sahara/plugins/vanilla/v1_2_1/versionhandler.py的validate方法。
- InfraUpdating
这个状态,主要是为了对插件做一些更新,在sahara/service/ops.py的_provision_cluster方法中:
#updating cluster infra cluster =g.change_cluster_status(cluster, "InfraUpdating") plugin.update_infra(cluster)
目前我看这个方法在各个插件中都还未实现。
- Spawning
在创建虚拟机的时候,Sahara会把集群状态置为Spawning,官网上的说法是这个状态会持续到集群所有的虚拟机状态为Active,但是从代码来看,创建虚拟机的命令发出去之后就会进入Waiting状态,在Waiting状态中会去等待虚拟机状态为Active。方法在:sahara/service/direct_engine.py的create_cluster方法中。
- Waiting
集群虚拟机的创建命令发出去之后,会进入Waiting状态,这个时候,会一直轮询去判断虚拟机的状态是否Active,等所有的虚拟机都Active之后,会等待网络配置(包括虚拟机的网络是不是都通了,是否都可以登录。),还有设置浮动IP,挂载卷等操作。具体的可以看sahara/service/direct_engine.py的create_cluster方法。
# wait for all instances are up and networks ready cluster = g.change_cluster_status(cluster, "Waiting") instances = g.get_instances(cluster) self._await_active(cluster, instances) self._assign_floating_ips(instances) self._await_networks(cluster, instances) cluster = conductor.cluster_get(ctx, cluster) # attach volumes volumes.attach_to_instances(g.get_instances(cluster))
- Preparing
在Preparing阶段,Sahara会生成/etc/hosts文件,为了虚拟机之间可以通过hostname来互相访问,同时为了免密码登录,也会更新每个虚拟机的authorized_keys。实现位于sahara/service/engine.py的_configure_instances方法中。
- Configuring
Sahara在环境准备好之后,会在虚拟机中安装各个服务,包括传入hadoop各个服务需要的xml,还有环境变量等。具体实现可以看下sahara/plugins/vanilla/v1_2_1/versionhandler.py的configure_cluster方法。
<pre name="code" class="python">def configure_cluster(self, cluster): instances = utils.get_instances(cluster) self._setup_instances(cluster, instances)
def_setup_instances(self, cluster, instances): if (CONF.use_identity_api_v3 and vu.get_hiveserver(cluster) and c_helper.is_swift_enable(cluster)): cluster = proxy.create_proxy_user_for_cluster(cluster) instances = utils.get_instances(cluster) extra = self._extract_configs_to_extra(cluster) cluster = conductor.cluster_get(context.ctx(), cluster) self._push_configs_to_nodes(cluster, extra, instances)
- Starting
这一步是在虚拟机中拉起各个服务。以vanilla的hadoop1.2.1的插件为例,会先格式化namenode,然后依次拉起namenode、secondarynamenode、jobtracker、datanode、tasktracker、oozie、hive_server。具体的实现可以看下sahara/plugins/vanilla/v1_2_1/versionhandler.py的start_cluster方法。
- Active
在集群都创建、配置、服务拉起之后,会把集群置为Active。看到这个状态,说明集群已经创建成功了。这个时候就可以开始通过Sahara来跑一些hadoop任务了。
二、扩容/减容集群
- Validating
跟创建集群一样,扩容和减容集群也同样会做校验工作。具体的参考上面创建集群的操作。
- Decommissioning
在做减容的时候,会把要删除的虚拟机上面的服务停掉,删除和datanode和tasktracker会分别调sahara/plugins/vanilla/v1_2_1/scaling.py的decommission_dn方法和decommission_tt方法。具体的可以看下sahara/plugins/vanilla/v1_2_1/versionhandler.py的decommission_nodes方法。
- Scaling
在这个阶段会创建虚拟机、等待虚拟机Active、分配浮动IP、等待网络通等操作和创建集群时创建虚拟机的步骤类似。具体方法可以看下sahara/service/direct_engine.py的scale_cluster方法。
- Configuring
和集群创建时候的Configuring状态类似。新建的虚拟机会配上已有虚拟机的配置,原来的虚拟机也会更新/etc/hosts。
- Active
扩容成功后,状态会置为Active。如果验证的时候失败,也会把集群置为Active。
三、删除集群
- Deleting
删除虚拟机时集群的状态。
四、错误状态
- Error
创建集群的时候,如果出现错误,会把集群置为Error。扩容的时候失败,Sahara会先进行回滚,如果回滚失败,也会把集群置为Error。
【参考资料】
https://sahara.readthedocs.org/en/stable-juno/userdoc/statuses.html