使用 first_run 一步启动集群

https://blueprints.launchpad.net/sahara/+spec/first-run-api-usage

本文档建议在 Sahara 的 CDH 插件中使用 cm_api 方法 first_run 来启动集群,而不是当前的一系列方法。

问题描述

目前在 CDH 插件的 start_cluster 方法中,使用了 cloudera_utils.py 中定义的大量方法来配置/准备要启动的服务。这些方法在其主体中包含 cm_api 方法,并检查返回值状态。例如,cu.format_namenode 会调用 cm_api ApiService.format_hdfs。

然而,Cloudera 不推荐这种方式。更简单的方法是使用单个方法 first_run 来完成大部分工作。事实上,在 Cloudera Manager 中,first_run 也被用于执行集群部署的最后一步。

将当前的 start_cluster 代码更改为使用 first_run 方法将带来以下好处:

  • 将工作交给 Cloudera Manager 自己处理,而不是手动完成。

  • 简化添加更多服务支持的工作。

  • 避免未来 CM 变更可能产生的错误。

提议的变更

实现方式是将 start_cluster 修改为调用 first_run,并从方法主体中移除 first_run 可以完成的其他工作。

具体来说,将类似于以下情况:

在 deploy.py 中,可能的 start_cluster 方法可能如下所示:

def start_cluster(cluster):
    cm_cluster = cu.get_cloudera_cluster(cluster)
    """ some pre codes """
    cu.first_run(cluster)
    """ some post codes """

用于配置 CDH 组件的当前方法,例如 _configure_spark、_install_extjs 以及 start_cluster 主体的大部分内容都可以移除。

在 cloudera_utils.py 中,first_run 可以定义为(仅供示例):

@cloudera_cmd
def first_run(cluster):
    cm_cluster = get_cloudera_cluster(cluster)
    yield cm_cluster.first_run()

用于配置 CDH 组件的方法,例如 create_yarn_job_history_dir、create_oozie_db、install_oozie_sharelib、create_hive_metastore_db、create_hive_dirs 可以移除。

替代方案

当前方式目前可行,但它增加了向 CDH 插件添加更多服务支持的编码工作复杂性。而且,当 CM 在未来升级时,无法保证当前代码的正确性。最终,Cloudera 推荐使用 first_run 方法来启动服务。

数据模型影响

REST API 影响

其他最终用户影响

部署者影响

开发者影响

这将使开发人员更容易添加更多 CDH 服务支持。

Sahara-image-elements impact

Sahara-dashboard / Horizon 影响

实现

负责人

主要负责人

ken chen

其他贡献者

ken chen

工作项

工作内容将是

  • 按照上述方式修改当前的 deploy.py 和 cloudera_utils.py。

  • 测试和评估更改。

依赖项

测试

进行集成测试以创建一个集群。

文档影响

参考资料