From 11ba7ce1135f3efe8af459a5443b59cf2095801f Mon Sep 17 00:00:00 2001 From: proposalbot Date: Wed, 16 Nov 2022 15:16:26 +0000 Subject: [PATCH] Changes to mrs_api-ref from docs/doc-exports#463 (MRS API 2.0.38.SP20 version 1 Reviewed-by: Jiang, Beibei Co-authored-by: proposalbot Co-committed-by: proposalbot --- .../images/en-us_image_0000001298246380.png | Bin 0 -> 36307 bytes .../images/en-us_image_0000001298566184.png | Bin 0 -> 24961 bytes .../images/en-us_image_0000001298725832.png | Bin 0 -> 27651 bytes .../images/en-us_image_0000001351245885.png | Bin 0 -> 22183 bytes .../images/en-us_image_0000001351245889.gif | Bin 0 -> 29752 bytes .../images/en-us_image_0000001351446161.png | Bin 0 -> 72356 bytes api-ref/source/api_overview.rst | 138 ++ .../configuring_an_auto_scaling_rule.rst | 440 +++++ .../source/apis/auto_scaling_apis/index.rst | 14 + .../creating_a_cluster_and_running_a_job.rst | 1429 +++++++++++++++ .../deleting_a_cluster.rst | 81 + .../apis/cluster_management_apis_v1/index.rst | 24 + .../querying_a_cluster_list.rst | 421 +++++ .../querying_a_host_list.rst | 198 +++ .../querying_cluster_details.rst | 465 +++++ .../resizing_a_cluster.rst | 387 +++++ .../creating_clusters.rst | 1541 +++++++++++++++++ .../apis/cluster_management_apis_v2/index.rst | 14 + .../creating_a_data_source.rst | 155 ++ .../deleting_a_data_source.rst | 74 + .../source/apis/data_source_apis/index.rst | 22 + .../querying_the_data_source_details.rst | 121 ++ .../querying_the_data_source_list.rst | 175 ++ .../updating_a_data_source.rst | 165 ++ api-ref/source/apis/index.rst | 30 + .../creating_a_job_binary_object.rst | 150 ++ .../deleting_a_job_binary_object.rst | 72 + .../apis/job_binary_object_apis/index.rst | 22 + .../querying_the_binary_object_details.rst | 116 ++ .../querying_the_binary_object_list.rst | 164 ++ .../updating_a_job_binary_object.rst | 152 ++ .../canceling_job_execution.rst | 143 ++ .../deleting_a_job_execution_object.rst | 72 + .../index.rst | 20 + .../querying_job_execution_object_details.rst | 157 ++ ...querying_the_job_execution_object_list.rst | 223 +++ .../adding_a_job_and_executing_the_job.rst | 480 +++++ .../creating_a_job_object.rst | 252 +++ .../deleting_a_job_object.rst | 72 + .../executing_a_job_object.rst | 278 +++ .../index.rst | 30 + .../querying_exe_object_details.rst | 208 +++ .../querying_job_object_details.rst | 129 ++ .../querying_the_exe_object_list_of_jobs.rst | 234 +++ .../querying_the_job_object_list.rst | 205 +++ .../updating_a_job_object.rst | 193 +++ .../adding_and_executing_a_job.rst | 297 ++++ .../deleting_jobs_in_batches.rst | 79 + .../source/apis/job_object_apis_v2/index.rst | 24 + .../obtain_the_sql_result.rst | 115 ++ .../querying_a_list_of_jobs.rst | 225 +++ .../querying_information_about_a_job.rst | 159 ++ .../job_object_apis_v2/terminating_a_job.rst | 85 + .../adding_a_tag_to_a_specified_cluster.rst | 86 + ...ng_or_deleting_cluster_tags_in_batches.rst | 114 ++ .../deleting_a_tag_of_a_specified_cluster.rst | 70 + .../source/apis/tag_management_apis/index.rst | 24 + ...a_list_of_clusters_with_specified_tags.rst | 276 +++ .../tag_management_apis/querying_all_tags.rst | 103 ++ .../querying_tags_of_a_specified_cluster.rst | 99 ++ .../ecs_specifications_used_by_mrs.rst | 173 ++ api-ref/source/appendix/index.rst | 24 + .../obtain_mrs_cluster_information.rst | 28 + .../appendix/obtaining_a_project_id.rst | 54 + .../source/appendix/obtaining_account_id.rst | 14 + ...oles_and_components_supported_by_mrs11.rst | 55 + api-ref/source/appendix/status_codes.rst | 122 ++ .../source/before_you_start/api_calling.rst | 8 + api-ref/source/before_you_start/concepts.rst | 42 + .../source/before_you_start/constraints.rst | 8 + api-ref/source/before_you_start/endpoints.rst | 10 + api-ref/source/before_you_start/index.rst | 24 + api-ref/source/before_you_start/overview.rst | 12 + .../selecting_an_api_type.rst | 18 + .../source/calling_apis/authentication.rst | 188 ++ api-ref/source/calling_apis/index.rst | 18 + .../calling_apis/making_an_api_request.rst | 166 ++ api-ref/source/calling_apis/response.rst | 62 + api-ref/source/change_history.rst | 126 ++ api-ref/source/index.rst | 10 + .../api_usage_guide/api_calling_process.rst | 151 ++ .../api_usage_guide/examples.rst | 870 ++++++++++ .../mrs_manager_api/api_usage_guide/index.rst | 18 + .../introduction_to_mrs_manager_apis.rst | 158 ++ api-ref/source/mrs_manager_api/index.rst | 18 + .../mrs_manager_cas_apis/index.rst | 16 + .../logging_in_to_the_cas.rst | 78 + .../logging_out_of_the_cas.rst | 59 + .../checking_the_login.rst | 93 + .../mrs_manager_web_apis/index.rst | 34 + .../logging_out_of_a_session.rst | 79 + ...the_password_of_the_current_login_user.rst | 81 + ..._information_about_a_specified_cluster.rst | 134 ++ .../querying_monitoring_data.rst | 152 ++ ...uerying_summary_of_a_specified_service.rst | 122 ++ ...uerying_the_command_execution_progress.rst | 142 ++ ...e_health_status_of_a_specified_cluster.rst | 107 ++ .../saving_configurations.rst | 283 +++ .../starting_a_service.rst | 110 ++ .../stopping_a_service.rst | 112 ++ 100 files changed, 15001 insertions(+) create mode 100644 api-ref/source/_static/images/en-us_image_0000001298246380.png create mode 100644 api-ref/source/_static/images/en-us_image_0000001298566184.png create mode 100644 api-ref/source/_static/images/en-us_image_0000001298725832.png create mode 100644 api-ref/source/_static/images/en-us_image_0000001351245885.png create mode 100644 api-ref/source/_static/images/en-us_image_0000001351245889.gif create mode 100644 api-ref/source/_static/images/en-us_image_0000001351446161.png create mode 100644 api-ref/source/api_overview.rst create mode 100644 api-ref/source/apis/auto_scaling_apis/configuring_an_auto_scaling_rule.rst create mode 100644 api-ref/source/apis/auto_scaling_apis/index.rst create mode 100644 api-ref/source/apis/cluster_management_apis_v1/creating_a_cluster_and_running_a_job.rst create mode 100644 api-ref/source/apis/cluster_management_apis_v1/deleting_a_cluster.rst create mode 100644 api-ref/source/apis/cluster_management_apis_v1/index.rst create mode 100644 api-ref/source/apis/cluster_management_apis_v1/querying_a_cluster_list.rst create mode 100644 api-ref/source/apis/cluster_management_apis_v1/querying_a_host_list.rst create mode 100644 api-ref/source/apis/cluster_management_apis_v1/querying_cluster_details.rst create mode 100644 api-ref/source/apis/cluster_management_apis_v1/resizing_a_cluster.rst create mode 100644 api-ref/source/apis/cluster_management_apis_v2/creating_clusters.rst create mode 100644 api-ref/source/apis/cluster_management_apis_v2/index.rst create mode 100644 api-ref/source/apis/data_source_apis/creating_a_data_source.rst create mode 100644 api-ref/source/apis/data_source_apis/deleting_a_data_source.rst create mode 100644 api-ref/source/apis/data_source_apis/index.rst create mode 100644 api-ref/source/apis/data_source_apis/querying_the_data_source_details.rst create mode 100644 api-ref/source/apis/data_source_apis/querying_the_data_source_list.rst create mode 100644 api-ref/source/apis/data_source_apis/updating_a_data_source.rst create mode 100644 api-ref/source/apis/index.rst create mode 100644 api-ref/source/apis/job_binary_object_apis/creating_a_job_binary_object.rst create mode 100644 api-ref/source/apis/job_binary_object_apis/deleting_a_job_binary_object.rst create mode 100644 api-ref/source/apis/job_binary_object_apis/index.rst create mode 100644 api-ref/source/apis/job_binary_object_apis/querying_the_binary_object_details.rst create mode 100644 api-ref/source/apis/job_binary_object_apis/querying_the_binary_object_list.rst create mode 100644 api-ref/source/apis/job_binary_object_apis/updating_a_job_binary_object.rst create mode 100644 api-ref/source/apis/job_execution_object_apis_v1,_not_recommended/canceling_job_execution.rst create mode 100644 api-ref/source/apis/job_execution_object_apis_v1,_not_recommended/deleting_a_job_execution_object.rst create mode 100644 api-ref/source/apis/job_execution_object_apis_v1,_not_recommended/index.rst create mode 100644 api-ref/source/apis/job_execution_object_apis_v1,_not_recommended/querying_job_execution_object_details.rst create mode 100644 api-ref/source/apis/job_execution_object_apis_v1,_not_recommended/querying_the_job_execution_object_list.rst create mode 100644 api-ref/source/apis/job_object_apis_v1,_not_recommended/adding_a_job_and_executing_the_job.rst create mode 100644 api-ref/source/apis/job_object_apis_v1,_not_recommended/creating_a_job_object.rst create mode 100644 api-ref/source/apis/job_object_apis_v1,_not_recommended/deleting_a_job_object.rst create mode 100644 api-ref/source/apis/job_object_apis_v1,_not_recommended/executing_a_job_object.rst create mode 100644 api-ref/source/apis/job_object_apis_v1,_not_recommended/index.rst create mode 100644 api-ref/source/apis/job_object_apis_v1,_not_recommended/querying_exe_object_details.rst create mode 100644 api-ref/source/apis/job_object_apis_v1,_not_recommended/querying_job_object_details.rst create mode 100644 api-ref/source/apis/job_object_apis_v1,_not_recommended/querying_the_exe_object_list_of_jobs.rst create mode 100644 api-ref/source/apis/job_object_apis_v1,_not_recommended/querying_the_job_object_list.rst create mode 100644 api-ref/source/apis/job_object_apis_v1,_not_recommended/updating_a_job_object.rst create mode 100644 api-ref/source/apis/job_object_apis_v2/adding_and_executing_a_job.rst create mode 100644 api-ref/source/apis/job_object_apis_v2/deleting_jobs_in_batches.rst create mode 100644 api-ref/source/apis/job_object_apis_v2/index.rst create mode 100644 api-ref/source/apis/job_object_apis_v2/obtain_the_sql_result.rst create mode 100644 api-ref/source/apis/job_object_apis_v2/querying_a_list_of_jobs.rst create mode 100644 api-ref/source/apis/job_object_apis_v2/querying_information_about_a_job.rst create mode 100644 api-ref/source/apis/job_object_apis_v2/terminating_a_job.rst create mode 100644 api-ref/source/apis/tag_management_apis/adding_a_tag_to_a_specified_cluster.rst create mode 100644 api-ref/source/apis/tag_management_apis/adding_or_deleting_cluster_tags_in_batches.rst create mode 100644 api-ref/source/apis/tag_management_apis/deleting_a_tag_of_a_specified_cluster.rst create mode 100644 api-ref/source/apis/tag_management_apis/index.rst create mode 100644 api-ref/source/apis/tag_management_apis/querying_a_list_of_clusters_with_specified_tags.rst create mode 100644 api-ref/source/apis/tag_management_apis/querying_all_tags.rst create mode 100644 api-ref/source/apis/tag_management_apis/querying_tags_of_a_specified_cluster.rst create mode 100644 api-ref/source/appendix/ecs_specifications_used_by_mrs.rst create mode 100644 api-ref/source/appendix/index.rst create mode 100644 api-ref/source/appendix/obtain_mrs_cluster_information.rst create mode 100644 api-ref/source/appendix/obtaining_a_project_id.rst create mode 100644 api-ref/source/appendix/obtaining_account_id.rst create mode 100644 api-ref/source/appendix/roles_and_components_supported_by_mrs11.rst create mode 100644 api-ref/source/appendix/status_codes.rst create mode 100644 api-ref/source/before_you_start/api_calling.rst create mode 100644 api-ref/source/before_you_start/concepts.rst create mode 100644 api-ref/source/before_you_start/constraints.rst create mode 100644 api-ref/source/before_you_start/endpoints.rst create mode 100644 api-ref/source/before_you_start/index.rst create mode 100644 api-ref/source/before_you_start/overview.rst create mode 100644 api-ref/source/before_you_start/selecting_an_api_type.rst create mode 100644 api-ref/source/calling_apis/authentication.rst create mode 100644 api-ref/source/calling_apis/index.rst create mode 100644 api-ref/source/calling_apis/making_an_api_request.rst create mode 100644 api-ref/source/calling_apis/response.rst create mode 100644 api-ref/source/change_history.rst create mode 100644 api-ref/source/mrs_manager_api/api_usage_guide/api_calling_process.rst create mode 100644 api-ref/source/mrs_manager_api/api_usage_guide/examples.rst create mode 100644 api-ref/source/mrs_manager_api/api_usage_guide/index.rst create mode 100644 api-ref/source/mrs_manager_api/api_usage_guide/introduction_to_mrs_manager_apis.rst create mode 100644 api-ref/source/mrs_manager_api/index.rst create mode 100644 api-ref/source/mrs_manager_api/mrs_manager_cas_apis/index.rst create mode 100644 api-ref/source/mrs_manager_api/mrs_manager_cas_apis/logging_in_to_the_cas.rst create mode 100644 api-ref/source/mrs_manager_api/mrs_manager_cas_apis/logging_out_of_the_cas.rst create mode 100644 api-ref/source/mrs_manager_api/mrs_manager_web_apis/checking_the_login.rst create mode 100644 api-ref/source/mrs_manager_api/mrs_manager_web_apis/index.rst create mode 100644 api-ref/source/mrs_manager_api/mrs_manager_web_apis/logging_out_of_a_session.rst create mode 100644 api-ref/source/mrs_manager_api/mrs_manager_web_apis/modifying_the_password_of_the_current_login_user.rst create mode 100644 api-ref/source/mrs_manager_api/mrs_manager_web_apis/querying_basic_information_about_a_specified_cluster.rst create mode 100644 api-ref/source/mrs_manager_api/mrs_manager_web_apis/querying_monitoring_data.rst create mode 100644 api-ref/source/mrs_manager_api/mrs_manager_web_apis/querying_summary_of_a_specified_service.rst create mode 100644 api-ref/source/mrs_manager_api/mrs_manager_web_apis/querying_the_command_execution_progress.rst create mode 100644 api-ref/source/mrs_manager_api/mrs_manager_web_apis/querying_the_health_status_of_a_specified_cluster.rst create mode 100644 api-ref/source/mrs_manager_api/mrs_manager_web_apis/saving_configurations.rst create mode 100644 api-ref/source/mrs_manager_api/mrs_manager_web_apis/starting_a_service.rst create mode 100644 api-ref/source/mrs_manager_api/mrs_manager_web_apis/stopping_a_service.rst diff --git a/api-ref/source/_static/images/en-us_image_0000001298246380.png b/api-ref/source/_static/images/en-us_image_0000001298246380.png new file mode 100644 index 0000000000000000000000000000000000000000..68bfaf5ab99e97ba4e08eebdbe306556c491b67b GIT binary patch literal 36307 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%0A+ul^`7|j`|2?}O}|;BoiLtc9Pu+?8*)B3 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 literal 0 HcmV?d00001 diff --git a/api-ref/source/_static/images/en-us_image_0000001298566184.png b/api-ref/source/_static/images/en-us_image_0000001298566184.png new file mode 100644 index 0000000000000000000000000000000000000000..94736e3a3c70ad1e7d4b9cc6d7696e5df298f9af GIT binary patch literal 24961 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 literal 0 HcmV?d00001 diff --git a/api-ref/source/_static/images/en-us_image_0000001298725832.png b/api-ref/source/_static/images/en-us_image_0000001298725832.png new file mode 100644 index 0000000000000000000000000000000000000000..0adf514b3fa6debb5004706a2cf83c5ea6cf50d3 GIT binary patch literal 27651 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 literal 0 HcmV?d00001 diff --git a/api-ref/source/_static/images/en-us_image_0000001351245885.png b/api-ref/source/_static/images/en-us_image_0000001351245885.png new file mode 100644 index 0000000000000000000000000000000000000000..508f4c13a220594590502d0ce21ddac41a1f0167 GIT binary patch literal 22183 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

MsdAc+3IvaDb`0+@{6{iKa+%bXzHOo7P%Q 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

R#o8n`n6q9$aC7F;!{`g>aRe6r@BV1zbo!H&= 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 DD|@ZM literal 0 HcmV?d00001 diff --git a/api-ref/source/api_overview.rst b/api-ref/source/api_overview.rst new file mode 100644 index 0000000..8769bed --- /dev/null +++ b/api-ref/source/api_overview.rst @@ -0,0 +1,138 @@ +:original_name: mrs_02_0007.html + +.. _mrs_02_0007: + +API Overview +============ + +:ref:`Table 1 ` describes MRS APIs that meet RESTful API design standards. + +:ref:`Table 2 ` lists MRS Manager APIs provided by MRS. + +.. _mrs_02_0007__table40115147113128: + +.. table:: **Table 1** APIs + + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | API | Function | API URI | + +================================+======================================================================+=========================================================================================+ + | Data source APIs | :ref:`Creating a Data Source ` | POST /v1.1/{project_id}/data-sources | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Updating a Data Source ` | PUT /v1.1/{project_id}/data-sources/{data_source_id} | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Querying the Data Source List ` | GET /v1.1/{project_id}/data-sources | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Querying the Data Source Details ` | GET /v1.1/{project_id}/data-sources/{data_source_id} | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Deleting a Data Source ` | DELETE /v1.1/{project_id}/data-sources/{data_source_id} | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | Cluster management APIs (V2) | :ref:`Creating Clusters ` | POST /v2/{project_id}/clusters | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | Cluster management APIs (V1) | :ref:`Creating a Cluster and Running a Job ` | POST /v1.1/{project_id}/run-job-flow | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Resizing a Cluster ` | PUT /v1.1/{project_id}/cluster_infos/{cluster_id} | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Querying a Cluster List ` | GET /v1.1/{project_id}/cluster_infos | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Querying Cluster Details ` | GET /v1.1/{project_id}/cluster_infos/{cluster_id} | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Deleting a Cluster ` | DELETE /v1.1/{project_id}/clusters/{cluster_id} | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Querying a Host List ` | GET /v1.1/{project_id}/clusters/{cluster_id}/hosts | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | Job binary object APIs | :ref:`Creating a Job Binary Object ` | POST /v1.1/{project_id}/job-binaries | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Updating a Job Binary Object ` | PUT /v1.1/{project_id}/job-binaries/{job_binary_id} | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Querying the Binary Object List ` | GET /v1.1/{project_id}/job-binaries | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Querying the Binary Object Details ` | GET /v1.1/{project_id}/job-binaries/{job_binary_id} | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Deleting a Job Binary Object ` | DELETE /v1.1/{project_id}/job-binaries/{job_binary_id} | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | Job object APIs (V1) | :ref:`Adding a Job and Executing the Job ` | POST /v1.1/{project_id}/jobs/submit-job | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Creating a Job Object ` | POST /v1.1/{project_id}/jobs | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Updating a Job Object ` | PATCH /v1.1/{project_id}/jobs/{job_id} | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Executing a Job Object ` | POST /v1.1/{project_id}/jobs/{job_id}/execute | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Querying the Job Object List ` | GET /v1.1/{project_id}/jobs | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Querying Job Object Details ` | GET /v1.1/{project_id}/jobs/{job_id} | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Querying the exe Object List of Jobs ` | GET /v1.1/{project_id}/job-exes | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Querying exe Object Details ` | GET /v1.1/{project_id}/job-exes/{job_exe_id} | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Deleting a Job Object ` | DELETE /v1.1/{project_id}/jobs/{job_id} | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | Job execution object APIs (V1) | :ref:`Querying the Job Execution Object List ` | GET /v1.1/{project_id}/job-executions | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Querying Job Execution Object Details ` | GET /v1.1/{project_id}/job-executions/{job_execution_id} | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Canceling Job Execution ` | GET /v1.1/{project_id}/job-executions/{job_execution_id}/cancel | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Deleting a Job Execution Object ` | DELETE /v1.1/{project_id}/job-executions/{job_execution_id} | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | Job object APIs (V2) | :ref:`Adding and Executing a Job ` | POST /v2/{project_id}/clusters/{cluster_id}/job-executions | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Querying Information About a Job ` | GET /v2/{project_id}/clusters/{cluster_id}/job-executions/{job_execution_id} | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Querying a List of Jobs ` | GET /v2/{project_id}/clusters/{cluster_id}/job-executions | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Terminating a Job ` | POST /v2/{project_id}/clusters/{cluster_id}/job-executions/{job_execution_id}/kill | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Deleting Jobs in Batches ` | POST /v2/{project_id}/clusters/{cluster_id}/job-executions/batch-delete | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Obtain the SQL Result ` | GET /v2/{project_id}/clusters/{cluster_id}/job-executions/{job_execution_id}/sql-result | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | Auto scaling APIs | :ref:`Configuring an Auto Scaling Rule ` | POST /v1.1/{project_id}/autoscaling-policy/{cluster_id} | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | Tag Management APIs | :ref:`Adding a Tag to a Specified Cluster ` | POST /v1.1/{project_id}/clusters/{cluster_id}/tags | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Deleting a Tag of a Specified Cluster ` | DELETE /v1.1/{project_id}/clusters/{cluster_id}/tags/{key} | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Querying Tags of a Specified Cluster ` | GET /v1.1/{project_id}/clusters/{cluster_id}/tags | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Adding or Deleting Cluster Tags in Batches ` | POST /v1.1/{project_id}/clusters/{cluster_id}/tags/action | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Querying All Tags ` | GET /v1.1/{project_id}/clusters/tags | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + | | :ref:`Querying a List of Clusters with Specified Tags ` | POST /v1.1/{project_id}/clusters/resource_instances/action | + +--------------------------------+----------------------------------------------------------------------+-----------------------------------------------------------------------------------------+ + +.. _mrs_02_0007__table521983381017: + +.. table:: **Table 2** MRS Manager API + + +---------------------+---------------------------------------------------------------------------+-------------------------------------------------------------------------+ + | API | Function | API URI | + +=====================+===========================================================================+=========================================================================+ + | MRS Manager CAS API | :ref:`Logging In to the CAS ` | POST /cas/login | + +---------------------+---------------------------------------------------------------------------+-------------------------------------------------------------------------+ + | | :ref:`Logging Out of the CAS ` | POST /cas/logout | + +---------------------+---------------------------------------------------------------------------+-------------------------------------------------------------------------+ + | MRS Manager WEB API | :ref:`Checking the Login ` | GET /web/v1/access/login_check | + +---------------------+---------------------------------------------------------------------------+-------------------------------------------------------------------------+ + | | :ref:`Modifying the Password of the Current Login User ` | POST /web/v1/access/modify_self_password | + +---------------------+---------------------------------------------------------------------------+-------------------------------------------------------------------------+ + | | :ref:`Querying the Health Status of a Specified Cluster ` | GET /web/v1/cluster/{cluster_id}/status | + +---------------------+---------------------------------------------------------------------------+-------------------------------------------------------------------------+ + | | :ref:`Querying Basic Information About a Specified Cluster ` | GET /web/v1/clusters | + +---------------------+---------------------------------------------------------------------------+-------------------------------------------------------------------------+ + | | :ref:`Querying the Command Execution Progress ` | GET /web/v1/common/command/{command_id}/progress | + +---------------------+---------------------------------------------------------------------------+-------------------------------------------------------------------------+ + | | :ref:`Saving Configurations ` | POST /web/v1/config/cluster/{cluster_id}/save | + +---------------------+---------------------------------------------------------------------------+-------------------------------------------------------------------------+ + | | :ref:`Logging Out Of a Session ` | GET /web/v1/logout_action | + +---------------------+---------------------------------------------------------------------------+-------------------------------------------------------------------------+ + | | :ref:`Starting a Service ` | POST /web/v1/maintain/cluster/{cluster_id}/service/{service_name}/start | + +---------------------+---------------------------------------------------------------------------+-------------------------------------------------------------------------+ + | | :ref:`Stopping a Service ` | POST /web/v1/maintain/cluster/{cluster_id}/service/{service_name}/stop | + +---------------------+---------------------------------------------------------------------------+-------------------------------------------------------------------------+ + | | :ref:`Querying Monitoring Data ` | GET /web/v1/monitor/metrics_info | + +---------------------+---------------------------------------------------------------------------+-------------------------------------------------------------------------+ + | | :ref:`Querying Summary of a Specified Service ` | GET /web/v1/cluster/{cluster_id}/services/{service_name} | + +---------------------+---------------------------------------------------------------------------+-------------------------------------------------------------------------+ diff --git a/api-ref/source/apis/auto_scaling_apis/configuring_an_auto_scaling_rule.rst b/api-ref/source/apis/auto_scaling_apis/configuring_an_auto_scaling_rule.rst new file mode 100644 index 0000000..41039b2 --- /dev/null +++ b/api-ref/source/apis/auto_scaling_apis/configuring_an_auto_scaling_rule.rst @@ -0,0 +1,440 @@ +:original_name: mrs_02_0056.html + +.. _mrs_02_0056: + +Configuring an Auto Scaling Rule +================================ + +Function +-------- + +This API is used to configure an auto scaling rule. + +The API used for cluster creation and job execution can also be used to create an auto scaling rule. + +URI +--- + +- Format + + POST /v1.1/{project_id}/autoscaling-policy/{cluster_id} + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | cluster_id | Yes | Cluster ID | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +**Request parameters** + +:ref:`Table 2 ` and :ref:`Table 3 ` describe the request parameters. + +.. _mrs_02_0056__table27243156151210: + +.. table:: **Table 2** **node_group** parameter description + + +------------+-----------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +============+===========+========+===========================================================================================================================================================================+ + | node_group | Yes | String | Type of the node to which an auto scaling rule applies. Currently, only Task nodes support auto scaling rules, that is, the request value is **task_node_default_group**. | + +------------+-----------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0056__table50379282141720: + +.. table:: **Table 3** **auto_scaling_policy** parameter description + + +---------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=====================+=================+=================+==========================================================================================================================================================================================+ + | auto_scaling_enable | Yes | Boolean | Whether to enable the auto scaling rule. | + +---------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | min_capacity | Yes | Integer | Minimum number of nodes left in the node group. | + | | | | | + | | | | Value range: 0 to 500 | + +---------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | max_capacity | Yes | Integer | Maximum number of nodes in the node group. | + | | | | | + | | | | Value range: 0 to 500 | + +---------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | resources_plans | No | List | Resource plan list. For details, see :ref:`Table 4 `. If this parameter is left blank, the resource plan is disabled. | + | | | | | + | | | | When auto scaling is enabled, either a resource plan or an auto scaling rule must be configured. | + | | | | | + | | | | MRS 1.6.3 or later supports this parameter. | + +---------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | exec_scripts | No | List | List of custom scaling automation scripts. For details, see :ref:`Table 5 `. If this parameter is left blank, a hook script is disabled. | + | | | | | + | | | | MRS 1.7.2 or later supports this parameter. | + +---------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | rules | No | List | List of auto scaling rules. For details, see :ref:`Table 6 `. | + | | | | | + | | | | When auto scaling is enabled, either a resource plan or an auto scaling rule must be configured. | + +---------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0056__table1979310416120: + +.. table:: **Table 4** **resources_plan** parameter description + + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+===========================================================================================================================================================================================+ + | period_type | Yes | String | Cycle type of a resource plan. Currently, only the following cycle type is supported: | + | | | | | + | | | | - daily | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | start_time | Yes | String | Start time of a resource plan. The value is in the format of **hour:minute**, indicating that the time ranges from 0:00 to 23:59. | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | end_time | Yes | String | End time of a resource plan. The value is in the same format as that of **start_time**. The interval between **end_time** and **start_time** must be greater than or equal to 30 minutes. | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | min_capacity | Yes | Integer | Minimum number of the preserved nodes in a node group in a resource plan. | + | | | | | + | | | | Value range: 0 to 500 | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | max_capacity | Yes | Integer | Maximum number of the preserved nodes in a node group in a resource plan. | + | | | | | + | | | | Value range: 0 to 500 | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0056__tefd2eb7c7838496eadbf4b310193de4a: + +.. table:: **Table 5** **exec_script** parameter description + + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=================================================================================================================================================================================================================================+ + | name | Yes | String | Name of a custom automation script. It must be unique in a same cluster. | + | | | | | + | | | | The value can contain only digits, letters, spaces, hyphens (-), and underscores (_) and must not start with a space. | + | | | | | + | | | | The value can contain 1 to 64 characters. | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | uri | Yes | String | Path of a custom automation script. Set this parameter to an OBS bucket path or a local VM path. | + | | | | | + | | | | - OBS bucket path: Enter a script path manually. for example, **s3a://**\ *XXX*\ **/scale.sh**. | + | | | | - Local VM path: Enter a script path. The script path must start with a slash (/) and end with **.sh**. | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | parameters | No | String | Parameters of a custom automation script. | + | | | | | + | | | | - Multiple parameters are separated by space. | + | | | | - The following predefined system parameters can be transferred: | + | | | | | + | | | | - *${mrs_scale_node_num}*: Number of the nodes to be added or removed | + | | | | - *${mrs_scale_type}*: Scaling type. The value can be **scale_out** or **scale_in**. | + | | | | - *${mrs_scale_node_hostnames}*: Host names of the nodes to be added or removed | + | | | | - *${mrs_scale_node_ips}*: IP addresses of the nodes to be added or removed | + | | | | - *${mrs_scale_rule_name}*: Name of the rule that triggers auto scaling | + | | | | | + | | | | - Other user-defined parameters are used in the same way as those of common shell scripts. Parameters are separated by space. | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | nodes | Yes | List | Type of a node where the custom automation script is executed. The node type can be Master, Core, or Task. | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | active_master | No | Boolean | Whether the custom automation script runs only on the active Master node. | + | | | | | + | | | | The default value is **false**, indicating that the custom automation script can run on all Master nodes. | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | action_stage | Yes | String | Time when a script is executed. | + | | | | | + | | | | The following four options are supported: | + | | | | | + | | | | - **before_scale_out**: before scale-out | + | | | | - **before_scale_in**: before scale-in | + | | | | - **after_scale_out**: after scale-out | + | | | | - **after_scale_in**: after scale-in | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | fail_action | Yes | String | Whether to continue to execute subsequent scripts and create a cluster after the custom automation script fails to be executed. | + | | | | | + | | | | - **continue**: Continue to execute subsequent scripts. | + | | | | - **errorout**: Stop the action. | + | | | | | + | | | | .. note:: | + | | | | | + | | | | - You are advised to set this parameter to **continue** in the commissioning phase so that the cluster can continue to be installed and started no matter whether the custom automation script is executed successfully. | + | | | | - The scale-in operation cannot be undone. Therefore, **fail_action** must be set to **continue** for the scripts that are executed after scale-in. | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0056__t46230cdbc4f641f6b17d64de5747728b: + +.. table:: **Table 6** **rules** parameter description + + +--------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +====================+=================+=================+================================================================================================================================+ + | name | Yes | String | Name of an auto scaling rule. | + | | | | | + | | | | A cluster name can contain only 1 to 64 characters. Only letters, digits, hyphens (-), and underscores (_) are allowed. | + | | | | | + | | | | Rule names must be unique in a node group. | + +--------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ + | description | No | String | Description about an auto scaling rule. | + | | | | | + | | | | It contains a maximum of 1,024 characters. | + +--------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ + | adjustment_type | Yes | String | Auto scaling rule adjustment type. The options are as follows: | + | | | | | + | | | | - **scale_out**: cluster scale-out | + | | | | - **scale_in**: cluster scale-in | + +--------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ + | cool_down_minutes | Yes | Integer | Cluster cooling time after an auto scaling rule is triggered, when no auto scaling operation is performed. The unit is minute. | + | | | | | + | | | | Value range: 0 to 10,080. One week is equal to 10,080 minutes. | + +--------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ + | scaling_adjustment | Yes | Integer | Number of nodes that can be adjusted once. | + | | | | | + | | | | Value range: 1 to 100 | + +--------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ + | trigger | Yes | Trigger | Condition for triggering a rule. For details, see :ref:`Table 7 `. | + +--------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0056__tb0fcdad7ce8f4ebdb4fd9e76d805b5e8: + +.. table:: **Table 7** **trigger** parameter description + + +---------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=====================+=================+=================+==================================================================================================================================================================================================================+ + | metric_name | Yes | String | Metric name. | + | | | | | + | | | | This triggering condition makes a judgment according to the value of the metric. | + | | | | | + | | | | A metric name contains a maximum of 64 characters. | + | | | | | + | | | | :ref:`Table 8 ` lists the supported metric names. | + +---------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | metric_value | Yes | String | Metric threshold to trigger a rule | + | | | | | + | | | | The parameter value must be an integer or number with two decimal places only. :ref:`Table 8 ` provides value types and ranges corresponding to **metric_name**. | + +---------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | comparison_operator | No | String | Metric judgment logic operator. The options are as follows: | + | | | | | + | | | | - **LT**: less than | + | | | | - **GT**: greater than | + | | | | - **LTOE**: less than or equal to | + | | | | - **GTOE**: greater than or equal to | + +---------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | evaluation_periods | Yes | Integer | Number of consecutive five-minute periods, during which a metric threshold is reached | + | | | | | + | | | | Value range: 1 to 288 | + +---------------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0056__td49a8d90c5444d929b277b709d35c445: + +.. table:: **Table 8** Auto scaling metrics + + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | Cluster Type | Metric | Value Type | Description | + +===================+==========================================+=================+==============================================================================================================+ + | Streaming cluster | StormSlotAvailable | Integer | Number of available Storm slots. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | StormSlotAvailablePercentage | Percentage | Percentage of available Storm slots, that is, the proportion of the available slots to total slots. | + | | | | | + | | | | Value range: 0 to 100. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | StormSlotUsed | Integer | Number of the used Storm slots. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | StormSlotUsedPercentage | Percentage | Percentage of the used Storm slots, that is, the proportion of the used slots to total slots. | + | | | | | + | | | | Value range: 0 to 100. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | StormSupervisorMemAverageUsage | Integer | Average memory usage of the Supervisor process of Storm. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | StormSupervisorMemAverageUsagePercentage | Percentage | Average percentage of the used memory of the Supervisor process of Storm to the total memory of the system. | + | | | | | + | | | | Value range: 0 to 100. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | StormSupervisorCPUAverageUsagePercentage | Percentage | Average percentage of the used CPUs of the Supervisor process of Storm to the total CPUs. | + | | | | | + | | | | Value range: 0 to 6000. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | Analysis cluster | YARNAppPending | Integer | Number of pending tasks on Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNAppPendingRatio | Ratio | Ratio of pending tasks on Yarn, that is, the ratio of pending tasks to running tasks on Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNAppRunning | Integer | Number of running tasks on Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNContainerAllocated | Integer | Number of containers allocated to Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNContainerPending | Integer | Number of pending containers on Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNContainerPendingRatio | Ratio | Ratio of pending containers on Yarn, that is, the ratio of pending containers to running containers on Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNCPUAllocated | Integer | Number of virtual CPUs (vCPUs) allocated to Yarn | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNCPUAvailable | Integer | Number of available vCPUs on Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNCPUAvailablePercentage | Percentage | Percentage of available vCPUs on Yarn, that is, the proportion of available vCPUs to total vCPUs. | + | | | | | + | | | | Value range: 0 to 100. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNCPUPending | Integer | Number of pending vCPUs on Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNMemoryAllocated | Integer | Memory allocated to Yarn. The unit is MB. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNMemoryAvailable | Integer | Available memory on Yarn. The unit is MB. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNMemoryAvailablePercentage | Percentage | Percentage of available memory on Yarn, that is, the proportion of available memory to total memory on Yarn. | + | | | | | + | | | | Value range: 0 to 100. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNMemoryPending | Integer | Pending memory on Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + +.. note:: + + When the value type is percentage or ratio in :ref:`Table 8 `, the valid value can be accurate to percentile. The percentage metric value is a decimal value with a percent sign (%) removed. For example, 16.80 represents 16.80%. + +Response +-------- + +.. table:: **Table 9** Response parameter description + + +-----------------------+-----------------------+--------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+============================================+ + | result | String | Operation result | + | | | | + | | | - succeeded: The operation is successful. | + +-----------------------+-----------------------+--------------------------------------------+ + +Example +------- + +- Example request + + .. code-block:: + + { + "node_group":"task_node_default_group", + "auto_scaling_policy": { + "auto_scaling_enable": true, + "min_capacity": "1", + "max_capacity": "3", + "resources_plans": [{ + "period_type": "daily", + "start_time": "9:50", + "end_time": "10:20", + "min_capacity": "2", + "max_capacity": "3" + },{ + "period_type": "daily", + "start_time": "10:20", + "end_time": "12:30", + "min_capacity": "0", + "max_capacity": "2" + }], + "exec_scripts": [{ + "name": "before_scale_out", + "uri": "s3a://XXX/zeppelin_install.sh", + "parameters": "", + "nodes": [ + "master", + "core", + "task" + ], + "active_master": "true", + "action_stage": "before_scale_out", + "fail_action": "continue" + },{ + "name": "after_scale_out", + "uri": "s3a://XXX/storm_rebalance.sh", + "parameters": "", + "nodes": [ + "master", + "core", + "task" + ], + "active_master": "true", + "action_stage": "after_scale_out", + "fail_action": "continue" + }], + "rules": [{ + "name": "default-expand-1", + "adjustment_type": "scale_out", + "cool_down_minutes": 5, + "scaling_adjustment": 1, + "trigger": { + "metric_name": "YARNMemoryAvailablePercentage", + "metric_value": "25", + "comparison_operator": "LT", + "evaluation_periods": 10 + } + }, + { + "name": "default-shrink-1", + "adjustment_type": "scale_in", + "cool_down_minutes": 5, + "scaling_adjustment": 1, + "trigger": { + "metric_name": "YARNMemoryAvailablePercentage", + "metric_value": "70", + "comparison_operator": "GT", + "evaluation_periods": 10 + } + }] + } + } + + .. note:: + + A new auto scaling rule will overwrite the auto scaling rule saved in the original database. If you want to modify the original rule, query the original rule first, modify the rule, and submit a modification task. For details, see :ref:`Querying Cluster Details `. + +- Example response + + .. code-block:: + + { "result": "succeeded" } + +Status Code +----------- + +:ref:`Table 10 ` describes the status code of this API. + +.. _mrs_02_0056__table5043525610328: + +.. table:: **Table 10** Status code + + =========== ========================================== + Status Code Description + =========== ========================================== + 200 The cluster has been successfully created. + =========== ========================================== + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/auto_scaling_apis/index.rst b/api-ref/source/apis/auto_scaling_apis/index.rst new file mode 100644 index 0000000..bedd296 --- /dev/null +++ b/api-ref/source/apis/auto_scaling_apis/index.rst @@ -0,0 +1,14 @@ +:original_name: mrs_02_0054.html + +.. _mrs_02_0054: + +Auto Scaling APIs +================= + +- :ref:`Configuring an Auto Scaling Rule ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + configuring_an_auto_scaling_rule diff --git a/api-ref/source/apis/cluster_management_apis_v1/creating_a_cluster_and_running_a_job.rst b/api-ref/source/apis/cluster_management_apis_v1/creating_a_cluster_and_running_a_job.rst new file mode 100644 index 0000000..9a5c5de --- /dev/null +++ b/api-ref/source/apis/cluster_management_apis_v1/creating_a_cluster_and_running_a_job.rst @@ -0,0 +1,1429 @@ +:original_name: mrs_02_0028.html + +.. _mrs_02_0028: + +Creating a Cluster and Running a Job +==================================== + +Function +-------- + +This API is used to create an MRS cluster and submit a job in the cluster. This API is incompatible with Sahara. + +A maximum of 10 clusters can be concurrently created. + +Before using the API, you need to obtain the resources listed in :ref:`Table 1 `. + +.. _mrs_02_0028__tbbd2986d18874f82a8ab886ac25a57f8: + +.. table:: **Table 1** Obtaining resources + + +-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Resource | How to Obtain | + +===================================+=======================================================================================================================================================================================+ + | VPC | See operation instructions in **VPC > Querying VPCs** and **VPC > Creating a VPC** in the *VPC API Reference*. | + +-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Subnet | See operation instructions in **Subnet > Querying Subnets** and **Subnet > Creating a Subnet** in the *VPC API Reference*. | + +-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Key Pair | See operation instructions in **ECS SSH Key Management > Querying SSH Key Pairs** and **ECS SSH Key Management > Creating and Importing an SSH Key Pair** in the *ECS API Reference*. | + +-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Region | Obtain the region and AZ information. For more information about regions and AZs, see `Regions and Endpoints `__. | + +-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Version | Currently, the following versions are supported: MRS 1.6.3, MRS 1.7.2, MRS 1.9.2, MRS 2.1.0, MRS 3.1.0-LTS.1 and MRS 3.1.2-LTS.3. | + +-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Component | - MRS 3.1.2-LTS.3 supports the following components: | + | | | + | | - The analysis cluster contains the following components: Hadoop, Spark2x, HBase, Hive, Hue, HetuEngine, Loader, Flink, Oozie, ZooKeeper, Ranger, and Tez. | + | | - The streaming cluster contains the following components: Kafka, Flume, ZooKeeper, and Ranger. | + | | - The hybrid cluster contains the following components: Hadoop, Spark2x, HBase, Hive, Hue, HetuEngine, Loader, Flink, Oozie, ZooKeeper, Ranger, Tez, Kafka, and Flume. | + | | - A custom cluster contains the following components: Hadoop, Spark2x, HBase, Hive, Hue, HetuEngine, Loader, Kafka, Flume, Flink, Oozie, ZooKeeper, Ranger, Tez, and ClickHouse. | + | | | + | | - MRS 3.1.0-LTS.1 supports the following components: | + | | | + | | - The analysis cluster contains the following components: Hadoop, Spark2x, HBase, Hive, Hue, HetuEngine, Loader, Flink, Oozie, ZooKeeper, Ranger, and Tez. | + | | - The streaming cluster contains the following components: Kafka, Flume, ZooKeeper, and Ranger. | + | | - The hybrid cluster contains the following components: Hadoop, Spark2x, HBase, Hive, Hue, HetuEngine, Loader, Flink, Oozie, ZooKeeper, Ranger, Tez, Kafka, and Flume. | + | | - A custom cluster contains the following components: Hadoop, Spark2x, HBase, Hive, Hue, HetuEngine, Loader, Kafka, Flume, Flink, Oozie, ZooKeeper, Ranger, and Tez. | + | | | + | | - MRS 2.1.0 supports the following components: | + | | | + | | - The analysis cluster contains the following components: Presto, Hadoop, Spark, HBase, Hive, Hue, Loader, Tez, Flink. | + | | - The streaming cluster contains the following components: Kafka, Storm, and Flume. | + | | - The hybrid cluster contains the following components: Hadoop, Hive, Presto, Spark, Tez, and Flink. | + | | | + | | - MRS 1.9.2 supports the following components: | + | | | + | | - The analysis cluster contains the following components: Presto, Hadoop, Spark, HBase, Opentsdb, Hive, Hue, Loader, Tez, Flink, Alluxio and Ranger | + | | - The streaming cluster contains the following components: Kafka, KafkaManager, Storm, and Flume. | + | | - The hybrid cluster contains the following components: Hadoop, Hive, Presto, Spark, Tez, Kafka, Flink, and Ranger. | + | | | + | | - The following table lists the components supported by MRS 1.7.2, MRS 1.6.3: | + | | | + | | - The analysis cluster contains the following components: Hadoop, Spark, HBase, Hive, Hue, and Loader | + | | - The streaming cluster contains the following components: Kafka, Storm, and Flume. | + +-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +URI +--- + +- Format + + POST /v1.1/{project_id}/run-job-flow + +- Parameter description + + .. table:: **Table 2** URI parameter description + + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +.. table:: **Table 3** Request parameter description + + +-----------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=======================+=================+=================+==========================================================================================================================================================================================================================================================================================================================================================================+ + | billing_type | Yes | Integer | Cluster billing mode. Set this parameter to **12**. | + +-----------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | data_center | Yes | String | Region of the cluster. For details, see `Regions and Endpoints `__. | + +-----------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | available_zone_id | Yes | String | AZ ID. For details, see `Regions and Endpoints `__. | + | | | | | + | | | | - AZ1(eu-de-01):bf84aba586ce4e948da0b97d9a7d62fb | + | | | | - AZ2(eu-de-02):bf84aba586ce4e948da0b97d9a7d62fc | + +-----------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | cluster_name | Yes | String | Cluster name. It must be unique. | + | | | | | + | | | | It contains only 1 to 64 characters. Only letters, digits, hyphens (-), and underscores (_) are allowed. | + +-----------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | vpc | Yes | String | Name of the VPC where the subnet locates | + | | | | | + | | | | Perform the following operations to obtain the VPC name from the VPC management console: | + | | | | | + | | | | #. Log in to the management console. | + | | | | #. Click **Virtual Private Cloud** and select **Virtual Private Cloud** from the left list. | + | | | | | + | | | | On the **Virtual Private Cloud** page, obtain the VPC name from the list. | + +-----------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | vpc_id | Yes | String | ID of the VPC where the subnet locates | + | | | | | + | | | | Perform the following operations to obtain the VPC ID from the VPC management console: | + | | | | | + | | | | #. Log in to the management console. | + | | | | #. Click **Virtual Private Cloud** and select **Virtual Private Cloud** from the left list. | + | | | | | + | | | | On the **Virtual Private Cloud** page, obtain the VPC ID from the list. | + +-----------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | subnet_id | Yes | String | Network ID | + | | | | | + | | | | Perform the following operations to obtain the network ID of the VPC from the VPC management console: | + | | | | | + | | | | #. Log in to the management console. | + | | | | #. Click **Virtual Private Cloud** and select **Virtual Private Cloud** from the left list. | + | | | | | + | | | | On the **Virtual Private Cloud** page, obtain the network ID of the VPC from the list. | + +-----------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | subnet_name | Yes | String | Subnet name | + | | | | | + | | | | Perform the following operations to obtain the subnet name from the VPC management console: | + | | | | | + | | | | #. Log in to the management console. | + | | | | #. Click **Virtual Private Cloud** and select **Virtual Private Cloud** from the left list. | + | | | | | + | | | | On the **Virtual Private Cloud** page, obtain the subnet name of the VPC from the list. | + +-----------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | security_groups_id | No | String | Security group ID of the cluster | + | | | | | + | | | | - If this parameter is left blank, MRS automatically creates a security group, whose name starts with **mrs_{cluster_name}**. | + | | | | - If this parameter is not left blank, a fixed security group is used to create a cluster. The transferred ID must be the security group ID owned by the current tenant. The security group must include an inbound rule in which all protocols and all ports are allowed and the source is the IP address of the specified node on the management plane. | + +-----------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | tags | No | Array | Cluster tag | + | | | | | + | | | | - A cluster allows a maximum of 10 tags. A tag name (key) must be unique in a cluster. | + | | | | - A tag key or value cannot contain the following special characters: ``=*<>\,|/`` | + +-----------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | cluster_version | Yes | String | Cluster version | + | | | | | + | | | | Possible values are as follows: | + | | | | | + | | | | - MRS 1.6.3 | + | | | | - MRS 1.7.2 | + | | | | - MRS 1.9.2 | + | | | | - MRS 2.1.0 | + | | | | - MRS 3.1.0-LTS.1 | + | | | | - MRS 3.1.2-LTS.3 | + +-----------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | cluster_type | No | Integer | Cluster type | + | | | | | + | | | | - **0**: analysis cluster | + | | | | - **1**: streaming cluster | + | | | | | + | | | | The default value is **0**. | + | | | | | + | | | | Note: Currently, hybrid clusters cannot be created using APIs. | + +-----------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | safe_mode | Yes | Integer | Running mode of an MRS cluster | + | | | | | + | | | | - **0**: normal cluster. In a normal cluster, Kerberos authentication is disabled, and users can use all functions provided by the cluster. | + | | | | - **1**: security cluster. In a security cluster, Kerberos authentication is enabled, and common users cannot use the file management and job management functions of an MRS cluster or view cluster resource usage and the job records of Hadoop and Spark. To use these functions, the users must obtain the relevant permissions from the MRS Manager administrator. | + | | | | | + | | | | .. note:: | + | | | | | + | | | | For MRS 1.7.2 or earlier, the request body contains the **cluster_admin_secret** field only when **safe_mode** is set to **1**. | + +-----------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | cluster_admin_secret | Yes | String | Password of the MRS Manager administrator | + | | | | | + | | | | - Must contain 8 to 32 characters. | + | | | | - Must contain at least three of the following: | + | | | | | + | | | | - Lowercase letters | + | | | | - Uppercase letters | + | | | | - Digits | + | | | | - Special characters: :literal:`\`~!@#$%^&*()-_=+\\|[{}];:'",<.>/?` and space | + | | | | | + | | | | - Cannot be the username or the username spelled backwards. | + | | | | | + | | | | .. note:: | + | | | | | + | | | | For MRS 1.7.2 or earlier, this parameter is mandatory only when **safe_mode** is set to **1**. | + +-----------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | login_mode | Yes | Integer | Cluster login mode | + | | | | | + | | | | - **0**: password | + | | | | - **1**: key pair | + | | | | | + | | | | The default value is **1**. | + | | | | | + | | | | - If **login_mode** is set to **0**, the request body contains the **cluster_master_secret** field. | + | | | | - If **login_mode** is set to **1**, the request body contains the **node_public_cert_name** field. | + | | | | | + | | | | .. note:: | + | | | | | + | | | | This parameter is valid only for clusters of MRS 1.6.3 or later instead of clusters of versions earlier than MRS 1.6.3. | + +-----------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | cluster_master_secret | No | String | Password of user **root** for logging in to a cluster node | + | | | | | + | | | | If **login_mode** is set to **0**, the request body contains the **cluster_master_secret** field. | + | | | | | + | | | | A password must meet the following requirements: | + | | | | | + | | | | - Must be 8 to 26 characters long. | + | | | | - Must contain at least three of the following: uppercase letters, lowercase letters, digits, and special characters (``!@$%^-_=+[{}]:,./?``), but must not contain spaces. | + | | | | - Cannot be the username or the username spelled backwards. | + +-----------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | node_public_cert_name | No | String | Name of a key pair You can use a key pair to log in to the Master node in the cluster. | + | | | | | + | | | | If **login_mode** is set to **1**, the request body contains | + | | | | | + | | | | the **node_public_cert_name** field. | + +-----------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | log_collection | No | Integer | Whether to collect logs when cluster creation fails | + | | | | | + | | | | - **0**: Do not collect. | + | | | | - **1**: Collect. | + | | | | | + | | | | The default value is **1**, indicating that OBS buckets will be created and only used to collect logs that record MRS cluster creation failures. | + +-----------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | node_groups | No | Array | List of nodes. For more parameter description, see :ref:`Table 4 `. | + | | | | | + | | | | .. note:: | + | | | | | + | | | | You can select either this parameter or the parameter listed in :ref:`Table 5 `. | + +-----------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | component_list | Yes | Array | List of service components to be installed. For more parameter description, see :ref:`Table 7 `. | + +-----------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | add_jobs | No | Array | Jobs can be submitted when a cluster is created. Currently, only one job can be created. For details about job parameters, see :ref:`Table 8 `. | + +-----------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | bootstrap_scripts | No | Array | Bootstrap action script information. For more parameter description, see :ref:`Table 15 `. | + | | | | | + | | | | MRS 1.7.2 or later supports this parameter. | + +-----------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0028__table3419221413: + +.. table:: **Table 4** **node_groups** parameter description + + +---------------------+-----------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=====================+=================+===================+=============================================================================================================================================================================================================================+ + | group_name | Yes | String | Node group name. | + | | | | | + | | | | - master_node_default_group | + | | | | - core_node_analysis_group | + | | | | - core_node_streaming_group | + | | | | - task_node_analysis_group | + | | | | - task_node_streaming_group | + +---------------------+-----------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | node_num | Yes | Integer | Number of nodes. The value ranges from 0 to 500 and the default value is **0**. The total number of Core and Task nodes cannot exceed 500. | + +---------------------+-----------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | node_size | Yes | String | Instance specifications of a node. For details about the configuration method, see the remarks of **master_node_size**. | + +---------------------+-----------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | root_volume_size | Yes | String | Data disk storage space of a node. | + +---------------------+-----------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | root_volume_type | Yes | String | Data disk storage type of a node. Currently, SATA, SAS and SSD are supported. | + | | | | | + | | | | - SATA: Common I/O | + | | | | - SAS: High I/O | + | | | | - SSD: Ultra-high I/O | + +---------------------+-----------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | data_volume_type | Yes | String | Data disk storage type of a node. Currently, SATA, SAS and SSD are supported. | + | | | | | + | | | | - SATA: Common I/O | + | | | | - SAS: High I/O | + | | | | - SSD: Ultra-high I/O | + +---------------------+-----------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | data_volume_count | Yes | Integer | Number of data disks of a node. | + | | | | | + | | | | Value range: 0 to 10 | + +---------------------+-----------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | data_volume_size | Yes | Integer | Data disk storage space of a node. | + | | | | | + | | | | Value range: 100 GB to 32,000 GB | + +---------------------+-----------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | auto_scaling_policy | No | AutoScalingPolicy | Auto scaling rule information. This parameter is valid only when **group_name** is set to **task_node_analysis_group** or **task_node_streaming_group**. For details, see :ref:`Table 5 `. | + +---------------------+-----------------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0028__table1231363418103: + +.. table:: **Table 5** Node configuration parameters + + +--------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +==========================+=================+=================+==================================================================================================================================================================================================================================================================================================================================================================================================================================+ + | master_node_num | Yes | Integer | Number of Master nodes. If cluster HA is enabled, set this parameter to **2**. If cluster HA is disabled, set this parameter to **1**. | + +--------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | master_node_size | Yes | String | Instance specifications of the Master node, for example, **c6.4xlarge.4linux.mrs**. MRS supports host specifications determined by CPU, memory, and disk space. For details about instance specifications, see :ref:`ECS Specifications Used by MRS `. | + +--------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | core_node_num | Yes | Integer | Number of Core nodes | + | | | | | + | | | | Value range: 1 to 500 | + | | | | | + | | | | A maximum of 500 Core nodes are supported by default. If more than 500 Core nodes are required, contact technical support. | + +--------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | core_node_size | Yes | String | Instance specifications of the Core node, for example, **c6.4xlarge.4linux.mrs**. | + +--------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | master_data_volume_type | No | String | This parameter is a multi-disk parameter, indicating the data disk storage type of the Master node. Currently, SATA, SAS and SSD are supported. | + +--------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | master_data_volume_size | No | Integer | This parameter is a multi-disk parameter, indicating the data disk storage space of the Master node. To increase data storage capacity, you can add disks at the same time when creating a cluster. | + | | | | | + | | | | Value range: 100 GB to 32,000 GB | + +--------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | master_data_volume_count | No | Integer | This parameter is a multi-disk parameter, indicating the number of data disks of the Master node. | + | | | | | + | | | | The value can be set to **1** only. | + +--------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | core_data_volume_type | No | String | This parameter is a multi-disk parameter, indicating the data disk storage type of the Core node. Currently, SATA, SAS and SSD are supported. | + +--------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | core_data_volume_size | No | Integer | This parameter is a multi-disk parameter, indicating the data disk storage space of the Core node. To increase data storage capacity, you can add disks at the same time when creating a cluster. | + | | | | | + | | | | Value range: 100 GB to 32,000 GB | + +--------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | core_data_volume_count | No | Integer | This parameter is a multi-disk parameter, indicating the number of data disks of the Core node. | + | | | | | + | | | | Value range: 1 to 10 | + +--------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | volume_type | No | String | Data disk storage type of the Master and Core nodes. Currently, SATA, SAS and SSD are supported. Disk parameters can be represented by **volume_type** and **volume_size**, or multi-disk parameters. If the **volume_type** and **volume_size** parameters coexist with the multi-disk parameters, the system reads the **volume_type** and **volume_size** parameters first. You are advised to use the multi-disk parameters. | + | | | | | + | | | | - SATA: Common I/O | + | | | | - SAS: High I/O | + | | | | - SSD: Ultra-high I/O | + +--------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | volume_size | No | Integer | Data disk storage space of the Master and Core nodes. To increase data storage capacity, you can add disks at the same time when creating a cluster. Select a proper disk storage space based on the following application scenarios: | + | | | | | + | | | | - Separation of data storage and computing: Data is stored in the OBS system. Costs of clusters are relatively low but computing performance is poor. The clusters can be deleted at any time. It is recommended when data computing is infrequently performed. | + | | | | - Integration of data storage and computing: Data is stored in the HDFS system. Costs of clusters are relatively high but computing performance is good. The clusters cannot be deleted in a short term. It is recommended when data computing is frequently performed. | + | | | | | + | | | | Value range: 100 GB to 32,000 GB | + | | | | | + | | | | This parameter is not recommended. For details, see the description of the **volume_type** parameter. | + +--------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | task_node_groups | No | Array | List of Task nodes For more parameter description, see :ref:`Table 6 `. | + +--------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0028__tc6bfa2a3d7a348d786a901f3a9327b50: + +.. table:: **Table 6** **task_node_groups** parameter description + + +---------------------+-----------------+-------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=====================+=================+===================+=======================================================================================================================================================================================+ + | node_num | Yes | Integer | Number of Task nodes. The value ranges from 0 to 500 and the total number of Core and Task nodes cannot exceed 500. | + +---------------------+-----------------+-------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | node_size | Yes | String | Instance specifications of the Task node, for example, **c6.4xlarge.4linux.mrs**. For details about instance specifications, see :ref:`ECS Specifications Used by MRS `. | + +---------------------+-----------------+-------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | data_volume_type | Yes | String | Data disk storage type of the Task node, supporting SATA, SAS, and SSD currently | + | | | | | + | | | | - SATA: Common I/O | + | | | | - SAS: High I/O | + | | | | - SSD: Ultra-high I/O | + +---------------------+-----------------+-------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | data_volume_count | Yes | Integer | Number of data disks of a Task node | + | | | | | + | | | | Value range: 0 to 10 | + +---------------------+-----------------+-------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | data_volume_size | Yes | Integer | Data disk storage space of a Task node | + | | | | | + | | | | Value range: 100 GB to 32,000 GB | + +---------------------+-----------------+-------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | auto_scaling_policy | No | AutoScalingPolicy | Auto scaling policy. For details, see :ref:`Table 9 `. | + +---------------------+-----------------+-------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0028__te1288dba79844d3fa5973939a3739d34: + +.. table:: **Table 7** **component_list** parameter description + + ============== ========= ====== ============== + Parameter Mandatory Type Description + ============== ========= ====== ============== + component_name Yes String Component name + ============== ========= ====== ============== + +.. _mrs_02_0028__t8ded0b3ae11742cea98a467ce26fd093: + +.. table:: **Table 8** **add_jobs** parameter description + + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=============================+=================+=================+===========================================================================================================================================================+ + | job_type | Yes | Integer | Job type code | + | | | | | + | | | | - 1: MapReduce | + | | | | - 2: Spark | + | | | | - 3: Hive Script | + | | | | - 4: HiveQL (not supported currently) | + | | | | - 5: DistCp, importing and exporting data (not supported currently) | + | | | | - 6: Spark Script | + | | | | - 7: Spark SQL, submitting Spark SQL statements (not supported currently). | + | | | | | + | | | | .. note:: | + | | | | | + | | | | Spark and Hive jobs can be added to only clusters that include Spark and Hive components. | + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_name | Yes | String | Job name. It contains 1 to 64 characters. Only letters, digits, hyphens (-), and underscores (_) are allowed. | + | | | | | + | | | | .. note:: | + | | | | | + | | | | Identical job names are allowed but not recommended. | + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | jar_path | No | String | Path of the JAR or SQL file for program execution. The parameter must meet the following requirements: | + | | | | | + | | | | - Contains a maximum of 1,023 characters, excluding special characters such as ``;|&><'$.`` The parameter value cannot be empty or full of spaces. | + | | | | - Files can be stored in HDFS or OBS. The path varies depending on the file system. | + | | | | | + | | | | - OBS: The path must start with **s3a://**. Files or programs encrypted by KMS are not supported. | + | | | | - HDFS: The path starts with a slash (**/**). | + | | | | | + | | | | - Spark Script must end with **.sql** while MapReduce and Spark Jar must end with **.jar**. **sql** and **jar** are case-insensitive. | + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | arguments | No | String | Key parameter for program execution. The parameter is specified by the function of the user's program. MRS is only responsible for loading the parameter. | + | | | | | + | | | | The parameter contains a maximum of 2,047 characters, excluding special characters such as ``;|&>'<$,`` and can be left blank. | + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | input | No | String | Address for inputting data. | + | | | | | + | | | | Files can be stored in HDFS or OBS. The path varies depending on the file system. | + | | | | | + | | | | - OBS: The path must start with **s3a://**. Files or programs encrypted by KMS are not supported. | + | | | | - HDFS: The path starts with a slash (**/**). | + | | | | | + | | | | The parameter contains a maximum of 1,023 characters, excluding special characters such as ``;|&>'<$,`` and can be left blank. | + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | output | No | String | Address for outputting data. | + | | | | | + | | | | Files can be stored in HDFS or OBS. The path varies depending on the file system. | + | | | | | + | | | | - OBS: The path must start with **s3a://**. | + | | | | - HDFS: The path starts with a slash (**/**). | + | | | | | + | | | | If the specified path does not exist, the system will automatically create it. | + | | | | | + | | | | The parameter contains a maximum of 1,023 characters, excluding special characters such as ``;|&>'<$,`` and can be left blank. | + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_log | No | String | Path for storing job logs that record job running status. | + | | | | | + | | | | Files can be stored in HDFS or OBS. The path varies depending on the file system. | + | | | | | + | | | | - OBS: The path must start with **s3a://**. | + | | | | - HDFS: The path starts with a slash (**/**). | + | | | | | + | | | | The parameter contains a maximum of 1,023 characters, excluding special characters such as ``;|&>'<$,`` and can be left blank. | + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | shutdown_cluster | No | Bool | Whether to delete the cluster after the job execution is complete | + | | | | | + | | | | - **true**: Yes | + | | | | - **false**: No | + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | file_action | No | String | Data import and export | + | | | | | + | | | | - **import** | + | | | | - **export** | + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | submit_job_once_cluster_run | Yes | Bool | - **true**: Submit a job during cluster creation. | + | | | | - **false**: Submit a job after the cluster is created. | + | | | | | + | | | | Set this parameter to **true** in this example. | + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | hql | No | String | HiveQL statement | + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | hive_script_path | Yes | String | SQL program path. This parameter is needed by Spark Script and Hive Script jobs only, and must meet the following requirements: | + | | | | | + | | | | - Contains a maximum of 1,023 characters, excluding special characters such as ``;|&><'$.`` The parameter value cannot be empty or full of spaces. | + | | | | - Files can be stored in HDFS or OBS. The path varies depending on the file system. | + | | | | | + | | | | - OBS: The path must start with **s3a://**. Files or programs encrypted by KMS are not supported. | + | | | | - HDFS: The path starts with a slash (**/**). | + | | | | | + | | | | - Ends with **.sql**. **sql** is case-insensitive. | + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0028__t6d6054a35d6342dc9dc5b3b8580fec7c: + +.. table:: **Table 9** **auto_scaling_policy** parameter description + + +---------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=====================+=================+=================+============================================================================================================================================================================+ + | auto_scaling_enable | Yes | Boolean | Whether to enable the auto scaling rule. | + +---------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | min_capacity | Yes | Integer | Minimum number of nodes left in the node group. | + | | | | | + | | | | Value range: 0 to 500 | + +---------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | max_capacity | Yes | Integer | Maximum number of nodes in the node group. | + | | | | | + | | | | Value range: 0 to 500 | + +---------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | resources_plans | No | List | Resource plan list. For details, see :ref:`Table 10 `. If this parameter is left blank, the resource plan is disabled. | + | | | | | + | | | | When auto scaling is enabled, either a resource plan or an auto scaling rule must be configured. | + | | | | | + | | | | MRS 1.6.3 or later supports this parameter. | + +---------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | exec_scripts | No | List | List of custom scaling automation scripts. For details, see :ref:`Table 11 `. If this parameter is left blank, a hook script is disabled. | + | | | | | + | | | | MRS 1.7.2 or later supports this parameter. | + +---------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | rules | No | List | List of auto scaling rules. For details, see :ref:`Table 12 `. | + | | | | | + | | | | When auto scaling is enabled, either a resource plan or an auto scaling rule must be configured. | + +---------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0028__table10281451162111: + +.. table:: **Table 10** **resources_plan** parameter description + + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+===========================================================================================================================================================================================+ + | period_type | Yes | String | Cycle type of a resource plan. Currently, only the following cycle type is supported: | + | | | | | + | | | | - **daily** | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | start_time | Yes | String | Start time of a resource plan. The value is in the format of **hour:minute**, indicating that the time ranges from 0:00 to 23:59. | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | end_time | Yes | String | End time of a resource plan. The value is in the same format as that of **start_time**. The interval between **end_time** and **start_time** must be greater than or equal to 30 minutes. | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | min_capacity | Yes | Integer | Minimum number of the preserved nodes in a node group in a resource plan. | + | | | | | + | | | | Value range: 0 to 500 | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | max_capacity | Yes | Integer | Maximum number of the preserved nodes in a node group in a resource plan. | + | | | | | + | | | | Value range: 0 to 500 | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0028__table1921110172216: + +.. table:: **Table 11** **exec_script** parameter description + + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=================================================================================================================================================================================================================================+ + | name | Yes | String | Name of a custom automation script. It must be unique in a same cluster. | + | | | | | + | | | | The value can contain only digits, letters, spaces, hyphens (-), and underscores (_) and cannot start with a space. | + | | | | | + | | | | The value can contain 1 to 64 characters. | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | uri | Yes | String | Path of a custom automation script. Set this parameter to an OBS bucket path or a local VM path. | + | | | | | + | | | | - OBS bucket path: Enter a script path manually, for example, **s3a://**\ *XXX*\ **/scale.sh**. | + | | | | - Local VM path: Enter a script path. The script path must start with a slash (/) and end with **.sh**. | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | parameters | No | String | Parameters of a custom automation script. | + | | | | | + | | | | - Multiple parameters are separated by space. | + | | | | - The following predefined system parameters can be transferred: | + | | | | | + | | | | - *${mrs_scale_node_num}*: Number of the nodes to be added or removed | + | | | | - *${mrs_scale_type}*: Scaling type. The value can be **scale_out** or **scale_in**. | + | | | | - *${mrs_scale_node_hostnames}*: Host names of the nodes to be added or removed | + | | | | - *${mrs_scale_node_ips}*: IP addresses of the nodes to be added or removed | + | | | | - *${mrs_scale_rule_name}*: Name of the rule that triggers auto scaling | + | | | | | + | | | | - Other user-defined parameters are used in the same way as those of common shell scripts. Parameters are separated by space. | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | nodes | Yes | List | Type of a node where the custom automation script is executed. The node type can be Master, Core, or Task. | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | active_master | No | Boolean | Whether the custom automation script runs only on the active Master node. | + | | | | | + | | | | The default value is **false**, indicating that the custom automation script can run on all Master nodes. | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | action_stage | Yes | String | Time when a script is executed. | + | | | | | + | | | | The following four options are supported: | + | | | | | + | | | | - **before_scale_out**: before scale-out | + | | | | - **before_scale_in**: before scale-in | + | | | | - **after_scale_out**: after scale-out | + | | | | - **after_scale_in**: after scale-in | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | fail_action | Yes | String | Whether to continue to execute subsequent scripts and create a cluster after the custom automation script fails to be executed. | + | | | | | + | | | | - **continue**: Continue to execute subsequent scripts. | + | | | | - **errorout**: Stop the action. | + | | | | | + | | | | .. note:: | + | | | | | + | | | | - You are advised to set this parameter to **continue** in the commissioning phase so that the cluster can continue to be installed and started no matter whether the custom automation script is executed successfully. | + | | | | - The scale-in operation cannot be undone. Therefore, **fail_action** must be set to **continue** for the scripts that are executed after scale-in. | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0028__t4c9e3e169631470d81d260543affb7e1: + +.. table:: **Table 12** **rules** parameter description + + +--------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +====================+=================+=================+================================================================================================================================+ + | name | Yes | String | Name of an auto scaling rule. | + | | | | | + | | | | It contains only 1 to 64 characters. Only letters, digits, hyphens (-), and underscores (_) are allowed. | + | | | | | + | | | | Rule names must be unique in a node group. | + +--------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ + | description | No | String | Description about an auto scaling rule. | + | | | | | + | | | | It contains a maximum of 1,024 characters. | + +--------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ + | adjustment_type | Yes | String | Auto scaling rule adjustment type. The options are as follows: | + | | | | | + | | | | - **scale_out**: cluster scale-out | + | | | | - **scale_in**: cluster scale-in | + +--------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ + | cool_down_minutes | Yes | Integer | Cluster cooling time after an auto scaling rule is triggered, when no auto scaling operation is performed. The unit is minute. | + | | | | | + | | | | Value range: 0 to 10,080. One week is equal to 10,080 minutes. | + +--------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ + | scaling_adjustment | Yes | Integer | Number of nodes that can be adjusted once. | + | | | | | + | | | | Value range: 1 to 100 | + +--------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ + | trigger | Yes | Trigger | Condition for triggering a rule. For details, see :ref:`Table 13 `. | + +--------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0028__t03bd10dc0ec94a3babc71b2d5d57c3fe: + +.. table:: **Table 13** **trigger** parameter description + + +---------------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=====================+=================+=================+===================================================================================================================================================================================================================+ + | metric_name | Yes | String | Metric name. | + | | | | | + | | | | This triggering condition makes a judgment according to the value of the metric. | + | | | | | + | | | | A metric name contains a maximum of 64 characters. | + | | | | | + | | | | :ref:`Table 14 ` lists the supported metric names. | + +---------------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | metric_value | Yes | String | Metric threshold to trigger a rule | + | | | | | + | | | | The parameter value must be an integer or number with two decimal places only. :ref:`Table 14 ` provides value types and ranges corresponding to **metric_name**. | + +---------------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | comparison_operator | No | String | Metric judgment logic operator. The options are as follows: | + | | | | | + | | | | - **LT**: less than | + | | | | - **GT**: greater than | + | | | | - **LTOE**: less than or equal to | + | | | | - **GTOE**: greater than or equal to | + +---------------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | evaluation_periods | Yes | Integer | Number of consecutive five-minute periods, during which a metric threshold is reached | + | | | | | + | | | | Value range: 1 to 288 | + +---------------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0028__t27de3279a99a48968dacb015c498d9cb: + +.. table:: **Table 14** Auto scaling metrics + + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | Cluster Type | Metric Name | Value Type | Description | + +===================+==========================================+=================+==============================================================================================================+ + | Streaming cluster | StormSlotAvailable | Integer | Number of available Storm slots. | + | | | | | + | | | | Value range: 0 to 2147483646 | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | StormSlotAvailablePercentage | Percentage | Percentage of available Storm slots, that is, the proportion of the available slots to total slots | + | | | | | + | | | | Value range: 0 to 100 | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | StormSlotUsed | Integer | Number of the used Storm slots. | + | | | | | + | | | | Value range: 0 to 2147483646 | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | StormSlotUsedPercentage | Percentage | Percentage of the used Storm slots, that is, the proportion of the used slots to total slots. | + | | | | | + | | | | Value range: 0 to 100 | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | StormSupervisorMemAverageUsage | Integer | Average memory usage of the Supervisor process of Storm. | + | | | | | + | | | | Value range: 0 to 2147483646 | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | StormSupervisorMemAverageUsagePercentage | Percentage | Average percentage of the used memory of the Supervisor process of Storm to the total memory of the system. | + | | | | | + | | | | Value range: 0 to 100 | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | StormSupervisorCPUAverageUsagePercentage | Percentage | Average percentage of the used CPUs of the Supervisor process of Storm to the total CPUs. | + | | | | | + | | | | Value range: 0 to 6,000 | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | Analysis cluster | YARNAppPending | Integer | Number of pending tasks on Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646 | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNAppPendingRatio | Ratio | Ratio of pending tasks on Yarn, that is, the ratio of pending tasks to running tasks on Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646 | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNAppRunning | Integer | Number of running tasks on Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646 | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNContainerAllocated | Integer | Number of containers allocated to Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646 | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNContainerPending | Integer | Number of pending containers on Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646 | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNContainerPendingRatio | Ratio | Ratio of pending containers on Yarn, that is, the ratio of pending containers to running containers on Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646 | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNCPUAllocated | Integer | Number of virtual CPUs (vCPUs) allocated to Yarn | + | | | | | + | | | | Value range: 0 to 2147483646 | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNCPUAvailable | Integer | Number of available vCPUs on Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646 | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNCPUAvailablePercentage | Percentage | Percentage of available vCPUs on Yarn, that is, the proportion of available vCPUs to total vCPUs. | + | | | | | + | | | | Value range: 0 to 100 | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNCPUPending | Integer | Number of pending vCPUs on Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646 | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNMemoryAllocated | Integer | Memory allocated to Yarn. The unit is MB. | + | | | | | + | | | | Value range: 0 to 2147483646 | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNMemoryAvailable | Integer | Available memory on Yarn. The unit is MB. | + | | | | | + | | | | Value range: 0 to 2147483646 | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNMemoryAvailablePercentage | Percentage | Percentage of available memory on Yarn, that is, the proportion of available memory to total memory on Yarn. | + | | | | | + | | | | Value range: 0 to 100 | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNMemoryPending | Integer | Pending memory on Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646 | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + +.. note:: + + When the value type is percentage or ratio in :ref:`Table 14 `, the valid value can be accurate to percentile. The percentage metric value is a decimal value with a percent sign (%) removed. For example, 16.80 represents 16.80%. + +.. _mrs_02_0028__table1258382865010: + +.. table:: **Table 15** **bootstrap_scripts** parameter description + + +------------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +========================+=================+=================+==========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================+ + | name | Yes | String | Name of a bootstrap action script. It must be unique in a cluster. | + | | | | | + | | | | The value can contain only digits, letters, spaces, hyphens (-), and underscores (_) and cannot start with a space. | + | | | | | + | | | | The value can contain 1 to 64 characters. | + +------------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | uri | Yes | String | Path of a bootstrap action script. Set this parameter to an OBS bucket path or a local VM path. | + | | | | | + | | | | - OBS bucket path: Enter a script path manually. For example, enter the path of the public sample script provided by MRS. Example: **s3a://bootstrap/presto/presto-install.sh**. If **dualroles** is installed, the parameter of the **presto-install.sh** script is **dualroles**. If **worker** is installed, the parameter of the **presto-install.sh** script is **worker**. Based on the Presto usage habit, you are advised to install **dualroles** on the active Master nodes and **worker** on the Core nodes. | + | | | | - Local VM path: Enter a script path. The script path must start with a slash (/) and end with **.sh**. | + +------------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | parameters | No | String | Bootstrap action script parameters. | + +------------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | nodes | Yes | Array String | Type of a node where the bootstrap action script is executed. The value can be **Master**, **Core**, or **Task**. | + +------------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | active_master | No | Boolean | Whether the bootstrap action script runs only on active Master nodes. | + | | | | | + | | | | The default value is **false**, indicating that the bootstrap action script can run on all Master nodes. | + +------------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | before_component_start | No | Boolean | Time when the bootstrap action script is executed. Currently, the following two options are available: **Before component start** and **After component start** | + | | | | | + | | | | The default value is **false**, indicating that the bootstrap action script is executed after the component is started. | + +------------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | fail_action | Yes | String | Whether to continue executing subsequent scripts and creating a cluster after the bootstrap action script fails to be executed. | + | | | | | + | | | | - **continue**: Continue to execute subsequent scripts. | + | | | | - **errorout**: Stop the action. | + | | | | | + | | | | The default value is **errorout**, indicating that the action is stopped. | + | | | | | + | | | | .. note:: | + | | | | | + | | | | You are advised to set this parameter to **continue** in the commissioning phase so that the cluster can continue to be installed and started no matter whether the bootstrap action is successful. | + +------------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Response +-------- + +.. table:: **Table 16** Response parameter description + + +-----------------------+-----------------------+---------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+===========================================================================+ + | cluster_id | String | Cluster ID, which is returned by the system after the cluster is created. | + +-----------------------+-----------------------+---------------------------------------------------------------------------+ + | result | Bool | Operation result. | + | | | | + | | | - **true**: The operation is successful. | + | | | - **false**: The operation failed. | + +-----------------------+-----------------------+---------------------------------------------------------------------------+ + | msg | String | System message, which can be empty. | + +-----------------------+-----------------------+---------------------------------------------------------------------------+ + +Example +------- + +- Example request + + - Creating a cluster with **Cluster HA** enabled (using the **node_groups** parameter group) + + .. code-block:: + + { + "billing_type": 12, + "data_center": "eu-de", + "available_zone_id": "bf84aba586ce4e948da0b97d9a7d62fb", + "cluster_name": "mrs_HEbK", + "cluster_version": "MRS 3.X.X", + "safe_mode": 0, + "cluster_type": 0, + "component_list": [ + { + "component_name": "Hadoop" + }, + { + "component_name": "Spark" + }, + { + "component_name": "HBase" + }, + { + "component_name": "Hive" + }, + { + "component_name": "Presto" + }, + { + "component_name": "Tez" + }, + { + "component_name": "Hue" + }, + { + "component_name": "Loader" + }, + { + "component_name": "Flink" + } + ], + "vpc": "vpc-4b1c", + "vpc_id": "4a365717-67be-4f33-80c5-98e98a813af8", + "subnet_id": "67984709-e15e-4e86-9886-d76712d4e00a", + "subnet_name": "subnet-4b44", + "security_groups_id": "4820eace-66ad-4f2c-8d46-cf340e3029dd", + "tags": [{ + "key": "key1", + "value": "value1" + }, { + "key": "key2", + "value": "value2" + }], + "node_groups": [{ + "group_name": "master_node_default_group", + "node_num": 2, + "node_size": "c6.4.xlarge.4linux.mrs", + "root_volume_size": 480, + "root_volume_type": "SATA", + "data_volume_type": "SATA", + "data_volume_count": 1, + "data_volume_size": 600 + }, { + "group_name": "core_node_analysis_group", + "node_num": 3, + "node_size": "c6.4.xlarge.4linux.mrs", + "root_volume_size": 480, + "root_volume_type": "SATA", + "data_volume_type": "SATA", + "data_volume_count": 1, + "data_volume_size": 600 + }, { + "group_name": "task_node_analysis_group", + "node_num": 2, + "node_size": "c6.4.xlarge.4linux.mrs", + "root_volume_size": 480, + "root_volume_type": "SATA", + "data_volume_type": "SATA", + "data_volume_count": 0, + "data_volume_size": 600, + "auto_scaling_policy": { + "auto_scaling_enable": true, + "min_capacity": 1, + "max_capacity": "3", + "resources_plans": [{ + "period_type": "daily", + "start_time": "9:50", + "end_time": "10:20", + "min_capacity": 2, + "max_capacity": 3 + }, { + "period_type ": "daily", + "start_time ": "10:20", + "end_time ": "12:30", + "min_capacity ": 0, + "max_capacity ": 2 + }], + "exec_scripts": [{ + "name": "before_scale_out", + "uri": "s3a://XXX/zeppelin_install.sh ", + "parameters": "${mrs_scale_node_num} ${mrs_scale_type} xxx", + "nodes": ["master", "core", "task"], + "active_master": "true", + "action_stage": "before_scale_out", + "fail_sction": "continue" + }, { + "name": "after_scale_out", + "uri": "s3a://XXX/storm_rebalance.sh", + "parameters": "${mrs_scale_node_hostnames} ${mrs_scale_node_ips}", + "nodes": ["master", "core", "task"], + "active_master": "true", + "action_stage": "after_scale_out", + "fail_action": "continue" + }], + "rules": [{ + "name": "default-expand-1", + "adjustment_type": "scale_out", + "cool_down_minutes": 5, + "scaling_adjustment": 1, + "trigger": { + "metric_name": "YARNMemoryAvailablePercentage", + "metric_value": "25", + "comparison_operator": "LT", + "evaluation_periods": 10 + } + }, { + "name": "default-shrink-1", + "adjustment_type": "scale_in", + "cool_down_minutes": 5, + "scaling_adjustment": 1, + "trigger": { + "metric_name": "YARNMemoryAvailablePercentage", + "metric_value": "70", + "comparison_operator": "GT", + "evaluation_periods": 10 + } + }] + } + } + ], + "login_mode": 1, + "cluster_master_secret": "", + "cluster_admin_secret": "", + "log_collection": 1, + "add_jobs": [{ + "job_type": 1, + "job_name": "tenji111", + "jar_path": "s3a://bigdata/program/hadoop-mapreduce-examples-2.7.2.jar", + "arguments": "wordcount", + "input": "s3a://bigdata/input/wd_1k/", + "output": "s3a://bigdata/ouput/", + "job_log": "s3a://bigdata/log/", + "shutdown_cluster": true, + "file_action": "", + "submit_job_once_cluster_run": true, + "hql": "", + "hive_script_path": "" + }], + "bootstrap_scripts": [{ + "name": "Modify os config", + "uri": "s3a://XXX/modify_os_config.sh", + "parameters": "param1 param2", + "nodes": ["master", "core", "task"], + "active_master": "false", + "before_component_start": "true", + "fail_action": "continue" + }, { + "name": "Install zepplin", + "uri": "s3a://XXX/zeppelin_install.sh", + "parameters": "", + "nodes": ["master"], + "active_master": "true", + "before_component_start": "false", + "fail_action": "continue" + }] + } + + - Creating a cluster with **Cluster HA** enabled (without using the **node_groups** parameter group) + + .. code-block:: + + { + "billing_type": 12, + "data_center": "eu-de", + "master_node_num": 2, + "master_node_size": "s1.8xlarge.linux.mrs", + "core_node_num": 3, + "core_node_size": "c6.4xlarge.4linux.mrs", + "available_zone_id": "bf84aba586ce4e948da0b97d9a7d62fb", + "cluster_name": "newcluster", + "vpc": "vpc1", + "vpc_id": "5b7db34d-3534-4a6e-ac94-023cd36aaf74", + "subnet_id": "815bece0-fd22-4b65-8a6e-15788c99ee43", + "subnet_name": "subnet", + "security_groups_id": "", + "tags": [ + { + "key": "key1", + "value": "value1" + }, + { + "key": "key2", + "value": "value2" + } + ], + "cluster_version": "MRS 3.X.X", + "cluster_type": 0, + "master_data_volume_type": "SATA", + "master_data_volume_size": 100, + "master_data_volume_count": 1, + "core_data_volume_type": "SATA", + "core_data_volume_size": 100, + "core_data_volume_count": 2, + "login_mode": 1, + "node_public_cert_name": "SSHkey-bba1", + "safe_mode": 0, + "cluster_admin_secret":"******", + "log_collection": 1, + "task_node_groups": [ + { + + "node_num": 2, + "node_size": "c6.4.xlarge.4linux.mrs", + "data_volume_type": "SATA", + "data_volume_count": 1, + "data_volume_size": 600, + "auto_scaling_policy": + { + "auto_scaling_enable": true, + "min_capacity": "1", + "max_capacity": "3", + "resources_plans": [{ + "period_type": "daily", + "start_time": "9:50", + "end_time": "10:20", + "min_capacity": "2", + "max_capacity": "3" + },{ + "period_type": "daily", + "start_time": "10:20", + "end_time": "12:30", + "min_capacity": "0", + "max_capacity": "2" + }], + "exec_scripts": [{ + "name": "before_scale_out", + "uri": "s3a://XXX/zeppelin_install.sh", + "parameters": "", + "nodes": [ + "master", + "core", + "task" + ], + "active_master": "true", + "action_stage": "before_scale_out", + "fail_action": "continue" + },{ + "name": "after_scale_out", + "uri": "s3a://XXX/storm_rebalance.sh", + "parameters": "", + "nodes": [ + "master", + "core", + "task" + ], + "active_master": "true", + "action_stage": "after_scale_out", + "fail_action": "continue" + }], + "rules": [ + { + "name": "default-expand-1", + "adjustment_type": "scale_out", + "cool_down_minutes": 5, + "scaling_adjustment": 1, + "trigger": { + "metric_name": "YARNMemoryAvailablePercentage", + "metric_value": "25", + "comparison_operator": "LT", + "evaluation_periods": 10 + } + }, + { + "name": "default-shrink-1", + "adjustment_type": "scale_in", + "cool_down_minutes": 5, + "scaling_adjustment": 1, + "trigger": { + "metric_name": "YARNMemoryAvailablePercentage", + "metric_value": "70", + "comparison_operator": "GT", + "evaluation_periods": 10 + } + } + ] + } + } + ], + "component_list": [ + { + "component_name": "Hadoop" + }, + { + "component_name": "Spark" + }, + { + "component_name": "HBase" + }, + { + "component_name": "Hive" + }, + { + "component_name": "Presto" + }, + { + "component_name": "Tez" + }, + { + "component_name": "Hue" + }, + { + "component_name": "Loader" + }, + { + "component_name": "Flink" + } + ], + "add_jobs": [ + { + "job_type": 1, + "job_name": "tenji111", + "jar_path": "s3a://bigdata/program/hadoop-mapreduce-examples-XXX.jar", + "arguments": "wordcount", + "input": "s3a://bigdata/input/wd_1k/", + "output": "s3a://bigdata/ouput/", + "job_log": "s3a://bigdata/log/", + "shutdown_cluster": false, + "file_action": "", + "submit_job_once_cluster_run": true, + "hql": "", + "hive_script_path": "" + } + ], + "bootstrap_scripts": [ + { + "name":"Modify os config", + "uri":"s3a://XXX/modify_os_config.sh", + "parameters":"param1 param2", + "nodes":[ + "master", + "core", + "task" + ], + "active_master":"false", + "before_component_start":"true", + "fail_action":"continue" + }, + { + "name":"Install zepplin", + "uri":"s3a://XXX/zeppelin_install.sh", + "parameters":"", + "nodes":[ + "master" + ], + "active_master":"true", + "before_component_start":"false", + "fail_action":"continue" + } + ] + } + + - Disabling the **Cluster HA** function and creating a cluster with the minimum specifications (using the **node_groups** parameter group) + + .. code-block:: + + { + "billing_type": 12, + "data_center": "eu-de", + "available_zone_id": "bf84aba586ce4e948da0b97d9a7d62fb", + "cluster_name": "mrs_HEbK", + "cluster_version": "MRS 3.X.X", + "safe_mode": 0, + "cluster_type": 0, + "component_list": [ + { + "component_name": "Hadoop" + }, + { + "component_name": "Spark" + }, + { + "component_name": "HBase" + }, + { + "component_name": "Hive" + }, + { + "component_name": "Presto" + }, + { + "component_name": "Tez" + }, + { + "component_name": "Hue" + }, + { + "component_name": "Loader" + }, + { + "component_name": "Flink" + } + ], + "vpc": "vpc-4b1c", + "vpc_id": "4a365717-67be-4f33-80c5-98e98a813af8", + "subnet_id": "67984709-e15e-4e86-9886-d76712d4e00a", + "subnet_name": "subnet-4b44", + "security_groups_id": "4820eace-66ad-4f2c-8d46-cf340e3029dd", + "tags": [{ + "key": "key1", + "value": "value1" + }, { + "key": "key2", + "value": "value2" + }], + "node_groups": [{ + "group_name": "master_node_default_group", + "node_num": 1, + "node_size": "c6.4.xlarge.4linux.mrs", + "root_volume_size": 480, + "root_volume_type": "SATA", + "data_volume_type": "SATA", + "data_volume_count": 1, + "data_volume_size": 600 + }, { + "group_name": "core_node_analysis_group", + "node_num": 1, + "node_size": "c6.4.xlarge.4linux.mrs", + "root_volume_size": 480, + "root_volume_type": "SATA", + "data_volume_type": "SATA", + "data_volume_count": 1, + "data_volume_size": 600 + } + ], + "login_mode": 1, + "cluster_master_secret": "", + "cluster_admin_secret": "", + "log_collection": 1, + "add_jobs": [{ + "job_type": 1, + "job_name": "tenji111", + "jar_path": "s3a://bigdata/program/hadoop-mapreduce-examples-2.7.2.jar", + "arguments": "wordcount", + "input": "s3a://bigdata/input/wd_1k/", + "output": "s3a://bigdata/ouput/", + "job_log": "s3a://bigdata/log/", + "shutdown_cluster": true, + "file_action": "", + "submit_job_once_cluster_run": true, + "hql": "", + "hive_script_path": "" + }], + "bootstrap_scripts": [{ + "name": "Modify os config", + "uri": "s3a://XXX/modify_os_config.sh", + "parameters": "param1 param2", + "nodes": ["master", "core", "task"], + "active_master": "false", + "before_component_start": "true", + "fail_action": "continue" + }, { + "name": "Install zepplin", + "uri": "s3a://XXX/zeppelin_install.sh", + "parameters": "", + "nodes": ["master"], + "active_master": "true", + "before_component_start": "false", + "fail_action": "continue" + }] + } + + - Disabling the **Cluster HA** function and creating a cluster with the minimum specifications (without using the **node_groups** parameter group) + + .. code-block:: + + { + "billing_type": 12, + "data_center": "eu-de", + "master_node_num": 1 + "master_node_size": "s1.8xlarge.linux.mrs", + "core_node_num": 1, + "core_node_size": "c6.4xlarge.4linux.mrs", + "available_zone_id": "bf84aba586ce4e948da0b97d9a7d62fb", + "cluster_name": "newcluster", + "vpc": "vpc1", + "vpc_id": "5b7db34d-3534-4a6e-ac94-023cd36aaf74", + "subnet_id": "815bece0-fd22-4b65-8a6e-15788c99ee43", + "subnet_name": "subnet", + "security_groups_id": "", + "tags": [ + { + "key": "key1", + "value":"value1" + }, + { + "key": "key2", + "value": "value2" + } + ], + "cluster_version": "MRS 3.X.X", + "cluster_type": 0, + "master_data_volume_type": "SATA", + "master_data_volume_size": 100, + "master_data_volume_count": 1, + "core_data_volume_type": "SATA", + "core_data_volume_size": 100, + "core_data_volume_count": 1, + "login_mode": 1, + "node_public_cert_name": "SSHkey-bba1", + "safe_mode": 0, + "cluster_admin_secret":"******", + "log_collection": 1, + "component_list": [ + { + "component_name": "Hadoop" + }, + { + "component_name": "Spark" + }, + { + "component_name": "HBase" + }, + { + "component_name": "Hive" + }, + { + "component_name": "Presto" + }, + { + "component_name": "Tez" + }, + { + "component_name": "Hue" + }, + { + "component_name": "Loader" + }, + { + "component_name": "Flink" + } + ], + "add_jobs": [ + { + "job_type": 1, + "job_name": "tenji111", + "jar_path": "s3a://bigdata/program/hadoop-mapreduce-examples-XXX.jar", + "arguments": "wordcount", + "input": "s3a://bigdata/input/wd_1k/", + "output": "s3a://bigdata/ouput/", + "job_log": "s3a://bigdata/log/", + "shutdown_cluster": false, + "file_action": "", + "submit_job_once_cluster_run": true, + "hql": "", + "hive_script_path": "" + } + ], + "bootstrap_scripts": [ + { + "name":"Install zepplin", + "uri":"s3a://XXX/zeppelin_install.sh", + "parameters":"", + "nodes":[ + "master" + ], + "active_master":"false", + "before_component_start":"false", + "fail_action":"continue" + } + ] + } + +- Example response + + .. code-block:: + + { + "cluster_id": "da1592c2-bb7e-468d-9ac9-83246e95447a", + "result": true, + "msg": "" + } + +Status Code +----------- + +:ref:`Table 17 ` describes the status code of this API. + +.. _mrs_02_0028__t9da59f1e3aaa4a09903f34b2fc2401e4: + +.. table:: **Table 17** Status code + + =========== ========================================== + Status Code Description + =========== ========================================== + 200 The cluster has been successfully created. + =========== ========================================== + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/cluster_management_apis_v1/deleting_a_cluster.rst b/api-ref/source/apis/cluster_management_apis_v1/deleting_a_cluster.rst new file mode 100644 index 0000000..7711aa0 --- /dev/null +++ b/api-ref/source/apis/cluster_management_apis_v1/deleting_a_cluster.rst @@ -0,0 +1,81 @@ +:original_name: mrs_02_0032.html + +.. _mrs_02_0032: + +Deleting a Cluster +================== + +Function +-------- + +This API is used to delete a cluster after data processing and analysis are completed or the cluster is abnormal. This API is compatible with Sahara. + +Clusters in any of the following states cannot be terminated: + +- scaling-out +- scaling-in +- starting +- terminating +- terminated +- failed + +URI +--- + +- Format + + DELETE /v1.1/{project_id}/clusters/{cluster_id} + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | cluster_id | Yes | Cluster ID | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +**Request parameters** + +None. + +Response +-------- + +**Response parameters** + +None. + +Example +------- + +- Example request + + None. + +- Example response + + None. + +Status Code +----------- + +:ref:`Table 2 ` describes the status code of this API. + +.. _mrs_02_0032__table1584477916050: + +.. table:: **Table 2** Status code + + =========== ============================================= + Status Code Description + =========== ============================================= + 204 The cluster has been successfully terminated. + =========== ============================================= + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/cluster_management_apis_v1/index.rst b/api-ref/source/apis/cluster_management_apis_v1/index.rst new file mode 100644 index 0000000..d32cd4f --- /dev/null +++ b/api-ref/source/apis/cluster_management_apis_v1/index.rst @@ -0,0 +1,24 @@ +:original_name: mrs_02_0027.html + +.. _mrs_02_0027: + +Cluster management APIs (V1) +============================ + +- :ref:`Creating a Cluster and Running a Job ` +- :ref:`Resizing a Cluster ` +- :ref:`Querying a Cluster List ` +- :ref:`Querying Cluster Details ` +- :ref:`Deleting a Cluster ` +- :ref:`Querying a Host List ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + creating_a_cluster_and_running_a_job + resizing_a_cluster + querying_a_cluster_list + querying_cluster_details + deleting_a_cluster + querying_a_host_list diff --git a/api-ref/source/apis/cluster_management_apis_v1/querying_a_cluster_list.rst b/api-ref/source/apis/cluster_management_apis_v1/querying_a_cluster_list.rst new file mode 100644 index 0000000..2193778 --- /dev/null +++ b/api-ref/source/apis/cluster_management_apis_v1/querying_a_cluster_list.rst @@ -0,0 +1,421 @@ +:original_name: mrs_02_0030.html + +.. _mrs_02_0030: + +Querying a Cluster List +======================= + +Function +-------- + +This API is used to query a list of clusters created by a user. This API is incompatible with Sahara. + +URI +--- + +- Format + + GET /v1.1/{project_id}/cluster_infos?pageSize={page_size}¤tPage={current_page}&clusterState={cluster_state}&tags={tags} + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +=======================+=======================+==============================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------+ + | pageSize | No | Maximum number of clusters displayed on a page | + | | | | + | | | Value range: 1 to 2147483646 | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------+ + | currentPage | No | Current page number | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------+ + | clusterState | No | You can query a cluster list by cluster status. | + | | | | + | | | - **starting**: Query a list of clusters that are being started. | + | | | - **running**: Query a list of running clusters. | + | | | - **terminated**: Query a list of terminated clusters. | + | | | - **failed**: Query a list of failed clusters. | + | | | - **abnormal**: Query a list of abnormal clusters. | + | | | - **terminating**: Query a list of clusters that are being terminated. | + | | | - **frozen**: Query a list of frozen clusters. | + | | | - **scaling-out**: Query a list of clusters that are being scaled out. | + | | | - **scaling-in**: Query a list of clusters that are being scaled in. | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------+ + | tags | No | You can search for a cluster by its tag. If you specify multiple tags, the relationship between them is AND. | + | | | | + | | | - The format of the **tags** parameter is **tags=k1*v1,k2*v2,k3*v3**. | + | | | - When the values of some tags are null, the format is **tags=k1,k2,k3*v3**. | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------+ + +Request +------- + +None. + +Response +-------- + +.. table:: **Table 2** Response parameter description + + +--------------+--------+-------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +==============+========+=======================================================================================================+ + | clusterTotal | String | Total number of clusters in a list | + +--------------+--------+-------------------------------------------------------------------------------------------------------+ + | clusters | Array | Cluster parameters. For details, see :ref:`Table 3 `. | + +--------------+--------+-------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0030__t55f6f36df8d04eb9a231842a70d06296: + +.. table:: **Table 3** **clusters** parameter description + + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+============================================================================================================================================================================+ + | clusterId | String | Cluster ID. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | clusterName | String | Cluster name. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | masterNodeNum | String | Number of Master nodes deployed in a cluster. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | coreNodeNum | String | Number of Core nodes deployed in a cluster. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | totalNodeNum | String | Total number of nodes deployed in a cluster. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | clusterState | String | Cluster status. Valid values include: | + | | | | + | | | - **starting**: The cluster is being started. | + | | | - **running**: The cluster is running. | + | | | - **terminated**: The cluster has been terminated. | + | | | - **failed**: The cluster fails. | + | | | - **abnormal**: The cluster is abnormal. | + | | | - **terminating**: The cluster is being terminated. | + | | | - **frozen**: The cluster has been frozen. | + | | | - **scaling-out**: The cluster is being scaled out. | + | | | - **scaling-in**: The cluster is being scaled in. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | createAt | String | Cluster creation time, which is a 10-bit timestamp. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | updateAt | String | Cluster update time, which is a 10-bit timestamp. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | billingType | String | Cluster billing mode. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dataCenter | String | Cluster work region. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | vpc | String | VPC name. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | fee | String | Cluster creation fee, which is automatically calculated. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | hadoopVersion | String | Hadoop version. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | masterNodeSize | String | Instance specifications of a Master node. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | coreNodeSize | String | Instance specifications of a Core node. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | componentList | Array | Component list. For details, see :ref:`Table 4 `. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | externalIp | String | External IP address. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | externalAlternateIp | String | Backup external IP address. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | internalIp | String | Internal IP address. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | deploymentId | String | Cluster deployment ID. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | remark | String | Cluster remarks. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | orderId | String | Cluster creation order ID. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | azId | String | AZ ID. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | masterNodeProductId | String | Product ID of a Master node. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | masterNodeSpecId | String | Specification ID of a Master node. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | coreNodeProductId | String | Product ID of a Core node. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | coreNodeSpecId | String | Specification ID of a Core node. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | azName | String | AZ name. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | instanceId | String | Instance ID. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | vnc | String | URI for remotely logging in to an ECS. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | tenantId | String | Project ID. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | volumeSize | Integer | Disk storage space. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | volumeType | String | Disk type. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | subnetId | String | Subnet ID. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | clusterType | String | Cluster type. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | subnetName | String | Subnet name. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | securityGroupsId | String | Security group ID. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | slaveSecurityGroupsId | String | Security group ID of a non-Master node. Currently, one MRS cluster uses only one security group. Therefore, this field has been discarded. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | stageDesc | String | Cluster operation progress description. | + | | | | + | | | The cluster installation progress includes: | + | | | | + | | | - Verifying cluster parameters: Cluster parameters are being verified. | + | | | - Applying for cluster resources: Cluster resources are being applied for. | + | | | - Creating VMs: The VMs are being created. | + | | | - Initializing VMs: The VMs are being initialized. | + | | | - Installing MRS Manager: MRS Manager is being installed. | + | | | - Deploying the cluster: The cluster is being deployed. | + | | | - Cluster installation failed: Failed to install the cluster. | + | | | | + | | | The cluster scale-out progress includes: | + | | | | + | | | - Preparing for scale-out: Cluster scale-out is being prepared. | + | | | - Creating VMs: The VMs are being created. | + | | | - Initializing VMs: The VMs are being initialized. | + | | | - Adding nodes to the cluster: The nodes are being added to the cluster. | + | | | - Scale-out failed: Failed to scale out the cluster. | + | | | | + | | | The cluster scale-in progress includes: | + | | | | + | | | - Preparing for scale-in: Cluster scale-in is being prepared. | + | | | - Decommissioning instance: The instance is being decommissioned. | + | | | - Deleting VMs: The VMs are being deleted. | + | | | - Deleting nodes from the cluster: The nodes are being deleted from the cluster. | + | | | - Scale-in failed: Failed to scale in the cluster. | + | | | | + | | | If the cluster installation, scale-out, or scale-in fails, **stageDesc** will display the failure cause. For details, see :ref:`Table 8 `. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | mrsManagerFinish | boolean | Whether MRS Manager installation is finished during cluster creation. | + | | | | + | | | - **true**: MRS Manager installation is finished. | + | | | - **false**: MRS Manager installation is not finished. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | safeMode | String | Running mode of an MRS cluster. | + | | | | + | | | - **0**: Normal cluster | + | | | - **1**: Security cluster | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | clusterVersion | String | Cluster version. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | nodePublicCertName | String | Name of the key file. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | masterNodeIp | String | IP address of a Master node. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | privateIpFirst | String | Preferred private IP address. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | errorInfo | String | Error message. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | chargingStartTime | String | Start time of billing. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | logCollection | Integer | Whether to collect logs when cluster installation fails. | + | | | | + | | | - **0**: Do not collect. | + | | | - **1**: Collect. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | taskNodeGroups | List | List of Task nodes. For more parameter description, see :ref:`Table 5 `. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | nodeGroups | List | List of Master, Core and Task nodes. For more parameter description, see :ref:`Table 5 `. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | masterDataVolumeType | String | Data disk storage type of the Master node. Currently, SATA, SAS and SSD are supported. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | masterDataVolumeSize | Integer | Data disk storage space of the Master node To increase data storage capacity, you can add disks at the same time when creating a cluster. | + | | | | + | | | Value range: 100 GB to 32,000 GB | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | masterDataVolumeCount | Integer | Number of data disks of the Master node | + | | | | + | | | The value can be set to **1** only. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | coreDataVolumeType | String | Data disk storage type of the Core node. Currently, SATA, SAS and SSD are supported. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | coreDataVolumeSize | Integer | Data disk storage space of the Core node. To increase data storage capacity, you can add disks at the same time when creating a cluster. | + | | | | + | | | Value range: 100 GB to 32,000 GB | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | coreDataVolumeCount | Integer | Number of data disks of the Core node. | + | | | | + | | | Value range: 1 to 10 | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0030__tfad8f6bab79e4a158065bed4334934f2: + +.. table:: **Table 4** **componentList** parameter description + + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+============================================================================================================================+ + | componentId | String | Component ID | + | | | | + | | | - Component IDs of MRS 3.2.0-LTS.3 are as follows: | + | | | | + | | | - MRS 3.2.0-LTS.3_001: Hadoop | + | | | - MRS 3.2.0-LTS.3_002: HBase | + | | | - MRS 3.2.0-LTS.3_003: Hive | + | | | - MRS 3.2.0-LTS.3_004: Spark2x | + | | | - MRS 3.2.0-LTS.3_006: Flink | + | | | - MRS 3.2.0-LTS.3_008: Kafka | + | | | - MRS 3.2.0-LTS.3_009: Flume | + | | | - MRS 3.2.0-LTS.3_013: Loader | + | | | - MRS 3.2.0-LTS.3_014: Hue | + | | | - MRS 3.2.0-LTS.3_015: Ooize | + | | | - MRS 3.2.0-LTS.3_018: DBService | + | | | - MRS 3.2.0-LTS.3_019: ZooKeeper | + | | | - MRS 3.2.0-LTS.3_022: Ranger | + | | | - MRS 3.2.0-LTS.3_023: HetuEngine | + | | | - MRS 3.2.0-LTS.3_024: Tez | + | | | - MRS 3.2.0-LTS.3_025: ClickHouse | + | | | | + | | | - Component IDs of MRS 3.1.0-LTS.1 are as follows: | + | | | | + | | | - MRS 3.1.0-LTS.1_001: Hadoop | + | | | - MRS 3.1.0-LTS.1_002: HBase | + | | | - MRS 3.1.0-LTS.1_003: Hive | + | | | - MRS 3.1.0-LTS.1_004: Spark2x | + | | | - MRS 3.1.0-LTS.1_006: Flink | + | | | - MRS 3.1.0-LTS.1_008: Kafka | + | | | - MRS 3.1.0-LTS.1_009: Flume | + | | | - MRS 3.1.0-LTS.1_013: Loader | + | | | - MRS 3.1.0-LTS.1_014: Hue | + | | | - MRS 3.1.0-LTS.1_015: Ooize | + | | | - MRS 3.1.0-LTS.1_018: DBService | + | | | - MRS 3.1.0-LTS.1_019: ZooKeeper | + | | | - MRS 3.1.0-LTS.1_022: Ranger | + | | | - MRS 3.1.0-LTS.1_023: HetuEngine | + | | | - MRS 3.2.0-LTS.3_024: Tez | + | | | | + | | | - Component IDs of MRS 2.1.0 are as follows: | + | | | | + | | | - MRS 2.1.0_001: Hadoop | + | | | - MRS 2.1.0_002: Spark | + | | | - MRS 2.1.0_003: HBase | + | | | - MRS 2.1.0_004: Hive | + | | | - MRS 2.1.0_005: Hue | + | | | - MRS 2.1.0_006: Kafka | + | | | - MRS 2.1.0_007: Storm | + | | | - MRS 2.1.0_008: Loader | + | | | - MRS 2.1.0_009: Flume | + | | | - MRS 2.1.0_010: Tez | + | | | - MRS 2.1.0_011: Presto | + | | | - MRS 2.1.0_014: Flink | + | | | | + | | | - Component IDs of MRS 1.9.2 are as follows: | + | | | | + | | | - MRS 1.9.2_001: Hadoop | + | | | - MRS 1.9.2_002: Spark | + | | | - MRS 1.9.2_003: HBase | + | | | - MRS 1.9.2_004: Hive | + | | | - MRS 1.9.2_005: Hue | + | | | - MRS 1.9.2_006: Kafka | + | | | - MRS 1.9.2_007: Storm | + | | | - MRS 1.9.2_008: Loader | + | | | - MRS 1.9.2_009: Flume | + | | | - MRS 1.9.2_010: Presto | + | | | - MRS 1.9.2_011: KafkaManager | + | | | - MRS 1.9.2_012: Flink | + | | | - MRS 1.9.2_013: OpenTSDB | + | | | - MRS 1.9.2_015: Alluxio | + | | | - MRS 1.9.2_16: Ranger | + | | | - MRS 1.9.2_17: Tez | + | | | | + | | | - Component IDs of MRS 1.7.2 and MRS 1.6.3 are as follows: | + | | | | + | | | - MRS 1.7.2_001: Hadoop | + | | | - MRS 1.7.2_002: Spark | + | | | - MRS 1.7.2_003: HBase | + | | | - MRS 1.7.2_004: Hive | + | | | - MRS 1.7.2_005: Hue | + | | | - MRS 1.7.2_006: Kafka | + | | | - MRS 1.7.2_007: Storm | + | | | - MRS 1.7.2_008: Loader | + | | | - MRS 1.7.2_009: Flume | + | | | | + | | | For example, the **component_id** of Hadoop is **MRS 2.1.0_001**, **MRS 1.9.2_001**, **MRS 1.7.2_001**, **MRS 1.6.3_001**. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------+ + | componentName | String | Component name | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------+ + | componentVersion | String | Component version | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------+ + | componentDesc | String | Component description | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0030__t8c0e29f53f5d4b5da5cba38419aac352: + +.. table:: **Table 5** **NodeGroup** parameter description + + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +============================+=======================+==================================================================================================================================================================+ + | groupName | String | Node group name | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | nodeNum | Integer | Number of nodes. The value ranges from 0 to 500. The minimum number of Master and Core nodes is 1 and the total number of Core and Task nodes cannot exceed 500. | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | nodeSize | String | Instance specifications of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | nodeSpecId | String | Instance specification ID of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | nodeProductId | String | Instance product ID of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | vmProductId | String | VM product ID of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | vmSpecCode | String | VM specifications of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | rootVolumeSize | Integer | System disk size of a node. This parameter is not configurable | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | rootVolumeProductId | String | System disk product ID of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | rootVolumeType | String | System disk type of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | rootVolumeResourceSpecCode | String | System disk product specifications of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | rootVolumeResourceType | String | System disk product type of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dataVolumeType | String | Data disk storage type of a node. Currently, SATA, SAS and SSD are supported. | + | | | | + | | | - SATA: Common I/O | + | | | - SAS: High I/O | + | | | - SSD: Ultra-high I/O | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dataVolumeCount | Integer | Number of data disks of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dataVolumeSize | String | Data disk storage space of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dataVolumeProductId | String | Data disk product ID of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dataVolumeResourceSpecCode | String | Data disk product specifications of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dataVolumeResourceType | String | Data disk product type of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + + None. + +- Example response + + None. + +Status Code +----------- + +:ref:`Table 6 ` describes the status code of this API. + +.. _mrs_02_0030__t58f8687ecee1484aad44fb227671ad60: + +.. table:: **Table 6** Status code + + =========== =========================================================== + Status Code Description + =========== =========================================================== + 200 The cluster list information has been successfully queried. + =========== =========================================================== + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/cluster_management_apis_v1/querying_a_host_list.rst b/api-ref/source/apis/cluster_management_apis_v1/querying_a_host_list.rst new file mode 100644 index 0000000..397b117 --- /dev/null +++ b/api-ref/source/apis/cluster_management_apis_v1/querying_a_host_list.rst @@ -0,0 +1,198 @@ +:original_name: mrs_02_0057.html + +.. _mrs_02_0057: + +Querying a Host List +==================== + +Function +-------- + +This API is used to query a host list of a specified cluster. + +URI +--- + +- Format + + GET /v1.1/{project_id}/clusters/{cluster_id}/hosts + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | cluster_id | Yes | Cluster ID | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +.. table:: **Table 2** Request parameter description + + +-----------------+-----------------+-----------------+-----------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+===========================================================+ + | pageSize | No | Integer | Maximum number of clusters displayed on a page | + | | | | | + | | | | Value range: [1-2147483646]. The default value is **10**. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------+ + | currentPage | No | Integer | Current page number The default value is **1**. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------+ + +Response +-------- + +.. table:: **Table 3** Response parameter description + + +-----------------------+-----------------------+---------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+=====================================================================+ + | total | Integer | Total number of hosts in a list | + +-----------------------+-----------------------+---------------------------------------------------------------------+ + | hosts | Array | Host parameters | + | | | | + | | | For details, see :ref:`Table 4 `. | + +-----------------------+-----------------------+---------------------------------------------------------------------+ + +.. _mrs_02_0057__table21026630171650: + +.. table:: **Table 4** **Hosts** parameter description + + +-----------------------+-----------------------+--------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+==============================================================+ + | id | String | VM ID | + +-----------------------+-----------------------+--------------------------------------------------------------+ + | ip | String | VM IP address | + +-----------------------+-----------------------+--------------------------------------------------------------+ + | flavor | String | VM flavor ID | + +-----------------------+-----------------------+--------------------------------------------------------------+ + | type | String | VM type | + | | | | + | | | Currently, MasterNode, CoreNode, and TaskNode are supported. | + +-----------------------+-----------------------+--------------------------------------------------------------+ + | name | String | VM name | + +-----------------------+-----------------------+--------------------------------------------------------------+ + | status | String | Current VM state | + +-----------------------+-----------------------+--------------------------------------------------------------+ + | mem | String | Memory | + +-----------------------+-----------------------+--------------------------------------------------------------+ + | cpu | String | Number of CPU cores | + +-----------------------+-----------------------+--------------------------------------------------------------+ + | root_volume_size | String | OS disk capacity | + +-----------------------+-----------------------+--------------------------------------------------------------+ + | data_volume_type | String | Data disk type | + +-----------------------+-----------------------+--------------------------------------------------------------+ + | data_volume_size | Integer | Data disk capacity | + +-----------------------+-----------------------+--------------------------------------------------------------+ + | data_volume_count | Integer | Number of data disks | + +-----------------------+-----------------------+--------------------------------------------------------------+ + +Example +------- + +- Example request + + None + +- Example response + + .. code-block:: + + { + "total": 5, + "hosts": [ + { + "id": "063d1d47-ae91-4a48-840c-b3cfe4efbcf0", + "name": "a78e161c-d14f-4b68-8c2d-0219920ce844_node_core_IQhiC", + "ip": "192.168.0.169", + "status": "ACTIVE", + "flavor": "c6.4xlarge.4linux.mrs", + "type": "Core", + "mem": "16384", + "cpu": "8", + "root_volume_size": "40", + "data_volume_type": "SATA", + "data_volume_size": 100, + "data_volume_count": 1 + }, + { + "id": "dc5c6208-faa2-4727-a65a-2b1ce235d350", + "name": "a78e161c-d14f-4b68-8c2d-0219920ce844_node_master1_ASzkl", + "ip": "192.168.0.156", + "status": "ACTIVE", + "flavor": "c2.4xlarge.linux.mrs", + "type": "Master", + "mem": "32768", + "cpu": "16", + "root_volume_size": "40", + "data_volume_type": "SATA", + "data_volume_size": 100, + "data_volume_count": 1 + }, + { + "id": "c0ce793d-848b-448a-835b-ea0cac534b09", + "name": "a78e161c-d14f-4b68-8c2d-0219920ce844_node_core_ANnRN", + "ip": "192.168.0.243", + "status": "ACTIVE", + "flavor": "c6.4xlarge.4linux.mrs", + "type": "Core", + "mem": "16384", + "cpu": "8", + "root_volume_size": "40", + "data_volume_type": "SATA", + "data_volume_size": 100, + "data_volume_count": 1 + }, + { + "id": "95c23e43-ef6e-4732-b6ed-a5f1c7779fae", + "name": "a78e161c-d14f-4b68-8c2d-0219920ce844_node_core_uRRiA", + "ip": "192.168.0.126", + "status": "ACTIVE", + "flavor": "c6.4xlarge.4linux.mrs", + "type": "Core", + "mem": "16384", + "cpu": "8", + "root_volume_size": "40", + "data_volume_type": "SATA", + "data_volume_size": 100, + "data_volume_count": 1 + }, + { + "id": "63bdbf75-1133-4a94-8c27-1fa12c8b9e70", + "name": "a78e161c-d14f-4b68-8c2d-0219920ce844_node_master2_StqFu", + "ip": "192.168.0.22", + "status": "ACTIVE", + "flavor": "c2.4xlarge.linux.mrs", + "type": "Master", + "mem": "32768", + "cpu": "16", + "root_volume_size": "40", + "data_volume_type": "SATA", + "data_volume_size": 100, + "data_volume_count": 1 + } + ] + } + +Status Code +----------- + +:ref:`Table 5 ` describes the status code of this API. + +.. _mrs_02_0057__table33682380171927: + +.. table:: **Table 5** Status code + + =========== ======================================================== + Status Code Description + =========== ======================================================== + 200 The host list information has been successfully queried. + =========== ======================================================== + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/cluster_management_apis_v1/querying_cluster_details.rst b/api-ref/source/apis/cluster_management_apis_v1/querying_cluster_details.rst new file mode 100644 index 0000000..ffa2c23 --- /dev/null +++ b/api-ref/source/apis/cluster_management_apis_v1/querying_cluster_details.rst @@ -0,0 +1,465 @@ +:original_name: mrs_02_0031.html + +.. _mrs_02_0031: + +Querying Cluster Details +======================== + +Function +-------- + +This API is used to query details about a specified cluster. This API is incompatible with Sahara. + +URI +--- + +- Format + + GET /v1.1/{project_id}/cluster_infos/{cluster_id} + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | cluster_id | Yes | Cluster ID | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +**Request parameters** + +None. + +Response +-------- + +.. table:: **Table 2** Response parameter description + + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+============================================================================================================================================================================================================================================+ + | clusterId | String | Cluster ID | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | clusterName | String | Cluster name | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | masterNodeNum | String | Number of Master nodes deployed in a cluster | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | coreNodeNum | String | Number of Core nodes deployed in a cluster | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | totalNodeNum | String | Total number of nodes deployed in a cluster | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | clusterState | String | Cluster status. Valid values include: | + | | | | + | | | - **starting**: The cluster is being started. | + | | | - **running**: The cluster is running. | + | | | - **terminated**: The cluster has been terminated. | + | | | - **failed**: The cluster fails. | + | | | - **abnormal**: The cluster is abnormal. | + | | | - **terminating**: The cluster is being terminated. | + | | | - **frozen**: The cluster has been frozen. | + | | | - **scaling-out**: The cluster is being scaled out. | + | | | - **scaling-in**: The cluster is being scaled in. | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | createAt | String | Cluster creation time, which is a 10-bit timestamp | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | updateAt | String | Cluster update time, which is a 10-bit timestamp | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | billingType | String | Cluster billing mode | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dataCenter | String | Cluster work region | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | vpc | String | VPC name | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | fee | String | Cluster creation fee, which is automatically calculated | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | hadoopVersion | String | Hadoop version | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | masterNodeSize | String | Instance specifications of a Master node | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | coreNodeSize | String | Instance specifications of a Core node | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | componentList | Array | Component list. For details, see :ref:`Table 3 `. | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | externalIp | String | External IP address | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | externalAlternateIp | String | Backup external IP address | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | internalIp | String | Internal IP address | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | deploymentId | String | Cluster deployment ID | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | remark | String | Cluster remarks | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | orderId | String | Cluster creation order ID | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | azId | String | AZ ID | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | masterNodeProductId | String | Product ID of a Master node | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | masterNodeSpecId | String | Specification ID of a Master node | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | coreNodeProductId | String | Product ID of a Core node | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | coreNodeSpecId | String | Specification ID of a Core node | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | azName | String | AZ name | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | instanceId | String | Instance ID | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | vnc | String | URI for remotely logging in to an ECS | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | tenantId | String | Project ID | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | volumeSize | Integer | Disk storage space | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | subnetId | String | Subnet ID | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | subnetName | String | Subnet name | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | securityGroupsId | String | Security group ID | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | slaveSecurityGroupsId | String | Security group ID of a non-Master node. Currently, one MRS cluster uses only one security group. Therefore, this field has been discarded. This field returns the same value as **securityGroupsId** does for compatibility consideration. | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | bootstrap_scripts | Array | Bootstrap action script information. For more parameter description, see :ref:`Table 5 `. | + | | | | + | | | MRS 1.7.2 or later supports this parameter. | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | stageDesc | String | Cluster operation progress description. | + | | | | + | | | The cluster installation progress includes: | + | | | | + | | | - Verifying cluster parameters: Cluster parameters are being verified. | + | | | - Applying for cluster resources: Cluster resources are being applied for. | + | | | - Creating VMs: The VMs are being created. | + | | | - Initializing VMs: The VMs are being initialized. | + | | | - Installing MRS Manager: MRS Manager is being installed. | + | | | - Deploying the cluster: The cluster is being deployed. | + | | | - Cluster installation failed: Failed to install the cluster. | + | | | | + | | | The cluster scale-out progress includes: | + | | | | + | | | - Preparing for scale-out: Cluster scale-out is being prepared. | + | | | - Creating VMs: The VMs are being created. | + | | | - Initializing VMs: The VMs are being initialized. | + | | | - Adding nodes to the cluster: The nodes are being added to the cluster. | + | | | - Scale-out failed: Failed to scale out the cluster. | + | | | | + | | | The cluster scale-in progress includes: | + | | | | + | | | - Preparing for scale-in: Cluster scale-in is being prepared. | + | | | - Decommissioning instance: The instance is being decommissioned. | + | | | - Deleting VMs: The VMs are being deleted. | + | | | - Deleting nodes from the cluster: The nodes are being deleted from the cluster. | + | | | - Scale-in failed: Failed to scale in the cluster. | + | | | | + | | | If the cluster installation, scale-out, or scale-in fails, **stageDesc** will display the failure cause. For details, see :ref:`Table 8 `. | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | mrsManagerFinish | boolean | Whether MRS Manager installation is finished during cluster creation. | + | | | | + | | | - **true**: MRS Manager installation is finished. | + | | | - **false**: MRS Manager installation is not finished. | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | safeMode | String | Running mode of an MRS cluster | + | | | | + | | | - **0**: Normal cluster | + | | | - **1**: Security cluster | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | clusterVersion | String | Cluster version | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | nodePublicCertName | String | Name of the public key file | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | masterNodeIp | String | IP address of a Master node | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | privateIpFirst | String | Preferred private IP address | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | errorInfo | String | Error message | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | tags | Array | Tag information | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | chargingStartTime | String | Start time of billing | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | clusterType | String | Cluster type | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | logCollection | Integer | Whether to collect logs when cluster installation fails | + | | | | + | | | - **0**: Do not collect. | + | | | - **1**: Collect. | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | taskNodeGroups | List | List of Task nodes. For more parameter description, see :ref:`Table 4 `. | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | nodeGroups | List | List of Master, Core and Task nodes. For more parameter description, | + | | | | + | | | see :ref:`Table 4 `. | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | masterDataVolumeType | String | Data disk storage type of the Master node. Currently, SATA, SAS and SSD are supported. | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | masterDataVolumeSize | Integer | Data disk storage space of the Master node. To increase data storage capacity, you can add disks at the same time when creating a cluster. | + | | | | + | | | Value range: 100 GB to 32,000 GB | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | masterDataVolumeCount | Integer | Number of data disks of the Master node. | + | | | | + | | | The value can be set to **1** only. | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | coreDataVolumeType | String | Data disk storage type of the Core node. Currently, SATA, SAS and SSD are supported. | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | coreDataVolumeSize | Integer | Data disk storage space of the Core node. To increase data storage capacity, you can add disks at the same time when creating a cluster. | + | | | | + | | | Value range: 100 GB to 32,000 GB | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | coreDataVolumeCount | Integer | Number of data disks of the Core node. | + | | | | + | | | Value range: 1 to 10 | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | scale | String | Node change status. If this parameter is left blank, the cluster nodes are not changed. | + | | | | + | | | Possible values are as follows: | + | | | | + | | | - **scaling-out**: The cluster is being scaled out. | + | | | - **scaling-in**: The cluster is being scaled in. | + | | | - **scaling-error**: The cluster is in the running state and fails to be scaled in or out or the specifications fail to be scaled up for the last time. | + | | | - **scaling-up**: The Master node specifications are being scaled up. | + | | | - **scaling_up_first**: The standby Master node specifications are being scaled up. | + | | | - **scaled_up_first**: The standby Master node specifications have been scaled up successfully. | + | | | - **scaled-up-success**: The Master node specifications have been scaled up successfully. | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0031__t0bc8fb7b4f444931b3c1b0ed022c2f79: + +.. table:: **Table 3** **componentList** parameter description + + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+============================================================================================================================+ + | componentId | String | Component ID | + | | | | + | | | - Component IDs of MRS 3.1.2-LTS.3 are as follows: | + | | | | + | | | - MRS 3.1.2-LTS.3_001: Hadoop | + | | | - MRS 3.1.2-LTS.3_002: Spark2x | + | | | - MRS 3.1.2-LTS.3_003: HBase | + | | | - MRS 3.1.2-LTS.3_004: Hive | + | | | - MRS 3.1.2-LTS.3_005: Hue | + | | | - MRS 3.1.2-LTS.3_006: Loader | + | | | - MRS 3.1.2-LTS.3_007: Kafka | + | | | - MRS 3.1.2-LTS.3_008: Flume | + | | | - MRS 3.1.2-LTS.3_009: FTP-Server | + | | | - MRS 3.1.2-LTS.3_010: Solr | + | | | - MRS 3.1.2-LTS.3_010: Redis | + | | | - MRS 3.1.2-LTS.3_011: Elasticsearch | + | | | - MRS 3.1.2-LTS.3_012: Flink | + | | | - MRS 3.1.2-LTS.3_013: Oozie | + | | | - MRS 3.1.2-LTS.3_014: GraphBase | + | | | - MRS 3.1.2-LTS.3_015: ZooKeeper | + | | | - MRS 3.1.2-LTS.3_016: HetuEngine | + | | | - MRS 3.1.2-LTS.3_017: Ranger | + | | | - MRS 3.1.2-LTS.3_018: Tez | + | | | - MRS 3.1.2-LTS.3_019: ClickHouse | + | | | - MRS 3.1.2-LTS.3_020: Metadata | + | | | - MRS 3.1.2-LTS.3_021: KMS | + | | | | + | | | - Component IDs of MRS 3.1.0-LTS.1 are as follows: | + | | | | + | | | - MRS 3.1.0-LTS.1_001: Hadoop | + | | | - MRS 3.1.0-LTS.1_002: Spark2x | + | | | - MRS 3.1.0-LTS.1_003: HBase | + | | | - MRS 3.1.0-LTS.1_004: Hive | + | | | - MRS 3.1.0-LTS.1_005: Hue | + | | | - MRS 3.1.0-LTS.1_006: Loader | + | | | - MRS 3.1.0-LTS.1_007: Kafka | + | | | - MRS 3.1.0-LTS.1_008: Flume | + | | | - MRS 3.1.0-LTS.1_009: Flink | + | | | - MRS 3.1.0-LTS.1_010: Oozie | + | | | - MRS 3.1.0-LTS.1_011: ZooKeeper | + | | | - MRS 3.1.0-LTS.1_012: HetuEngine | + | | | - MRS 3.1.0-LTS.1_013: Ranger | + | | | - MRS 3.1.0-LTS.1_014: Tez | + | | | - MRS 3.1.0-LTS.1_015: ClickHouse | + | | | | + | | | - Component IDs of MRS 2.1.0 are as follows: | + | | | | + | | | - MRS 2.1.0_001: Hadoop | + | | | - MRS 2.1.0_002: Spark | + | | | - MRS 2.1.0_003: HBase | + | | | - MRS 2.1.0_004: Hive | + | | | - MRS 2.1.0_005: Hue | + | | | - MRS 2.1.0_006: Kafka | + | | | - MRS 2.1.0_007: Storm | + | | | - MRS 2.1.0_008: Loader | + | | | - MRS 2.1.0_009: Flume | + | | | - MRS 2.1.0_010: Tez | + | | | - MRS 2.1.0_011: Presto | + | | | - MRS 2.1.0_014: Flink | + | | | | + | | | - Component IDs of MRS 1.9.2 are as follows: | + | | | | + | | | - MRS 1.9.2_001: Hadoop | + | | | - MRS 1.9.2_002: Spark | + | | | - MRS 1.9.2_003: HBase | + | | | - MRS 1.9.2_004: Hive | + | | | - MRS 1.9.2_005: Hue | + | | | - MRS 1.9.2_006: Kafka | + | | | - MRS 1.9.2_007: Storm | + | | | - MRS 1.9.2_008: Loader | + | | | - MRS 1.9.2_009: Flume | + | | | - MRS 1.9.2_010: Presto | + | | | - MRS 1.9.2_011: KafkaManager | + | | | - MRS 1.9.2_012: Flink | + | | | - MRS 1.9.2_013: OpenTSDB | + | | | - MRS 1.9.2_015: Alluxio | + | | | - MRS 1.9.2_16: Ranger | + | | | - MRS 1.9.2_17: Tez | + | | | | + | | | - Component IDs of MRS 1.7.2 and MRS 1.6.3 are as follows: | + | | | | + | | | - MRS 1.7.2_001: Hadoop | + | | | - MRS 1.7.2_002: Spark | + | | | - MRS 1.7.2_003: HBase | + | | | - MRS 1.7.2_004: Hive | + | | | - MRS 1.7.2_005: Hue | + | | | - MRS 1.7.2_006: Kafka | + | | | - MRS 1.7.2_007: Storm | + | | | - MRS 1.7.2_008: Loader | + | | | - MRS 1.7.2_009: Flume | + | | | | + | | | For example, the **component_id** of Hadoop is **MRS 2.1.0_001**, **MRS 1.9.2_001**, **MRS 1.7.2_001**, **MRS 1.6.3_001**. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------+ + | componentName | String | Component name | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------+ + | componentVersion | String | Component version | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------+ + | componentDesc | String | Component description | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0031__t985f9eb1ce0c4e0186e16ed2a6c7e731: + +.. table:: **Table 4** **NodeGroup** parameter description + + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +============================+=======================+==================================================================================================================================================================+ + | groupName | String | Node group name | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | nodeNum | Integer | Number of nodes. The value ranges from 0 to 500. The minimum number of Master and Core nodes is 1 and the total number of Core and Task nodes cannot exceed 500. | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | nodeSize | String | Instance specifications of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | nodeSpecId | String | Instance specification ID of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | nodeProductId | String | Instance product ID of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | vmProductId | String | VM product ID of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | vmSpecCode | String | VM specifications of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | rootVolumeSize | Integer | System disk size of a node. This parameter is not configurable and its default value is **40 GB**. | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | rootVolumeProductId | String | System disk product ID of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | rootVolumeType | String | System disk type of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | rootVolumeResourceSpecCode | String | System disk product specifications of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | rootVolumeResourceType | String | System disk product type of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dataVolumeType | String | Data disk storage type of a node. Currently, SATA, SAS and SSD are supported. | + | | | | + | | | - SATA: Common I/O | + | | | - SAS: High I/O | + | | | - SSD: Ultra-high I/O | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dataVolumeCount | Integer | Number of data disks of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dataVolumeSize | String | Data disk storage space of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dataVolumeProductId | String | Data disk product ID of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dataVolumeResourceSpecCode | String | Data disk product specifications of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | dataVolumeResourceType | String | Data disk product type of a node | + +----------------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0031__table1258382865010: + +.. table:: **Table 5** **bootstrap_scripts** parameter description + + +------------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +========================+=======================+==========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================+ + | name | String | Name of a bootstrap action script. It must be unique in a cluster. | + | | | | + | | | The value can contain only digits, letters, spaces, hyphens (-), and underscores (_) and cannot start with a space. | + | | | | + | | | The value can contain 1 to 64 characters. | + +------------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | uri | String | Path of the shell script. Set this parameter to an OBS bucket path or a local VM path. | + | | | | + | | | - OBS bucket path: Enter a script path manually. For example, enter the path of the public sample script provided by MRS. Example: **s3a://bootstrap/presto/presto-install.sh**. If **dualroles** is installed, the parameter of the **presto-install.sh** script is **dualroles**. If **worker** is installed, the parameter of the **presto-install.sh** script is **worker**. Based on the Presto usage habit, you are advised to install **dualroles** on the active Master nodes and **worker** on the Core nodes. | + | | | - Local VM path: Enter a script path. The script path must start with a slash (/) and end with **.sh**. | + +------------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | parameters | String | Bootstrap action script parameters | + +------------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | nodes | Array String | Type of a node where the bootstrap action script is executed. The value can be Master, Core, or Task. | + +------------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | active_master | Boolean | Whether the bootstrap action script runs only on active Master nodes. | + | | | | + | | | The default value is **false**, indicating that the bootstrap action script can run on all Master nodes. | + +------------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | before_component_start | Boolean | Time when the bootstrap action script is executed. Currently, the following two options are available: **Before component start** and **After component start** | + | | | | + | | | The default value is **false**, indicating that the bootstrap action script is executed after the component is started. | + +------------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | fail_action | String | Whether to continue executing subsequent scripts and creating a cluster after the bootstrap action script fails to be executed. | + | | | | + | | | - **continue**: Continue to execute subsequent scripts. | + | | | - **errorout**: Stop the action. | + | | | | + | | | The default value is **errorout**, indicating that the action is stopped. | + | | | | + | | | .. note:: | + | | | | + | | | You are advised to set this parameter to **continue** in the commissioning phase so that the cluster can continue to be installed and started no matter whether the bootstrap action is successful. | + +------------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | start_time | String | Execution time of one boot operation script. | + +------------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | state | String | Running state of one bootstrap action script | + | | | | + | | | - **PENDING** | + | | | - **IN_PROGRESS** | + | | | - **SUCCESS** | + | | | - **FAILURE** | + +------------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + + None. + +- Example response + + None. + +Status Code +----------- + +:ref:`Table 6 ` describes the status code of this API. + +.. _mrs_02_0031__te1408c9f77054f128c7aa7ade589dc24: + +.. table:: **Table 6** Status code + + =========== =============================================== + Status Code Description + =========== =============================================== + 200 Cluster details have been queried successfully. + =========== =============================================== + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/cluster_management_apis_v1/resizing_a_cluster.rst b/api-ref/source/apis/cluster_management_apis_v1/resizing_a_cluster.rst new file mode 100644 index 0000000..3f0e62a --- /dev/null +++ b/api-ref/source/apis/cluster_management_apis_v1/resizing_a_cluster.rst @@ -0,0 +1,387 @@ +:original_name: mrs_02_0029.html + +.. _mrs_02_0029: + +Resizing a Cluster +================== + +Function +-------- + +This API is used to manually scale out or scale in Core or Task nodes in a cluster that has been created. After an MRS cluster is created, the number of Master nodes cannot be adjusted. That is, Master nodes cannot be scaled in or out. This API is incompatible with Sahara. + +Only clusters in the **Running** state can be scaled out or in. + +URI +--- + +- Format + + PUT /v1.1/{project_id}/cluster_infos/{cluster_id} + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | cluster_id | Yes | Cluster ID | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +.. table:: **Table 2** Request parameter description + + +------------+-----------+--------+----------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +============+===========+========+==============================================================================================+ + | service_id | No | String | Service ID. This parameter is reserved for extension. You do not need to set this parameter. | + +------------+-----------+--------+----------------------------------------------------------------------------------------------+ + | plan_id | No | String | Plan ID. This parameter is reserved for extension. You do not need to set this parameter. | + +------------+-----------+--------+----------------------------------------------------------------------------------------------+ + | parameters | Yes | Object | Core parameters. For details, see :ref:`Table 3 `. | + +------------+-----------+--------+----------------------------------------------------------------------------------------------+ + +.. _mrs_02_0029__table19445385114112: + +.. table:: **Table 3** **parameters** description + + +------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +========================+=================+=================+========================================================================================================================================================================================================================================================================================================================================================================================+ + | order_id | No | String | Order ID obtained by the system during scale-out or scale-in. You do not need to set the parameter. | + +------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | scale_type | Yes | String | - **scale_in**: cluster scale-in | + | | | | - **scale_out**: cluster scale-out | + +------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | node_id | Yes | String | ID of the newly added or removed node. The parameter value is fixed to **node_orderadd**. The ID of a newly added or removed node includes **node_orderadd**, for example, **node-orderadd-TBvSr.com**. | + +------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | node_group | No | String | Node group to be scaled out or in | + | | | | | + | | | | - If the value of **node_group** is **core_node_default_group**, the node group is a Core node group. | + | | | | - If the value of **node_group** is **task_node_default_group**, the node group is a Task node group. | + | | | | | + | | | | If it is left blank, the default value **core_node_default_group** is used. | + +------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | task_node_info | No | Object | Task node specifications. For more parameter description, see :ref:`Table 5 `. | + | | | | | + | | | | - When the number of Task nodes is **0**, this parameter is used to specify Task node specifications. | + | | | | - When the number of Task nodes is greater than **0**, this parameter is unavailable. | + +------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | instances | Yes | String/Integer | Number of nodes to be added or removed | + | | | | | + | | | | - The maximum number of nodes to be added is 500 minus the number of Core and Task nodes. For example, the current number of Core nodes is 3, the number of nodes to be added must be less than or equal to 497. | + | | | | | + | | | | A maximum of 500 Core and Task nodes are supported by default. If more than 500 Core and Task nodes are required, contact technical support engineers or call a background API to modify the database. | + | | | | | + | | | | - Nodes can be deleted for cluster scale-out when the number of Core nodes is greater than 3 or the number of Task nodes is greater than 0. For example, if there are 5 Core nodes and 5 Task nodes in a cluster, only 2 (5 minus 3) Core nodes are available for deletion and 5 or fewer than 5 Task nodes can be deleted. | + +------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | skip_bootstrap_scripts | No | Boolean | This parameter is valid only when a bootstrap action is configured during cluster creation and takes effect during scale-out. It indicates whether the bootstrap action specified during cluster creation is performed on nodes added during scale-out. The default value is **false**, indicating that the bootstrap action is performed. MRS 1.7.2 or later supports this parameter. | + +------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | scale_without_start | No | boolean | Whether to start components on the added nodes after cluster scale-out | + | | | | | + | | | | - **true**: Do not start components after scale-out. | + | | | | - **false**: Start components after scale-out. | + | | | | | + | | | | This parameter is valid only in MRS 1.7.2 or later. | + +------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | server_ids | No | List | ID list of Task nodes to be deleted during task node scale-in. | + | | | | | + | | | | - This parameter does not take effect when **scale_type** is set to **scale-out**. | + | | | | - If **scale_type** is set to **scale-in** and cannot be left blank, the system deletes the specified Task nodes. | + | | | | - When **scale_type** is set to **scale-in** and **server_ids** is left blank, the system automatically deletes the Task nodes based on the system rules. | + +------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | previous_values | No | Object | Extension parameter. You do not need to set this parameter. For details, see :ref:`Table 4 `. | + +------------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0029__table1718927182716: + +.. table:: **Table 4** Parameter description of **previous_values** + + +-----------------+-----------------+-----------------+-------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+===========================================+ + | plan_id | No | String | Reserve the parameter for extending APIs. | + | | | | | + | | | | You do not need to set the parameter. | + +-----------------+-----------------+-----------------+-------------------------------------------+ + +.. _mrs_02_0029__table629219569398: + +.. table:: **Table 5** **task_node_info** parameter description + + +-------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +===================+=================+=================+=====================================================================================================+ + | node_size | Yes | String | Instance specifications of a Task node, for example, c6.4xlarge.4linux.mrs | + | | | | | + | | | | For details about instance specifications, see :ref:`ECS Specifications Used by MRS `. | + +-------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | data_volume_type | No | String | Data disk storage type of the Task node, supporting SATA, SAS, and SSD currently | + | | | | | + | | | | - SATA: Common I/O | + | | | | - SAS: High I/O | + | | | | - SSD: Ultra-high I/O | + +-------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | data_volume_count | No | Integer | Number of data disks of a Task node | + | | | | | + | | | | Value range: 1 to 10 | + +-------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | data_volume_size | No | Integer | Data disk storage space of a Task node | + | | | | | + | | | | Value range: 100 GB to 32,000 GB | + +-------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response +-------- + +**Response parameters** + +:ref:`Table 6 ` describes the response parameters. + +.. _mrs_02_0029__table8319691114112: + +.. table:: **Table 6** Response parameter description + + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+================================================================================================================+ + | result | String | Operation result | + | | | | + | | | - **succeeded**: The operation is successful. | + | | | - :ref:`Table 8 ` describes the error codes returned upon operation failures. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + + Scaling out Core nodes: + + .. code-block:: + + { + "service_id": "", + "plan_id": "", + "parameters": { + "order_id": "", + "scale_type": "scale_out", + "node_id": "node_orderadd", + "node_group": "core_node_default_group", + "instances": "1", + "skip_bootstrap_scripts":false, + "scale_without_start":false + }, + "previous_values": { + "plan_id": "" + } + } + + Scaling out Task nodes when the number of the existing Task nodes is greater than zero: + + .. code-block:: + + { + "service_id": "", + "plan_id": "", + "parameters": { + "order_id": "", + "scale_type": "scale_out", + "node_id": "node_orderadd", + "node_group": "task_node_default_group", + "instances": "1", + "skip_bootstrap_scripts":false, + "scale_without_start":false + }, + "previous_values": { + "plan_id": "" + } + } + + Scaling out Task nodes when the number of the existing Task nodes is zero: + + .. code-block:: + + { + "service_id": "", + "plan_id": "", + "parameters": { + "order_id": "", + "scale_type": "scale_out", + "node_id": "node_orderadd", + "node_group": "task_node_default_group", + "task_node_info": { + "node_size": "s1.xlarge.linux.mrs", + "data_volume_type":"SATA", + "data_volume_count":2, + "data_volume_size":200 + }, + "instances": "1", + "scale_without_start":false + + + }, + "previous_values": { + "plan_id": "" + } + } + + Scaling in Core nodes: + + .. code-block:: + + { + "service_id": "", + "plan_id": "", + "parameters": { + "order_id": "", + "scale_type": "scale_in", + "node_id": "node_orderadd", + "node_group": "core_node_default_group", + "instances": "1" + + + }, + "previous_values": { + "plan_id": "" + } + } + + Scaling in Task nodes: + + .. code-block:: + + { + "service_id": "", + "plan_id": "", + "parameters": { + "order_id": "", + "scale_type": "scale_in", + "node_id": "node_orderadd", + "node_group": "task_node_default_group", + "instances": "1" + + + }, + "previous_values": { + "plan_id": "" + } + } + + The following is an example of a specified Task node scale-in: + + .. code-block:: + + { + "service_id": "", + "plan_id": "", + "parameters": { + "order_id": "", + "scale_type": "scale_in", + "node_id": "node_orderadd", + "node_group": "task_node_default_group", + "instances": "2", + "server_ids": ["c9573435-7814-4b2c-9131-ad78b814414c", "a4951009-6a0f-4e7b-9c81-9d4bd1f8c537"] + }, + "previous_values": { + "plan_id": "" + } + } + +- Example response + + .. code-block:: + + { + "result": "succeeded" + } + +Status Code +----------- + +- :ref:`Table 7 ` describes the status code of this API. + + .. _mrs_02_0029__table60948494114112: + + .. table:: **Table 7** Status code + + +-------------+-----------------------------------------------------------------+ + | Status Code | Description | + +=============+=================================================================+ + | 200 | The Core or Task nodes have been successfully scaled out or in. | + +-------------+-----------------------------------------------------------------+ + +- :ref:`Table 8 ` describes the error codes returned upon operation failures. + + .. _mrs_02_0029__table101661350414: + + .. table:: **Table 8** Error codes + + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | Error Code | Message | + +============+==========================================================================================================================+ + | 12000001 | Identity verification is invalid | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | 12000002 | The parameter is invalid. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | 12000003 | The cluster does not exist. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | 12000009 | The method parameter is invalid. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | 12000013 | Scale-in of cluster *XX* failed. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | 12000014 | Scale-out of cluster *XX* failed. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | 12000017 | Scale-out or scale-in is not allowed for clusters that are not in the **Running** state. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | 12000018 | Scale-out or scale-in cannot be performed again because it is in progress. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | 12000019 | Failed to obtain hosts of the cluster. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | 12000028 | The maximum number of Core nodes in a cluster is *N*. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | 12000029 | Failed to obtain the quota. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | 12000030 | The requested number of nodes in the cluster exceeds the available quota. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | 12000031 | The requested number of vCPUs in the cluster exceeds the available quota. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | 12000032 | The requested memory of the cluster exceeds the available quota. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | 12000033 | The requested number of disks in the cluster exceeds the available quota. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | 12000034 | The requested disk capacity of the cluster exceeds the available quota. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | 12000054 | The operation is not supported. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | 12000067 | The cluster cannot be scaled out because its version is too early. Upgrade the cluster to the latest version. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | 12000068 | The status of some nodes is not running in the cluster. Try again later. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | 12000121 | Scale-out is not allowed because the cluster has an unpaid order. Scale out the cluster again after you pay the order. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | MRS.101 | Your request could not be fulfilled because your quota is insufficient. Contact technical support to increase the quota. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | MRS.102 | The token cannot be null or invalid. Try again later or contact customer service. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | MRS.103 | Invalid request. Try again later or contact customer service. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | MRS.104 | Insufficient resources. Try again later or contact customer service. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | MRS.105 | Insufficient IP addresses in the existing subnet. Try again later or contact customer service. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | MRS.201 | Failed due to an ECS error. Try again later or contact customer service. (ECS: *xxxx*, ECS error information) | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | MRS.202 | Failed due to an IAM error. Try again later or contact customer service. (IAM: *xxxx*, IAM error information) | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | MRS.203 | Failed due to a VPC error. Try again later or contact customer service. (VPC: *xxxx*, VPC error information) | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + | MRS.300 | MRS system error. Try again later or contact customer service. | + +------------+--------------------------------------------------------------------------------------------------------------------------+ + +- For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/cluster_management_apis_v2/creating_clusters.rst b/api-ref/source/apis/cluster_management_apis_v2/creating_clusters.rst new file mode 100644 index 0000000..3ff5e20 --- /dev/null +++ b/api-ref/source/apis/cluster_management_apis_v2/creating_clusters.rst @@ -0,0 +1,1541 @@ +:original_name: mrs_02_0101.html + +.. _mrs_02_0101: + +Creating Clusters +================= + +Function +-------- + +This API is used to create an MRS cluster. + +Before using the API, you need to obtain the resources listed in :ref:`Table 1 `. + +.. _mrs_02_0101__tbbd2986d18874f82a8ab886ac25a57f8: + +.. table:: **Table 1** Obtaining resources + + +-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Resource | How to Obtain | + +===================================+=======================================================================================================================================================================================+ + | VPC | See operation instructions in **VPC > Querying VPCs** and **VPC > Creating a VPC** in the *VPC API Reference*. | + +-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Subnet | See operation instructions in **Subnet > Querying Subnets** and **Subnet > Creating a Subnet** in the *VPC API Reference*. | + +-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Key Pair | See operation instructions in **ECS SSH Key Management > Querying SSH Key Pairs** and **ECS SSH Key Management > Creating and Importing an SSH Key Pair** in the *ECS API Reference*. | + +-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Zone | Obtain the region and AZ information. For more information about regions and AZs, see `Regions and Endpoints `__. | + +-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Version | Currently, MRS 1.6.3, MRS 1.7.2, MRS 1.9.2 MRS 2.1.0, MRS 3.1.0-LTS.1 and MRS 3.1.2-LTS.3 are supported. | + +-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Component | - MRS 3.1.2-LTS.3 supports the following components: | + | | | + | | - The analysis cluster contains the following components: Hadoop, Spark2x, HBase, Hive, Hue, HetuEngine, Loader, Flink, Oozie, ZooKeeper, Ranger, and Tez. | + | | - The streaming cluster contains the following components: Kafka, Flume, ZooKeeper, and Ranger. | + | | - The hybrid cluster contains the following components: Hadoop, Spark2x, HBase, Hive, Hue, HetuEngine, Loader, Flink, Oozie, ZooKeeper, Ranger, Tez, Kafka, and Flume. | + | | - A custom cluster contains the following components: Hadoop, Spark2x, HBase, Hive, Hue, HetuEngine, Loader, Kafka, Flume, Flink, Oozie, ZooKeeper, Ranger, Tez, and ClickHouse. | + | | | + | | - MRS 3.1.0-LTS.1 supports the following components: | + | | | + | | - The analysis cluster contains the following components: Hadoop, Spark2x, HBase, Hive, Hue, HetuEngine, Loader, Flink, Oozie, ZooKeeper, Ranger, and Tez. | + | | - The streaming cluster contains the following components: Kafka, Flume, ZooKeeper, and Ranger. | + | | - The hybrid cluster contains the following components: Hadoop, Spark2x, HBase, Hive, Hue, HetuEngine, Loader, Flink, Oozie, ZooKeeper, Ranger, Tez, Kafka, and Flume. | + | | - A custom cluster contains the following components: Hadoop, Spark2x, HBase, Hive, Hue, HetuEngine, Loader, Kafka, Flume, Flink, Oozie, ZooKeeper, Ranger, and Tez. | + | | | + | | - MRS 2.1.0 supports the following components: | + | | | + | | - The analysis cluster contains the following components: Presto, Hadoop, Spark, HBase, Hive, Hue, Loader, Tez, Flink. | + | | - The streaming cluster contains the following components: Kafka, Storm, and Flume. | + | | - The hybrid cluster contains the following components: Hadoop, Hive, Presto, Spark, Tez, and Flink. | + | | | + | | - MRS 1.9.2 supports the following components: | + | | | + | | - The analysis cluster contains the following components: Presto, Hadoop, Spark, HBase, Opentsdb, Hive, Hue, Loader, Tez, Flink, Alluxio and Ranger | + | | - The streaming cluster contains the following components: Kafka, KafkaManager, Storm, and Flume. | + | | - The hybrid cluster contains the following components: Hadoop, Hive, Presto, Spark, Tez, Kafka, Flink, and Ranger. | + | | | + | | - MRS 1.7.2 and MRS 1.6.3 support the following components: | + | | | + | | - The analysis cluster contains the following components: Hadoop, Spark, HBase, Hive, Hue, and Loader | + | | - The streaming cluster contains the following components: Kafka, Storm, and Flume. | + +-----------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +URI +--- + +- URI format + + POST /v2/{project_id}/clusters + +- Parameters + + .. table:: **Table 2** URI parameter + + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Name | Mandatory | Description | + +============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +.. table:: **Table 3** Parameter description + + +------------------------+-----------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +========================+=================+==========================+=============================================================================================================================================================================================================================================================================================================================================================================================+ + | cluster_version | Yes | String | Cluster version. | + | | | | | + | | | | Possible values are as follows: | + | | | | | + | | | | - MRS 1.6.3 | + | | | | - MRS 1.7.2 | + | | | | - MRS 1.9.2 | + | | | | - MRS 2.1.0 | + | | | | - MRS 3.1.0-LTS.1 | + | | | | - MRS 3.1.2-LTS.3 | + +------------------------+-----------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | cluster_name | Yes | String | Cluster name. It must be unique. | + | | | | | + | | | | A cluster name can contain only 2 to 64 characters. Only letters, digits, hyphens (-), and underscores (_) are allowed. | + +------------------------+-----------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | cluster_type | Yes | String | Cluster type. The options are as follows: | + | | | | | + | | | | - **ANALYSIS**: analysis cluster | + | | | | - **STREAMING**: streaming cluster | + | | | | - **MIXED**: hybrid cluster | + | | | | - **CUSTOM**: customized cluster, which is supported only by MRS 3.x.x. | + +------------------------+-----------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | charge_info | No | ChargeInfo | Charging type information. For details, see :ref:`Table 6 `. | + +------------------------+-----------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | region | Yes | String | Region of the cluster. For details, see `Regions and Endpoints `__. | + +------------------------+-----------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | vpc_name | Yes | String | Name of the VPC where the subnet locates | + | | | | | + | | | | Perform the following operations to obtain the VPC name from the VPC management console: | + | | | | | + | | | | #. Log in to the management console. | + | | | | #. Click **Virtual Private Cloud** and select **Virtual Private Cloud** from the left list. | + | | | | | + | | | | On the **Virtual Private Cloud** page, obtain the VPC name from the list. | + +------------------------+-----------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | subnet_name | Yes | String | Subnet name. | + | | | | | + | | | | Perform the following operations to obtain the subnet name from the VPC management console: | + | | | | | + | | | | #. Log in to the management console. | + | | | | #. Click **Virtual Private Cloud** and select **Virtual Private Cloud** from the left list. | + | | | | | + | | | | On the **Virtual Private Cloud** page, obtain the subnet name of the VPC from the list. | + +------------------------+-----------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | components | Yes | String | List of component names, which are separated by commas (,). For details about the component names, see the component list of each version in Table 4-1. | + +------------------------+-----------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | availability_zone | Yes | String | Name of an AZ. | + | | | | | + | | | | AZ information. For details, see `Regions and Endpoints `__. | + +------------------------+-----------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | security_groups_id | No | String | Security group ID of the cluster | + | | | | | + | | | | - If this parameter is left blank, MRS automatically creates a security group, whose name starts with **mrs_{cluster_name}**. | + | | | | - If this parameter is not left blank, a fixed security group is used to create a cluster. The transferred ID must be the security group ID owned by the current tenant. The security group must include an inbound rule in which all protocols and all ports are allowed and the source is the IP address of the specified node on the management plane. | + +------------------------+-----------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | safe_mode | Yes | String | Running mode of an MRS cluster | + | | | | | + | | | | - **SIMPLE**: normal cluster. In a normal cluster, Kerberos authentication is disabled, and users can use all functions provided by the cluster. | + | | | | - **KERBEROS**: security cluster. In a security cluster, Kerberos authentication is enabled, and common users cannot use the file management and job management functions of an MRS cluster or view cluster resource usage and the job records of Hadoop and Spark. To use more cluster functions, the users must contact the Manager administrator to assign more permissions. | + +------------------------+-----------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | manager_admin_password | Yes | String | Password of the MRS Manager administrator. | + | | | | | + | | | | - Must be a string and 8 to 32 characters long. | + | | | | - The password must contain at least three types of the following characters (if the value of cluster_version is FusionInsight 6.5.1, the password must contain at least four types of the following characters): | + | | | | | + | | | | - Lowercase letters | + | | | | - Uppercase letters | + | | | | - Digits | + | | | | - Special characters: :literal:`\`~!@#$%^&*()-_=+\\|[{}];:'",<.>/?` | + | | | | - Spaces | + | | | | | + | | | | - Cannot be the username or the username spelled backwards. | + | | | | | + | | | | .. note:: | + | | | | | + | | | | For MRS 1.7.2 or earlier, this parameter is mandatory only when **safe_mode** is set to **KERBEROS**. | + +------------------------+-----------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | login_mode | Yes | String | Node login mode. | + | | | | | + | | | | - **PASSWORD**: password-based login. If this value is selected, **node_root_password** cannot be left blank. | + | | | | - **KEYPAIR**: specifies the key pair used for login. If this value is selected, **node_keypair_name** cannot be left blank. | + +------------------------+-----------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | node_root_password | No | String | Password of user **root** for logging in to a cluster node | + | | | | | + | | | | A password must meet the following requirements: | + | | | | | + | | | | - Must be a string and 8 to 26 characters long. | + | | | | - Must contain at least three of the following: uppercase letters, lowercase letters, digits, and special characters (``!@$%^-_=+[{}]:,./?``), but must not contain spaces. | + | | | | - Cannot be the username or the username spelled backwards. | + +------------------------+-----------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | node_keypair_name | No | String | Name of a key pair You can use a key pair to log in to the Master node in the cluster. | + +------------------------+-----------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | log_collection | No | Integer | Whether to collect logs when cluster creation fails | + | | | | | + | | | | - **0**: Do not collect. | + | | | | - **1**: Collect. | + | | | | | + | | | | The default value is **1**, indicating that OBS buckets will be created and only used to collect logs that record MRS cluster creation failures. | + +------------------------+-----------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | eip_address | No | String | An EIP bound to an MRS cluster can be used to access MRS Manager. The EIP must have been created and must be in the same region as the cluster. | + +------------------------+-----------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | mrs_ecs_default_agency | No | String | Name of the agency bound to a cluster node by default. The value is fixed to **MRS_ECS_DEFAULT_AGENCY**. | + | | | | | + | | | | An agency allows ECS or BMS to manage MRS resources. You can configure an agency of the ECS type to automatically obtain the AK/SK to access OBS. | + | | | | | + | | | | The **MRS_ECS_DEFAULT_AGENCY** agency has the OBS OperateAccess permission of OBS and the CES FullAccess (for users who have enabled fine-grained policies), CES Administrator, and KMS Administrator permissions in the region where the cluster is located. | + +------------------------+-----------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | template_id | No | String | For **Custom** cluster type, it is used to specify the common node configurations used for deployment. | + | | | | | + | | | | - mgmt_control_combined_v2: indicates the **Compact** configuration. The management node and control node are deployed on the Master node, and data instances are deployed in the same node group. This deployment mode applies to scenarios where the number of control nodes is less than 100, reducing costs. | + | | | | - mgmt_control_separated_v2: indicates the **OMS-separate** configuration. The management node and control node are deployed on different Master nodes, and data instances are deployed in the same node group. This deployment mode is applicable to a cluster with 100 to 500 control nodes and delivers better performance in high-concurrency load scenarios. | + | | | | - mgmt_control_data_separated_v2: indicates the **Full-size** configuration. The management node and control node are deployed on different Master nodes, and data instances are deployed in different node groups. This deployment mode is applicable to a cluster with more than 500 control nodes. Components can be deployed separately, which can be used for a larger cluster scale. | + +------------------------+-----------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | tags | No | Array of Tag | Cluster tag For more parameter description, see :ref:`Table 4 `. | + | | | | | + | | | | A maximum of 10 tags can be added to a cluster. | + +------------------------+-----------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | node_groups | Yes | Array of NodeGroup | Information about the node groups in the cluster. For details about the parameters, see :ref:`Table 5 `. | + +------------------------+-----------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | bootstrap_scripts | No | Array of BootstrapScript | Bootstrap action script information. For more parameter description, see :ref:`Table 8 `. | + | | | | | + | | | | MRS 1.7.2 or later supports this parameter. | + +------------------------+-----------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | add_jobs | No | Array of AddJobReq | Jobs can be submitted when a cluster is created. Currently, only one job can be created. For details about job parameters, see :ref:`Table 9 `. | + +------------------------+-----------------+--------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0101__table16429741613: + +.. table:: **Table 4** Tag structure + + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+===================================================================================================================+ + | key | Yes | String | Tag key. | + | | | | | + | | | | - It contains a maximum of 36 Unicode characters and cannot be an empty string. | + | | | | - The tag key can contain only uppercase letters, lowercase letters, digits, hyphens (-), and underscores (_). | + | | | | - The tag key of a resource must be unique. | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------+ + | value | Yes | String | Value. | + | | | | | + | | | | - The value can contain 0 to 43 unicode characters that can be blank. | + | | | | - The tag value can contain only uppercase letters, lowercase letters, digits, hyphens (-), and underscores (_). | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0101__table3419221413: + +.. table:: **Table 5** NodeGroup structure description + + +---------------------+-----------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=====================+=================+===================+==========================================================================================================================================================================================================================================================================+ + | group_name | Yes | String | Node group name. The value can contain a maximum of 64 characters, including uppercase and lowercase letters, arrays, hyphens (-), and underscores (_). The rules for configuring node groups are as follows: | + | | | | | + | | | | - **master_node_default_group**: Master node group, which must be included in all cluster types. | + | | | | - **core_node_analysis_group**: analysis Core node group, which must be contained in the analysis cluster and hybrid cluster. | + | | | | - **core_node_streaming_group**: indicates the streaming Core node group, which must be included in both streaming and hybrid clusters. | + | | | | - **task_node_analysis_group**: Analysis Task node group. This node group can be selected for analysis clusters and hybrid clusters as required. | + | | | | - **task_node_streaming_group**: streaming Task node group. This node group can be selected for streaming clusters and hybrid clusters as required. | + | | | | - **node_group{x}**: node group of the customized cluster. You can add multiple node groups as required. A maximum of nine node groups can be added. | + +---------------------+-----------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | node_num | Yes | Integer | Number of nodes. The value ranges from 0 to 500. The maximum number of Core and Task nodes is 500. | + +---------------------+-----------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | node_size | Yes | String | Instance specifications of a node. for example, **c6.4xlarge4.linux.mrs** MRS supports host specifications determined by CPU, memory, and disk space. For details about instance specifications, see :ref:`ECS Specifications Used by MRS `. | + +---------------------+-----------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | root_volume | No | Volume | Specifies the system disk information of the node. This parameter is optional for some VMs or the system disk of the BMS. This parameter is mandatory in other cases. For details about the parameter description, see :ref:`Table 7 `. | + +---------------------+-----------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | data_volume | No | Volume | Data disk information. This parameter is mandatory when **data_volume_count** is not 0. For details about this parameter, see Table 4-7. | + +---------------------+-----------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | data_volume_count | No | Integer | Number of data disks of a node. | + | | | | | + | | | | Value range: 0 to 10 | + +---------------------+-----------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | charge_info | No | ChargeInfo | Billing type of the node group. The billing types of Master and Core node groups are the same as those of the cluster. The billing type of the Task node group can be different from that of the cluster. | + +---------------------+-----------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | auto_scaling_policy | No | AutoScalingPolicy | Autoscaling rule corresponding to the node group. For details about the parameters, see :ref:`Table 10 `. | + +---------------------+-----------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | assigned_roles | No | Array of String | When the cluster type is **CUSTOM**, this parameter is mandatory. You can specify the roles deployed in the node group. This parameter is a string array. Each string represents a role expression. | + | | | | | + | | | | Role expression definition: | + | | | | | + | | | | - If the role is deployed on all nodes in the node group, set this parameter to **, for example, **DataNode**. | + | | | | - If the role is deployed on a specified subscript node in the node group: *:,..., *, for example, **NameNode:1,2**. The subscript starts from 1. | + | | | | - Some roles support multi-instance deployment (that is, multiple instances of the same role are deployed on a node): *[*], for example, **EsNode[9]**. | + | | | | | + | | | | For details about available roles, see :ref:`Roles and components supported by MRS11 `. | + +---------------------+-----------------+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0101__table1164193817438: + +.. table:: **Table 6** ChargeInfo structure description + + +-----------------+-----------------+-----------------+-------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================+ + | charge_mode | Yes | String | Billing mode | + | | | | | + | | | | The value of this parameter can be: | + | | | | | + | | | | - **postPaid** | + +-----------------+-----------------+-----------------+-------------------------------------+ + +.. _mrs_02_0101__table5775844185911: + +.. table:: **Table 7** Volume field data structure description + + +-----------------+-----------------+-----------------+------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+==============================================================================+ + | type | Yes | String | Disk Type | + | | | | | + | | | | The following disk types are supported: | + | | | | | + | | | | - **SATA**: common I/O disk | + | | | | - **SAS**: high I/O disk | + | | | | - **SSD**: ultra-high I/O disk | + +-----------------+-----------------+-----------------+------------------------------------------------------------------------------+ + | size | Yes | Integer | Specifies the data disk size, in GB. The value range is **10** to **32768**. | + +-----------------+-----------------+-----------------+------------------------------------------------------------------------------+ + +.. _mrs_02_0101__table1258382865010: + +.. table:: **Table 8** BootstrapScript structure description + + +------------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +========================+=================+=================+==========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================+ + | name | Yes | String | Name of a bootstrap action script. It must be unique in a cluster. | + | | | | | + | | | | The value can contain only digits, letters, spaces, hyphens (-), and underscores (_) and must not start with a space. | + | | | | | + | | | | The value can contain 1 to 64 characters. | + +------------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | uri | Yes | String | Path of a bootstrap action script. Set this parameter to an OBS bucket path or a local VM path. | + | | | | | + | | | | - OBS bucket path: Enter a script path manually. For example, enter the path of the public sample script provided by MRS. Example: **s3a://bootstrap/presto/presto-install.sh**. If **dualroles** is installed, the parameter of the **presto-install.sh** script is **dualroles**. If **worker** is installed, the parameter of the **presto-install.sh** script is **worker**. Based on the Presto usage habit, you are advised to install **dualroles** on the active Master nodes and **worker** on the Core nodes. | + | | | | - Local VM path: Enter a script path. The script path must start with a slash (/) and end with **.sh**. | + +------------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | parameters | No | String | Bootstrap action script parameters. | + +------------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | nodes | Yes | Array String | Type of a node where the bootstrap action script is executed. The value can be **Master**, **Core**, or **Task**. | + +------------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | active_master | No | Boolean | Whether the bootstrap action script runs only on active Master nodes. | + | | | | | + | | | | The default value is **false**, indicating that the bootstrap action script can run on all Master nodes. | + +------------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | before_component_start | No | Boolean | Time when the bootstrap action script is executed. Currently, the following two options are available: **Before component start** and **After component start** | + | | | | | + | | | | The default value is **false**, indicating that the bootstrap action script is executed after the component is started. | + +------------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | fail_action | Yes | String | Whether to continue executing subsequent scripts and creating a cluster after the bootstrap action script fails to be executed. | + | | | | | + | | | | - **continue**: Continue to execute subsequent scripts. | + | | | | - **errorout**: Stop the action. | + | | | | | + | | | | The default value is **errorout**, indicating that the action is stopped. | + | | | | | + | | | | .. note:: | + | | | | | + | | | | You are advised to set this parameter to **continue** in the commissioning phase so that the cluster can continue to be installed and started no matter whether the bootstrap action is successful. | + +------------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0101__t8ded0b3ae11742cea98a467ce26fd093: + +.. table:: **Table 9** Parameters in AddJobReq + + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=============================+=================+=================+===========================================================================================================================================================+ + | job_type | Yes | Integer | Job type code | + | | | | | + | | | | - 1: MapReduce | + | | | | - 2: Spark | + | | | | - 3: Hive Script | + | | | | - 4: HiveQL (not supported currently) | + | | | | - 5: DistCp, importing and exporting data (not supported currently) | + | | | | - 6: Spark Script | + | | | | - 7: Spark SQL, submitting Spark SQL statements (not supported currently). | + | | | | | + | | | | .. note:: | + | | | | | + | | | | Spark and Hive jobs can be added to only clusters that include Spark and Hive components. | + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_name | Yes | String | Job name. It contains 1 to 64 characters. Only letters, digits, hyphens (-), and underscores (_) are allowed. | + | | | | | + | | | | .. note:: | + | | | | | + | | | | Identical job names are allowed but not recommended. | + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | jar_path | No | String | Path of the JAR or SQL file for program execution. The parameter must meet the following requirements: | + | | | | | + | | | | - Contains a maximum of 1,023 characters, excluding special characters such as ``;|&><'$.`` The parameter value cannot be empty or full of spaces. | + | | | | - Files can be stored in HDFS or OBS. The path varies depending on the file system. | + | | | | | + | | | | - OBS: The path must start with **s3a://**. Files or programs encrypted by KMS are not supported. | + | | | | - HDFS: The path starts with a slash (**/**). | + | | | | | + | | | | - Spark Script must end with **.sql** while MapReduce and Spark Jar must end with **.jar**. **sql** and **jar** are case-insensitive. | + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | arguments | No | String | Key parameter for program execution. The parameter is specified by the function of the user's program. MRS is only responsible for loading the parameter. | + | | | | | + | | | | The parameter contains a maximum of 2,047 characters, excluding special characters such as ``;|&>'<$,`` and can be left blank. | + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | input | No | String | Address for inputting data | + | | | | | + | | | | Files can be stored in HDFS or OBS. The path varies depending on the file system. | + | | | | | + | | | | - OBS: The path must start with **s3a://**. Files or programs encrypted by KMS are not supported. | + | | | | - HDFS: The path starts with a slash (**/**). | + | | | | | + | | | | The parameter contains a maximum of 1,023 characters, excluding special characters such as ``;|&>'<$,`` and can be left blank. | + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | output | No | String | Address for outputting data | + | | | | | + | | | | Files can be stored in HDFS or OBS. The path varies depending on the file system. | + | | | | | + | | | | - OBS: The path must start with **s3a://**. | + | | | | - HDFS: The path starts with a slash (**/**). | + | | | | | + | | | | If the specified path does not exist, the system will automatically create it. | + | | | | | + | | | | The parameter contains a maximum of 1,023 characters, excluding special characters such as ``;|&>'<$,`` and can be left blank. | + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_log | No | String | Path for storing job logs that record job running status. | + | | | | | + | | | | Files can be stored in HDFS or OBS. The path varies depending on the file system. | + | | | | | + | | | | - OBS: The path must start with **s3a://**. | + | | | | - HDFS: The path starts with a slash (**/**). | + | | | | | + | | | | The parameter contains a maximum of 1,023 characters, excluding special characters such as ``;|&>'<$,`` and can be left blank. | + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | shutdown_cluster | No | Bool | Whether to delete the cluster after the job execution is complete | + | | | | | + | | | | - **true**: Yes | + | | | | - **false**: No | + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | file_action | No | String | Data import and export | + | | | | | + | | | | - import | + | | | | - export | + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | submit_job_once_cluster_run | Yes | Bool | - **true**: Submit a job during cluster creation. | + | | | | - **false**: Submit a job after the cluster is created. | + | | | | | + | | | | Set this parameter to **true** in this example. | + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | hql | No | String | HiveQL statement | + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | hive_script_path | Yes | String | SQL program path. This parameter is needed by Spark Script and Hive Script jobs only, and must meet the following requirements: | + | | | | | + | | | | - Contains a maximum of 1,023 characters, excluding special characters such as ``;|&><'$.`` The address cannot be empty or full of spaces. | + | | | | - Files can be stored in HDFS or OBS. The path varies depending on the file system. | + | | | | | + | | | | - OBS: The path must start with **s3a://**. Files or programs encrypted by KMS are not supported. | + | | | | - HDFS: The path starts with a slash (**/**). | + | | | | | + | | | | - Ends with **.sql**. **sql** is case-insensitive. | + +-----------------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0101__t6d6054a35d6342dc9dc5b3b8580fec7c: + +.. table:: **Table 10** AutoScalingPolicy structure + + +---------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=====================+=================+=================+============================================================================================================================================================================+ + | auto_scaling_enable | Yes | Boolean | Whether to enable the auto scaling rule. | + +---------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | min_capacity | Yes | Integer | Minimum number of nodes left in the node group. | + | | | | | + | | | | Value range: 0 to 500 | + +---------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | max_capacity | Yes | Integer | Maximum number of nodes in the node group. | + | | | | | + | | | | Value range: 0 to 500 | + +---------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | resources_plans | No | List | Resource plan list. For details, see :ref:`Table 11 `. If this parameter is left blank, the resource plan is disabled. | + | | | | | + | | | | When auto scaling is enabled, either a resource plan or an auto scaling rule must be configured. | + | | | | | + | | | | MRS 1.6.3 or later supports this parameter. | + +---------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | exec_scripts | No | List | List of custom scaling automation scripts. For details, see :ref:`Table 12 `. If this parameter is left blank, a hook script is disabled. | + | | | | | + | | | | MRS 1.7.2 or later supports this parameter. | + +---------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | rules | No | List | List of auto scaling rules. For details, see :ref:`Table 13 `. | + | | | | | + | | | | When auto scaling is enabled, either a resource plan or an auto scaling rule must be configured. | + +---------------------+-----------------+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0101__table10281451162111: + +.. table:: **Table 11** **resources_plan** parameter description + + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+===========================================================================================================================================================================================+ + | period_type | Yes | String | Cycle type of a resource plan. Currently, only the following cycle type is supported: | + | | | | | + | | | | - daily | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | start_time | Yes | String | Start time of a resource plan. The value is in the format of **hour:minute**, indicating that the time ranges from 0:00 to 23:59. | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | end_time | Yes | String | End time of a resource plan. The value is in the same format as that of **start_time**. The interval between **end_time** and **start_time** must be greater than or equal to 30 minutes. | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | min_capacity | Yes | Integer | Minimum number of the preserved nodes in a node group in a resource plan. | + | | | | | + | | | | Value range: 0 to 500 | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | max_capacity | Yes | Integer | Maximum number of the preserved nodes in a node group in a resource plan. | + | | | | | + | | | | Value range: 0 to 500 | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0101__table1921110172216: + +.. table:: **Table 12** **exec_script** parameter description + + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=================================================================================================================================================================================================================================+ + | name | Yes | String | Name of a custom automation script. It must be unique in a same cluster. | + | | | | | + | | | | The value can contain only digits, letters, spaces, hyphens (-), and underscores (_) and must not start with a space. | + | | | | | + | | | | The value can contain 1 to 64 characters. | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | uri | Yes | String | Path of a custom automation script. Set this parameter to an OBS bucket path or a local VM path. | + | | | | | + | | | | - OBS bucket path: Enter a script path manually. for example, **s3a://**\ *XXX*\ **/scale.sh**. | + | | | | - Local VM path: Enter a script path. The script path must start with a slash (/) and end with **.sh**. | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | parameters | No | String | Parameters of a custom automation script. | + | | | | | + | | | | - Multiple parameters are separated by space. | + | | | | - The following predefined system parameters can be transferred: | + | | | | | + | | | | - *${mrs_scale_node_num}*: Number of the nodes to be added or removed | + | | | | - *${mrs_scale_type}*: Scaling type. The value can be **scale_out** or **scale_in**. | + | | | | - *${mrs_scale_node_hostnames}*: Host names of the nodes to be added or removed | + | | | | - *${mrs_scale_node_ips}*: IP addresses of the nodes to be added or removed | + | | | | - *${mrs_scale_rule_name}*: Name of the rule that triggers auto scaling | + | | | | | + | | | | - Other user-defined parameters are used in the same way as those of common shell scripts. Parameters are separated by space. | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | nodes | Yes | List | Type of a node where the custom automation script is executed. The node type can be Master, Core, or Task. | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | active_master | No | Boolean | Whether the custom automation script runs only on the active Master node. | + | | | | | + | | | | The default value is **false**, indicating that the custom automation script can run on all Master nodes. | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | action_stage | Yes | String | Time when a script is executed. | + | | | | | + | | | | The following four options are supported: | + | | | | | + | | | | - **before_scale_out**: before scale-out | + | | | | - **before_scale_in**: before scale-in | + | | | | - **after_scale_out**: after scale-out | + | | | | - **after_scale_in**: after scale-in | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | fail_action | Yes | String | Whether to continue to execute subsequent scripts and create a cluster after the custom automation script fails to be executed. | + | | | | | + | | | | - **continue**: Continue to execute subsequent scripts. | + | | | | - **errorout**: Stop the action. | + | | | | | + | | | | .. note:: | + | | | | | + | | | | - You are advised to set this parameter to **continue** in the commissioning phase so that the cluster can continue to be installed and started no matter whether the custom automation script is executed successfully. | + | | | | - The scale-in operation cannot be undone. Therefore, **fail_action** must be set to **continue** for the scripts that are executed after scale-in. | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0101__t4c9e3e169631470d81d260543affb7e1: + +.. table:: **Table 13** **rules** parameter description + + +--------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +====================+=================+=================+================================================================================================================================+ + | name | Yes | String | Name of an auto scaling rule. | + | | | | | + | | | | A cluster name can contain only 1 to 64 characters. Only letters, digits, hyphens (-), and underscores (_) are allowed. | + | | | | | + | | | | Rule names must be unique in a node group. | + +--------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ + | description | No | String | Description about an auto scaling rule. | + | | | | | + | | | | It contains a maximum of 1,024 characters. | + +--------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ + | adjustment_type | Yes | String | Auto scaling rule adjustment type. The options are as follows: | + | | | | | + | | | | - **scale_out**: cluster scale-out | + | | | | - **scale_in**: cluster scale-in | + +--------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ + | cool_down_minutes | Yes | Integer | Cluster cooling time after an auto scaling rule is triggered, when no auto scaling operation is performed. The unit is minute. | + | | | | | + | | | | Value range: 0 to 10,080. One week is equal to 10,080 minutes. | + +--------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ + | scaling_adjustment | Yes | Integer | Number of nodes that can be adjusted once. | + | | | | | + | | | | Value range: 1 to 100 | + +--------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ + | trigger | Yes | Trigger | Condition for triggering a rule. For details, see :ref:`Table 14 `. | + +--------------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0101__t03bd10dc0ec94a3babc71b2d5d57c3fe: + +.. table:: **Table 14** **trigger** parameter description + + +---------------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=====================+=================+=================+===================================================================================================================================================================================================================+ + | metric_name | Yes | String | Metric name. | + | | | | | + | | | | This triggering condition makes a judgment according to the value of the metric. | + | | | | | + | | | | A metric name contains a maximum of 64 characters. | + | | | | | + | | | | :ref:`Table 15 ` lists the supported metric names. | + +---------------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | metric_value | Yes | String | Metric threshold to trigger a rule | + | | | | | + | | | | The parameter value must be an integer or number with two decimal places only. :ref:`Table 15 ` provides value types and ranges corresponding to **metric_name**. | + +---------------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | comparison_operator | No | String | Metric judgment logic operator. The options are as follows: | + | | | | | + | | | | - **LT**: less than | + | | | | - **GT**: greater than | + | | | | - **LTOE**: less than or equal to | + | | | | - **GTOE**: greater than or equal to | + +---------------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | evaluation_periods | Yes | Integer | Number of consecutive five-minute periods, during which a metric threshold is reached | + | | | | | + | | | | Value range: 1 to 288 | + +---------------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0101__t27de3279a99a48968dacb015c498d9cb: + +.. table:: **Table 15** Auto scaling metrics + + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | Cluster Type | Metric | Value Type | Description | + +===================+==========================================+=================+==============================================================================================================+ + | Streaming cluster | StormSlotAvailable | Integer | Number of available Storm slots. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | StormSlotAvailablePercentage | Percentage | Percentage of available Storm slots, that is, the proportion of the available slots to total slots. | + | | | | | + | | | | Value range: 0 to 100. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | StormSlotUsed | Integer | Number of the used Storm slots. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | StormSlotUsedPercentage | Percentage | Percentage of the used Storm slots, that is, the proportion of the used slots to total slots. | + | | | | | + | | | | Value range: 0 to 100. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | StormSupervisorMemAverageUsage | Integer | Average memory usage of the Supervisor process of Storm. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | StormSupervisorMemAverageUsagePercentage | Percentage | Average percentage of the used memory of the Supervisor process of Storm to the total memory of the system. | + | | | | | + | | | | Value range: 0 to 100. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | StormSupervisorCPUAverageUsagePercentage | Percentage | Average percentage of the used CPUs of the Supervisor process of Storm to the total CPUs. | + | | | | | + | | | | Value range: 0 to 6000. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | Analysis cluster | YARNAppPending | Integer | Number of pending tasks on Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNAppPendingRatio | Ratio | Ratio of pending tasks on Yarn, that is, the ratio of pending tasks to running tasks on Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNAppRunning | Integer | Number of running tasks on Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNContainerAllocated | Integer | Number of containers allocated to Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNContainerPending | Integer | Number of pending containers on Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNContainerPendingRatio | Ratio | Ratio of pending containers on Yarn, that is, the ratio of pending containers to running containers on Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNCPUAllocated | Integer | Number of virtual CPUs (vCPUs) allocated to Yarn | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNCPUAvailable | Integer | Number of available vCPUs on Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNCPUAvailablePercentage | Percentage | Percentage of available vCPUs on Yarn, that is, the proportion of available vCPUs to total vCPUs. | + | | | | | + | | | | Value range: 0 to 100. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNCPUPending | Integer | Number of pending vCPUs on Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNMemoryAllocated | Integer | Memory allocated to Yarn. The unit is MB. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNMemoryAvailable | Integer | Available memory on Yarn. The unit is MB. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNMemoryAvailablePercentage | Percentage | Percentage of available memory on Yarn, that is, the proportion of available memory to total memory on Yarn. | + | | | | | + | | | | Value range: 0 to 100. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + | | YARNMemoryPending | Integer | Pending memory on Yarn. | + | | | | | + | | | | Value range: 0 to 2147483646. | + +-------------------+------------------------------------------+-----------------+--------------------------------------------------------------------------------------------------------------+ + +.. note:: + + When the value type is percentage or ratio in :ref:`Table 15 `, the valid value can be accurate to percentile. The percentage metric value is a decimal value with a percent sign (%) removed. For example, 16.80 represents 16.80%. + +Response message. +----------------- + +.. table:: **Table 16** Response parameters + + +------------+--------+---------------------------------------------------------------------------+ + | Parameter | Type | Description | + +============+========+===========================================================================+ + | cluster_id | String | Cluster ID, which is returned by the system after the cluster is created. | + +------------+--------+---------------------------------------------------------------------------+ + +Examples +-------- + +- Request example + + - Creating an Analysis Cluster + + .. code-block:: + + { + "cluster_version": "MRS 3.X.X", + "cluster_name": "mrs_DyJA_dm", + "cluster_type": "ANALYSIS", + "charge_info": { + "charge_mode": "postPaid" + }, + "region": "", + "availability_zone": "", + "vpc_name": "vpc-37cd", + "subnet_name": "subnet-ed99", + "components": "Hadoop,Spark2x,HBase,Hive,Hue,Loader,Flink,Oozie,Ranger,Tez", + "safe_mode": "KERBEROS", + "manager_admin_password": "Mrs@1234", + "login_mode": "PASSWORD", + "node_root_password": "Mrs@1234", + "log_collection": 1, + "mrs_ecs_default_agency": "MRS_ECS_DEFAULT_AGENCY", + "tags": [ + { + "key": "tag1", + "value": "111" + }, + { + "key": "tag2", + "value": "222" + } + ], + "node_groups": [ + { + "group_name": "master_node_default_group", + "node_num": 2, + "node_size": "rc3.4xlarge.4.linux.bigdata", + "root_volume": { + "type": "SAS", + "size": 100 + }, + "data_volume": { + "type": "SAS", + "size": 600 + }, + "data_volume_count": 1 + }, + { + "group_name": "core_node_analysis_group", + "node_num": 3, + "node_size": "rc3.4xlarge.4.linux.bigdata", + "root_volume": { + "type": "SAS", + "size": 100 + }, + "data_volume": { + "type": "SAS", + "size": 600 + }, + "data_volume_count": 1 + }, + { + "group_name": "task_node_analysis_group", + "node_num": 3, + "node_size": "rc3.4xlarge.4.linux.bigdata", + "root_volume": { + "type": "SAS", + "size": 100 + }, + "data_volume": { + "type": "SAS", + "size": 600 + }, + "data_volume_count": 1, + "auto_scaling_policy": { + "auto_scaling_enable": true, + "min_capacity": 0, + "max_capacity": 1, + "resources_plans": [], + "exec_scripts": [], + "rules": [ + { + "name": "default-expand-1", + "description": "", + "adjustment_type": "scale_out", + "cool_down_minutes": 5, + "scaling_adjustment": "1", + "trigger": { + "metric_id": 2003, + "metric_name": "StormSlotAvailablePercentage", + "metric_value": 100, + "comparison_operator_id": 2003, + "comparison_operator": "LTOE", + "evaluation_periods": "1" + } + } + ] + } + } + ] + } + + - Creating a Streaming Cluster + + .. code-block:: + + { + "cluster_version": "MRS 3.X.X", + "cluster_name": "mrs_Dokle_dm", + "cluster_type": "STREAMING", + "charge_info": { + "charge_mode": "postPaid" + }, + "region": "", + "availability_zone": "", + "vpc_name": "vpc-37cd", + "subnet_name": "subnet-ed99", + "components": "Storm,Kafka,Flume,Ranger", + "safe_mode": "KERBEROS", + "manager_admin_password": "Mrs@1234", + "login_mode": "PASSWORD", + "node_root_password": "Mrs@1234", + "log_collection": 1, + "mrs_ecs_default_agency": "MRS_ECS_DEFAULT_AGENCY", + "tags": [ + { + "key": "tag1", + "value": "111" + }, + { + "key": "tag2", + "value": "222" + } + ], + "node_groups": [ + { + "group_name": "master_node_default_group", + "node_num": 2, + "node_size": "rc3.4xlarge.4.linux.bigdata", + "root_volume": { + "type": "SAS", + "size": 100 + }, + "data_volume": { + "type": "SAS", + "size": 300 + }, + "data_volume_count": 1 + }, + { + "group_name": "core_node_streaming_group", + "node_num": 3, + "node_size": "rc3.4xlarge.4.linux.bigdata", + "root_volume": { + "type": "SAS", + "size": 100 + }, + "data_volume": { + "type": "SAS", + "size": 300 + }, + "data_volume_count": 1, + }, + { + "group_name": "task_node_streaming_group", + "node_num": 0, + "node_size": "rc3.4xlarge.4.linux.bigdata", + "root_volume": { + "type": "SAS", + "size": 100 + }, + "data_volume": { + "type": "SAS", + "size": 300 + }, + "data_volume_count": 1, + "auto_scaling_policy": { + "auto_scaling_enable": true, + "min_capacity": 0, + "max_capacity": 1, + "resources_plans": [], + "exec_scripts": [], + "rules": [ + { + "name": "default-expand-1", + "description": "", + "adjustment_type": "scale_out", + "cool_down_minutes": 5, + "scaling_adjustment": "1", + "trigger": { + "metric_id": 2003, + "metric_name": "StormSlotAvailablePercentage", + "metric_value": 100, + "comparison_operator_id": 2003, + "comparison_operator": "LTOE", + "evaluation_periods": "1" + } + } + ] + } + } + ] + } + + - Creating a Hybrid Cluster + + .. code-block:: + + { + "cluster_version": "MRS 3.X.X", + "cluster_name": "mrs_onmm_dm", + "cluster_type": "MIXED", + "charge_info": { + "charge_mode": "postPaid" + }, + "region": "", + "availability_zone": "", + "vpc_name": "vpc-37cd", + "subnet_name": "subnet-ed99", + "components": "Hadoop,Spark2x,HBase,Hive,Hue,Loader,Kafka,Storm,Flume,Flink,Oozie,Ranger,Tez", + "safe_mode": "KERBEROS", + "manager_admin_password": "Mrs@1234", + "login_mode": "PASSWORD", + "node_root_password": "Mrs@1234", + "log_collection": 1, + "mrs_ecs_default_agency": "MRS_ECS_DEFAULT_AGENCY", + "tags": [ + { + "key": "tag1", + "value": "111" + }, + { + "key": "tag2", + "value": "222" + } + ], + "node_groups": [ + { + "group_name": "master_node_default_group", + "node_num": 2, + "node_size": "Sit3.4xlarge.4.linux.bigdata", + "root_volume": { + "type": "SAS", + "size": 100 + }, + "data_volume": { + "type": "SAS", + "size": 300 + }, + "data_volume_count": 1 + }, + { + "group_name": "core_node_streaming_group", + "node_num": 3, + "node_size": "Sit3.4xlarge.4.linux.bigdata", + "root_volume": { + "type": "SAS", + "size": 100 + }, + "data_volume": { + "type": "SAS", + "size": 300 + }, + "data_volume_count": 1 + }, + { + "group_name": "core_node_analysis_group", + "node_num": 3, + "node_size": "Sit3.4xlarge.4.linux.bigdata", + "root_volume": { + "type": "SAS", + "size": 100 + }, + "data_volume": { + "type": "SAS", + "size": 300 + }, + "data_volume_count": 1, + }, + { + "group_name": "task_node_analysis_group", + "node_num": 1, + "node_size": "Sit3.4xlarge.4.linux.bigdata", + "root_volume": { + "type": "SAS", + "size": 100 + }, + "data_volume": { + "type": "SAS", + "size": 300 + }, + "data_volume_count": 1 + }, + { + "group_name": "task_node_streaming_group", + "node_num": 0, + "node_size": "Sit3.4xlarge.4.linux.bigdata", + "root_volume": { + "type": "SAS", + "size": 100 + }, + "data_volume": { + "type": "SAS", + "size": 300 + }, + "data_volume_count": 1 + } + ] + } + + - Creating a Customized Cluster with Co-deployed Management and Control Nodes + + .. code-block:: + + { + "cluster_version": "MRS 3.X.X", + "cluster_name": "mrs_heshe_dm", + "cluster_type": "CUSTOM", + "charge_info": { + "charge_mode": "postPaid" + }, + "region": "", + "availability_zone": "", + "vpc_name": "vpc-37cd", + "subnet_name": "subnet-ed99", + "components": "Hadoop,Spark2x,HBase,Hive,Hue,Loader,Kafka,Storm,Flume,Flink,Oozie,Ranger,Tez", + "safe_mode": "KERBEROS", + "manager_admin_password": "Mrs@1234", + "login_mode": "PASSWORD", + "node_root_password": "Mrs@1234", + "mrs_ecs_default_agency": "MRS_ECS_DEFAULT_AGENCY", + "template_id": "mgmt_control_combined_v2", + "log_collection": 1, + "tags": [ + { + "key": "tag1", + "value": "111" + }, + { + "key": "tag2", + "value": "222" + } + ], + "node_groups": [ + { + "group_name": "master_node_default_group", + "node_num": 3, + "node_size": "Sit3.4xlarge.4.linux.bigdata", + "root_volume": { + "type": "SAS", + "size": 100 + }, + "data_volume": { + "type": "SAS", + "size": 300 + }, + "data_volume_count": 1, + "assigned_roles": [ + "OMSServer:1,2", + "SlapdServer:1,2", + "KerberosServer:1,2", + "KerberosAdmin:1,2", + "quorumpeer:1,2,3", + "NameNode:2,3", + "Zkfc:2,3", + "JournalNode:1,2,3", + "ResourceManager:2,3", + "JobHistoryServer:2,3", + "DBServer:1,3", + "Hue:1,3", + "LoaderServer:1,3", + "MetaStore:1,2,3", + "WebHCat:1,2,3", + "HiveServer:1,2,3", + "HMaster:2,3", + "MonitorServer:1,2", + "Nimbus:1,2", + "UI:1,2", + "JDBCServer2x:1,2,3", + "JobHistory2x:2,3", + "SparkResource2x:1,2,3", + "oozie:2,3", + "LoadBalancer:2,3", + "TezUI:1,3", + "TimelineServer:3", + "RangerAdmin:1,2", + "UserSync:2", + "TagSync:2", + "KerberosClient", + "SlapdClient", + "meta", + "HSConsole:2,3", + "FlinkResource:1,2,3", + "DataNode:1,2,3", + "NodeManager:1,2,3", + "IndexServer2x:1,2", + "ThriftServer:1,2,3", + "RegionServer:1,2,3", + "ThriftServer1:1,2,3", + "RESTServer:1,2,3", + "Broker:1,2,3", + "Supervisor:1,2,3", + "Logviewer:1,2,3", + "Flume:1,2,3", + "HSBroker:1,2,3" + ] + }, + { + "group_name": "node_group_1", + "node_num": 3, + "node_size": "Sit3.4xlarge.4.linux.bigdata", + "root_volume": { + "type": "SAS", + "size": 100 + }, + "data_volume": { + "type": "SAS", + "size": 300 + }, + "data_volume_count": 1, + "assigned_roles": [ + "DataNode", + "NodeManager", + "RegionServer", + "Flume:1", + "Broker", + "Supervisor", + "Logviewer", + "HBaseIndexer", + "KerberosClient", + "SlapdClient", + "meta", + "HSBroker:1,2", + "ThriftServer", + "ThriftServer1", + "RESTServer", + "FlinkResource"] + }, + { + "group_name": "node_group_2", + "node_num": 1, + "node_size": "Sit3.4xlarge.4.linux.bigdata", + "root_volume": { + "type": "SAS", + "size": 100 + }, + "data_volume": { + "type": "SAS", + "size": 300 + }, + "data_volume_count": 1, + "assigned_roles": [ + "NodeManager", + "KerberosClient", + "SlapdClient", + "meta", + "FlinkResource"] + } + ] + } + + - Creating a Cluster with Customized Management and Control Planes Deployed Separately + + .. code-block:: + + { + "cluster_version": "MRS 3.X.X", + "cluster_name": "mrs_jdRU_dm01", + "cluster_type": "CUSTOM", + "charge_info": { + "charge_mode": "postPaid" + }, + "region": "", + "availability_zone": "", + "vpc_name": "vpc-37cd", + "subnet_name": "subnet-ed99", + "components": "Hadoop,Spark2x,HBase,Hive,Hue,Loader,Kafka,Storm,Flume,Flink,Oozie,Ranger,Tez", + "safe_mode": "KERBEROS", + "manager_admin_password": "Mrs@1234", + "login_mode": "PASSWORD", + "node_root_password": "Mrs@1234", + "mrs_ecs_default_agency": "MRS_ECS_DEFAULT_AGENCY", + "log_collection": 1, + "template_id": "mgmt_control_separated_v2", + "tags": [ + { + "key": "aaa", + "value": "111" + }, + { + "key": "bbb", + "value": "222" + } + ], + "node_groups": [ + { + "group_name": "master_node_default_group", + "node_num": 5, + "node_size": "rc3.4xlarge.4.linux.bigdata", + "root_volume": { + "type": "SAS", + "size": 100 + }, + "data_volume": { + "type": "SAS", + "size": 300 + }, + "data_volume_count": 1, + "assigned_roles": [ + "OMSServer:1,2", + "SlapdServer:3,4", + "KerberosServer:3,4", + "KerberosAdmin:3,4", + "quorumpeer:3,4,5", + "NameNode:4,5", + "Zkfc:4,5", + "JournalNode:1,2,3,4,5", + "ResourceManager:4,5", + "JobHistoryServer:4,5", + "DBServer:3,5", + "Hue:1,2", + "LoaderServer:1,2", + "MetaStore:1,2,3,4,5", + "WebHCat:1,2,3,4,5", + "HiveServer:1,2,3,4,5", + "HMaster:4,5", + "MonitorServer:1,2", + "Nimbus:1,2", + "UI:1,2", + "JDBCServer2x:1,2,3,4,5", + "JobHistory2x:4,5", + "SparkResource2x:1,2,3,4,5", + "oozie:1,2", + "LoadBalancer:1,2", + "TezUI:1,2", + "TimelineServer:5", + "RangerAdmin:1,2", + "KerberosClient", + "SlapdClient", + "meta", + "HSConsole:1,2", + "FlinkResource:1,2,3,4,5", + "DataNode:1,2,3,4,5", + "NodeManager:1,2,3,4,5", + "IndexServer2x:1,2", + "ThriftServer:1,2,3,4,5", + "RegionServer:1,2,3,4,5", + "ThriftServer1:1,2,3,4,5", + "RESTServer:1,2,3,4,5", + "Broker:1,2,3,4,5", + "Supervisor:1,2,3,4,5", + "Logviewer:1,2,3,4,5", + "Flume:1,2,3,4,5", + "HBaseIndexer:1,2,3,4,5", + "TagSync:1", + "UserSync:1"] + }, + { + "group_name": "node_group_1", + "node_num": 3, + "node_size": "rc3.4xlarge.4.linux.bigdata", + "root_volume": { + "type": "SAS", + "size": 100 + }, + "data_volume": { + "type": "SAS", + "size": 300 + }, + "data_volume_count": 1, + "assigned_roles": [ + "DataNode", + "NodeManager", + "RegionServer", + "Flume:1", + "Broker", + "Supervisor", + "Logviewer", + "HBaseIndexer", + "KerberosClient", + "SlapdClient", + "meta", + "HSBroker:1,2", + "ThriftServer", + "ThriftServer1", + "RESTServer", + "FlinkResource"] + } + ] + } + + - Creating a User-Defined Data Cluster + + .. code-block:: + + { + "cluster_version": "MRS 3.X.X", + "cluster_name": "mrs_jdRU_dm02", + "cluster_type": "CUSTOM", + "charge_info": { + "charge_mode": "postPaid" + }, + "region": "", + "availability_zone": "", + "vpc_name": "vpc-37cd", + "subnet_name": "subnet-ed99", + "components": "Hadoop,Spark2x,HBase,Hive,Hue,Loader,Kafka,Storm,Flume,Flink,Oozie,Ranger,Tez", + "safe_mode": "KERBEROS", + "manager_admin_password": "Mrs@1234", + "login_mode": "PASSWORD", + "node_root_password": "Mrs@1234", + "mrs_ecs_default_agency": "MRS_ECS_DEFAULT_AGENCY", + "template_id": "mgmt_control_data_separated_v2", + "log_collection": 1, + "tags": [ + { + "key": "aaa", + "value": "111" + }, + { + "key": "bbb", + "value": "222" + } + ], + "node_groups": [ + { + "group_name": "master_node_default_group", + "node_num": 9, + "node_size": "rc3.4xlarge.4.linux.bigdata", + "root_volume": { + "type": "SAS", + "size": 100 + }, + "data_volume": { + "type": "SAS", + "size": 600 + }, + "data_volume_count": 1, + "assigned_roles": [ + "OMSServer:1,2", + "SlapdServer:5,6", + "KerberosServer:5,6", + "KerberosAdmin:5,6", + "quorumpeer:5,6,7,8,9", + "NameNode:3,4", + "Zkfc:3,4", + "JournalNode:5,6,7", + "ResourceManager:8,9", + "JobHistoryServer:8", + "DBServer:8,9", + "Hue:8,9", + "FlinkResource:3,4", + "LoaderServer:3,5", + "MetaStore:8,9", + "WebHCat:5", + "HiveServer:8,9", + "HMaster:8,9", + "FTP-Server:3,4", + "MonitorServer:3,4", + "Nimbus:8,9", + "UI:8,9", + "JDBCServer2x:8,9", + "JobHistory2x:8,9", + "SparkResource2x:5,6,7", + "oozie:4,5", + "EsMaster:7,8,9", + "LoadBalancer:8,9", + "TezUI:5,6", + "TimelineServer:5", + "RangerAdmin:4,5", + "UserSync:5", + "TagSync:5", + "KerberosClient", + "SlapdClient", + "meta", + "HSBroker:5", + "HSConsole:3,4", + "FlinkResource:3,4"] + }, + { + "group_name": "node_group_1", + "node_num": 3, + "node_size": "rc3.4xlarge.4.linux.bigdata", + "root_volume": { + "type": "SAS", + "size": 100 + }, + "data_volume": { + "type": "SAS", + "size": 600 + }, + "data_volume_count": 1, + "assigned_roles": [ + "DataNode", + "NodeManager", + "RegionServer", + "Flume:1", + "GraphServer", + "KerberosClient", + "SlapdClient", + "meta", + "HSBroker:1,2" + ] + }, + { + "group_name": "node_group_2", + "node_num": 3, + "node_size": "rc3.4xlarge.4.linux.bigdata", + "root_volume": { + "type": "SAS", + "size": 100 + }, + "data_volume": { + "type": "SAS", + "size": 600 + }, + "data_volume_count": 1, + "assigned_roles": [ + "HBaseIndexer", + "SolrServer[3]", + "EsNode[2]", + "KerberosClient", + "SlapdClient", + "meta", + "SolrServerAdmin:1,2"] + }, + { + "group_name": "node_group_3", + "node_num": 3, + "node_size": "rc3.4xlarge.4.linux.bigdata", + "root_volume": { + "type": "SAS", + "size": 100 + }, + "data_volume": { + "type": "SAS", + "size": 600 + }, + "data_volume_count": 1, + "assigned_roles": [ + "Redis[2]", + "KerberosClient", + "SlapdClient", + "meta"] + }, + { + "group_name": "node_group_4", + "node_num": 3, + "node_size": "rc3.4xlarge.4.linux.bigdata", + "root_volume": { + "type": "SAS", + "size": 100 + }, + "data_volume": { + "type": "SAS", + "size": 600 + }, + "data_volume_count": 1, + "assigned_roles": [ + "Broker", + "Supervisor", + "Logviewer", + "KerberosClient", + "SlapdClient", + "meta"] + } + ] + } + +- Example response + + - Example of a normal response + + .. code-block:: + + { + "cluster_id": "da1592c2-bb7e-468d-9ac9-83246e95447a" + } + + - Failed sample response + + .. code-block:: + + { + "error_code": "MRS.0002", + "error_msg": "The parameter is invalid." + } + +Status Code +----------- + +:ref:`Table 17 ` describes the status code of this API. + +.. _mrs_02_0101__table1584477916050: + +.. table:: **Table 17** Status Code + + =========== ================================== + Status Code Description + =========== ================================== + 200 A cluster is created successfully. + =========== ================================== + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/cluster_management_apis_v2/index.rst b/api-ref/source/apis/cluster_management_apis_v2/index.rst new file mode 100644 index 0000000..cde11b9 --- /dev/null +++ b/api-ref/source/apis/cluster_management_apis_v2/index.rst @@ -0,0 +1,14 @@ +:original_name: mrs_02_0100.html + +.. _mrs_02_0100: + +Cluster management APIs (V2) +============================ + +- :ref:`Creating Clusters ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + creating_clusters diff --git a/api-ref/source/apis/data_source_apis/creating_a_data_source.rst b/api-ref/source/apis/data_source_apis/creating_a_data_source.rst new file mode 100644 index 0000000..21826b1 --- /dev/null +++ b/api-ref/source/apis/data_source_apis/creating_a_data_source.rst @@ -0,0 +1,155 @@ +:original_name: mrs_02_0022.html + +.. _mrs_02_0022: + +Creating a Data Source +====================== + +Function +-------- + +This API is used to create a data source. This API is compatible with Sahara. + +URI +--- + +- Format + + POST /v1.1/{project_id}/data-sources + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +.. table:: **Table 2** Request parameter description + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | name | Yes | String | Data source name | + | | | | | + | | | | Contains 1 to 80 characters and consists of letters, digits, hyphens (-), and underscores (_) only. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | url | Yes | String | Data source URL | + | | | | | + | | | | Contains 1 to 255 characters. | + | | | | | + | | | | - If the data source type is HDFS, the value is **/**\ *Save path of the data source*. | + | | | | - If the data source type is OBS, the value is **s3a://**\ *Save path of the data source*. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | credentials | No | Object | Authentication information. The current version does not support this function. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | is_protected | No | Bool | Whether the data source is protected | + | | | | | + | | | | - true | + | | | | - false | + | | | | | + | | | | The current version does not support this function. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | is_public | No | Bool | Whether the data source is public | + | | | | | + | | | | - true | + | | | | - false | + | | | | | + | | | | The current version does not support this function. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | type | Yes | String | Data source type | + | | | | | + | | | | - hdfs | + | | | | - obs | + | | | | - swift (not supported by the current version) | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | description | No | String | Data source description | + | | | | | + | | | | Contains a maximum of 65535 characters. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response +-------- + +.. table:: **Table 3** Response parameter description + + +--------------+--------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +==============+========+===========================================================================================================+ + | description | String | Data source description | + +--------------+--------+-----------------------------------------------------------------------------------------------------------+ + | url | String | Data source URL | + +--------------+--------+-----------------------------------------------------------------------------------------------------------+ + | tenant_id | String | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +--------------+--------+-----------------------------------------------------------------------------------------------------------+ + | created_at | String | Data source creation time | + +--------------+--------+-----------------------------------------------------------------------------------------------------------+ + | updated_at | String | Data source update time If the data source has not been updated, the value of this parameter is **null**. | + +--------------+--------+-----------------------------------------------------------------------------------------------------------+ + | is_protected | Bool | Whether the data source is protected | + +--------------+--------+-----------------------------------------------------------------------------------------------------------+ + | is_public | Bool | Whether the data source is public | + +--------------+--------+-----------------------------------------------------------------------------------------------------------+ + | type | String | Data source type | + +--------------+--------+-----------------------------------------------------------------------------------------------------------+ + | id | String | ID returned by the system after the data source is created | + +--------------+--------+-----------------------------------------------------------------------------------------------------------+ + | name | String | Data source name | + +--------------+--------+-----------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + + .. code-block:: + + { + "name": "my-data-source", + "url": "/simple/mapreduce/input", + "is_protected": false, + "is_public": false, + "type": "hdfs", + "description": "this is the data source template" + } + +- Example response + + .. code-block:: + + { + "data_source": { + "name": "my-data-source", + "type": "hdfs", + "url": "/simple/mapreduce/input", + "description": "this is the data source template", + "created_at": "2017-06-22T08:28:57", + "updated_at": null, + "id": "e275a927-fe72-4b8b-a634-e47a11dca181", + "tenant_id": "5a3314075bfa49b9ae360f4ecd333695", + "is_public": false, + "is_protected": false + } + } + +Status Code +----------- + +:ref:`Table 4 ` describes the status code of this API. + +.. _mrs_02_0022__table1584477916050: + +.. table:: **Table 4** Status code + + =========== ============================================== + Status Code Description + =========== ============================================== + 202 The data source has been successfully created. + =========== ============================================== + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/data_source_apis/deleting_a_data_source.rst b/api-ref/source/apis/data_source_apis/deleting_a_data_source.rst new file mode 100644 index 0000000..7cb5355 --- /dev/null +++ b/api-ref/source/apis/data_source_apis/deleting_a_data_source.rst @@ -0,0 +1,74 @@ +:original_name: mrs_02_0026.html + +.. _mrs_02_0026: + +Deleting a Data Source +====================== + +Function +-------- + +This API is used to delete a data source. This API is compatible with Sahara. + +URI +--- + +- Format + + DELETE /v1.1/{project_id}/data-sources/{data_source_id} + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +----------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +================+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +----------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | data_source_id | Yes | Data source ID | + +----------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +**Request parameters** + +None. + +Response +-------- + +**Response parameters** + +None. + +Example +------- + +- Example request + + .. code-block:: text + + DELETE /v1.1/{project_id}/data-sources/{data_source_id} + +- Example response + + None. + +Status Code +----------- + +:ref:`Table 2 ` describes the status code of this API. + +.. _mrs_02_0026__table1584477916050: + +.. table:: **Table 2** Status code + + =========== ======================================== + Status Code Description + =========== ======================================== + 204 The data source is deleted successfully. + =========== ======================================== + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/data_source_apis/index.rst b/api-ref/source/apis/data_source_apis/index.rst new file mode 100644 index 0000000..ca29e50 --- /dev/null +++ b/api-ref/source/apis/data_source_apis/index.rst @@ -0,0 +1,22 @@ +:original_name: mrs_02_0021.html + +.. _mrs_02_0021: + +Data Source APIs +================ + +- :ref:`Creating a Data Source ` +- :ref:`Updating a Data Source ` +- :ref:`Querying the Data Source List ` +- :ref:`Querying the Data Source Details ` +- :ref:`Deleting a Data Source ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + creating_a_data_source + updating_a_data_source + querying_the_data_source_list + querying_the_data_source_details + deleting_a_data_source diff --git a/api-ref/source/apis/data_source_apis/querying_the_data_source_details.rst b/api-ref/source/apis/data_source_apis/querying_the_data_source_details.rst new file mode 100644 index 0000000..46d3840 --- /dev/null +++ b/api-ref/source/apis/data_source_apis/querying_the_data_source_details.rst @@ -0,0 +1,121 @@ +:original_name: mrs_02_0025.html + +.. _mrs_02_0025: + +Querying the Data Source Details +================================ + +Function +-------- + +This API is used to query detailed information about a data source. This API is compatible with Sahara. + +URI +--- + +- Format + + GET /v1.1/{project_id}/data-sources/{data_source_id} + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +----------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +================+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +----------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | data_source_id | Yes | Data source ID | + +----------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +**Request parameters** + +None. + +Response +-------- + +.. table:: **Table 2** Response parameter description + + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+===========================================================================================================+ + | is_public | Bool | Whether the data source is public | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | tenant_id | String | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_protected | Bool | Whether the data source is protected | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | created_at | String | Data source creation time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | id | String | Data source ID | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | name | String | Data source name | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | updated_at | String | Data source update time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | description | String | Data source description | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | url | String | Data source URL | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | type | String | Data source type | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + + .. code-block:: text + + GET /v1.1/{project_id}/data-sources/{data_source_id} + +- Example response + + .. code-block:: + + { + "data_source": { + "name": "my-data-source-update", + "type": "hdfs", + "url": "/simple/mapreduce/input", + "description": "this is the data source template", + "created_at": "2017-06-22T08:28:57", + "updated_at": "2017-06-22T08:30:08", + "id": "e275a927-fe72-4b8b-a634-e47a11dca181", + "tenant_id": "5a3314075bfa49b9ae360f4ecd333695", + "is_public": false, + "is_protected": false + } + } + +Status Code +----------- + +:ref:`Table 3 ` describes the status code of this API. + +.. _mrs_02_0025__table1584477916050: + +.. table:: **Table 3** Status code + + =========== =================================================== + Status Code Description + =========== =================================================== + 200 Data source details have been queried successfully. + =========== =================================================== + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/data_source_apis/querying_the_data_source_list.rst b/api-ref/source/apis/data_source_apis/querying_the_data_source_list.rst new file mode 100644 index 0000000..97780ef --- /dev/null +++ b/api-ref/source/apis/data_source_apis/querying_the_data_source_list.rst @@ -0,0 +1,175 @@ +:original_name: mrs_02_0024.html + +.. _mrs_02_0024: + +Querying the Data Source List +============================= + +Function +-------- + +This API is used to query the data source list. This API is compatible with Sahara. + +URI +--- + +- Format + + GET /v1.1/{project_id}/data-sources + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +=======================+=======================+============================================================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------+ + | limit | No | Maximum number of objects in response data | + | | | | + | | | Value range: 1 to 1073741822 | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------+ + | marker | No | Data source ID | + | | | | + | | | Query the data source list, and select one data source ID as the marker. The ID is the last element on the list that will not be returned. | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------+ + | sort_by | No | Sort field | + | | | | + | | | A hyphen (-) before the sort field indicates to sort in descending order. Example: | + | | | | + | | | - **sort_by=name** indicates to sort by name in ascending order. | + | | | - **sort_by=-name** indicates to sort by name in descending order. | + +-----------------------+-----------------------+--------------------------------------------------------------------------------------------------------------------------------------------+ + +Request +------- + +**Request parameters** + +None. + +Response +-------- + +.. table:: **Table 2** Response parameter description + + +--------------+--------+---------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +==============+========+=========================================================================================================+ + | markers | Object | Marker object For more parameter description, see :ref:`Table 3 `. | + +--------------+--------+---------------------------------------------------------------------------------------------------------+ + | data_sources | Array | Data source list For more parameter description, see :ref:`Table 4 `. | + +--------------+--------+---------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0024__table35904709104244: + +.. table:: **Table 3** **markers** parameter description + + ========= ====== =========================== + Parameter Type Description + ========= ====== =========================== + prev String Marker on the previous page + next String Marker on the next page + ========= ====== =========================== + +.. _mrs_02_0024__table53055087104252: + +.. table:: **Table 4** **data_sources** parameter description + + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+===========================================================================================================+ + | name | String | Data source name | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | type | String | Data source type | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | url | String | Data source URL | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | description | String | Data source description | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | created_at | String | Data source creation time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | updated_at | String | Data source update time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | id | String | Data source ID | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | tenant_id | String | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_public | Bool | Whether the data source is public | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_protected | Bool | Whether the data source is protected | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + + .. code-block:: text + + GET /v1.1/{project_id}/data-sources?sort_by=name&limit=2&marker=81a2d48b-029a-4160-830b-2d0ac51fa3ba + +- Example response + + .. code-block:: + + { + "markers": { + "prev": "948b92e5-8213-4f5d-975a-435a67c6b93d", + "next": null + }, + "data_sources": [ + { + "name": "my-data-source-update", + "type": "hdfs", + "url": "/simple/mapreduce/input", + "description": "this is the data source template", + "created_at": "2017-06-22T08:28:57", + "updated_at": "2017-06-22T08:30:08", + "id": "e275a927-fe72-4b8b-a634-e47a11dca181", + "tenant_id": "5a3314075bfa49b9ae360f4ecd333695", + "is_public": false, + "is_protected": false + }, + { + "name": "my-datasource", + "type": "hdfs", + "url": "/simple/mapreduce/input", + "description": "this is the data source template", + "created_at": "2017-06-22T08:22:06", + "updated_at": null, + "id": "e68164d5-5897-41a7-a550-5de635fffe20", + "tenant_id": "5a3314075bfa49b9ae360f4ecd333695", + "is_public": false, + "is_protected": false + } + ] + } + +Status Code +----------- + +:ref:`Table 5 ` describes the status code of this API. + +.. _mrs_02_0024__table1584477916050: + +.. table:: **Table 5** Status code + + =========== ============================================= + Status Code Description + =========== ============================================= + 200 The data source list is queried successfully. + =========== ============================================= + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/data_source_apis/updating_a_data_source.rst b/api-ref/source/apis/data_source_apis/updating_a_data_source.rst new file mode 100644 index 0000000..2a76f96 --- /dev/null +++ b/api-ref/source/apis/data_source_apis/updating_a_data_source.rst @@ -0,0 +1,165 @@ +:original_name: mrs_02_0023.html + +.. _mrs_02_0023: + +Updating a Data Source +====================== + +Function +-------- + +This API is used to update a data source. If the data source does not exist, the system reports an error. This API is compatible with Sahara. + +URI +--- + +- Format + + PUT /v1.1/{project_id}/data-sources/{data_source_id} + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +----------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +================+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +----------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | data_source_id | Yes | Data source ID | + +----------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +.. table:: **Table 2** Request parameter description + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | name | No | String | Data source name | + | | | | | + | | | | Contains 1 to 80 characters and consists of letters, digits, hyphens (-), and underscores (_) only. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | type | Yes | String | Data source type | + | | | | | + | | | | - hdfs | + | | | | - obs | + | | | | - swift (not supported by the current version) | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | url | No | String | Data source URL | + | | | | | + | | | | Contains 1 to 255 characters. | + | | | | | + | | | | - If the data source type is HDFS, the value is **/**\ *Save path of the data source*. | + | | | | - If the data source type is OBS, the value is **s3a://**\ *Save path of the data source*. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | description | No | String | Data source description | + | | | | | + | | | | Contains a maximum of 65535 characters. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | is_protected | No | Bool | Whether the data source is protected | + | | | | | + | | | | - true | + | | | | - false | + | | | | | + | | | | The current version does not support this function. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | is_public | No | Bool | Whether the data source is public | + | | | | | + | | | | - true | + | | | | - false | + | | | | | + | | | | The current version does not support this function. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response +-------- + +.. table:: **Table 3** Response parameter description + + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+===========================================================================================================+ + | description | String | Data source description | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | url | String | Data source URL | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | tenant_id | String | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | created_at | String | Data source creation time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | updated_at | String | Data source update time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_protected | Bool | Whether the data source is protected | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_public | Bool | Whether the data source is public | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | type | String | Data source type | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | id | String | Data source ID | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | name | String | Data source name | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + + .. code-block:: + + { + "name": "my-data-source-update", + "url": "/simple/mapreduce/input", + "is_protected": false, + "is_public": false, + "type": "hdfs", + "description": "this is the data source template" + } + +- Example response + + .. code-block:: + + { + "data_source": { + "name": "my-data-source-update", + "type": "hdfs", + "url": "/simple/mapreduce/input", + "description": "this is the data source template", + "created_at": "2017-06-22T08:28:57", + "updated_at": "2017-06-22T08:30:08", + "id": "e275a927-fe72-4b8b-a634-e47a11dca181", + "tenant_id": "5a3314075bfa49b9ae360f4ecd333695", + "is_public": false, + "is_protected": false + } + } + +Status Code +----------- + +:ref:`Table 4 ` describes the status code of this API. + +.. _mrs_02_0023__table1584477916050: + +.. table:: **Table 4** Status code + + =========== ============================================== + Status Code Description + =========== ============================================== + 202 The data source has been successfully updated. + =========== ============================================== + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/index.rst b/api-ref/source/apis/index.rst new file mode 100644 index 0000000..ee5ffb0 --- /dev/null +++ b/api-ref/source/apis/index.rst @@ -0,0 +1,30 @@ +:original_name: mrs_02_0020.html + +.. _mrs_02_0020: + +APIs +==== + +- :ref:`Data Source APIs ` +- :ref:`Cluster management APIs (V2) ` +- :ref:`Cluster management APIs (V1) ` +- :ref:`Job Binary Object APIs ` +- :ref:`Job Object APIs (V1, Not Recommended) ` +- :ref:`Job Execution Object APIs (V1, Not Recommended) ` +- :ref:`Job Object APIs (V2) ` +- :ref:`Auto Scaling APIs ` +- :ref:`Tag Management APIs ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + data_source_apis/index + cluster_management_apis_v2/index + cluster_management_apis_v1/index + job_binary_object_apis/index + job_object_apis_v1,_not_recommended/index + job_execution_object_apis_v1,_not_recommended/index + job_object_apis_v2/index + auto_scaling_apis/index + tag_management_apis/index diff --git a/api-ref/source/apis/job_binary_object_apis/creating_a_job_binary_object.rst b/api-ref/source/apis/job_binary_object_apis/creating_a_job_binary_object.rst new file mode 100644 index 0000000..98b87e6 --- /dev/null +++ b/api-ref/source/apis/job_binary_object_apis/creating_a_job_binary_object.rst @@ -0,0 +1,150 @@ +:original_name: mrs_02_0034.html + +.. _mrs_02_0034: + +Creating a Job Binary Object +============================ + +Function +-------- + +This API is used to create a job binary object. This API is compatible with Sahara. + +URI +--- + +- Format + + POST /v1.1/{project_id}/job-binaries + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +.. table:: **Table 2** Request parameter description + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | name | Yes | String | Binary object name | + | | | | | + | | | | Contains 1 to 80 characters and consists of letters, digits, hyphens (-), and underscores (_) only. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | url | Yes | String | Binary object URL, which contains of 1 to 255 characters. | + | | | | | + | | | | The URL must start with **s3a://** or **/**. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | is_protected | No | Bool | Whether a binary object is protected | + | | | | | + | | | | - true | + | | | | - false | + | | | | | + | | | | The current version does not support this function. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | is_public | No | Bool | Whether a binary object is public | + | | | | | + | | | | - true | + | | | | - false | + | | | | | + | | | | The current version does not support this function. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | description | Yes | String | Binary object description | + | | | | | + | | | | Contains a maximum of 65535 characters. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response +-------- + +.. table:: **Table 3** Response parameter description + + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+===========================================================================================================+ + | description | String | Binary object description | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | url | String | Binary object URL | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | tenant_id | String | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | created_at | String | Binary object creation time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | updated_at | String | Binary object update time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_protected | Bool | Whether a binary object is protected | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_public | Bool | Whether a binary object is public | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | id | String | Binary object ID | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | name | String | Binary object name | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + + .. code-block:: + + { + "name": "my-job-binary", + "url": "/simple/mapreduce/program", + "is_protected": false, + "is_public": false, + "description": "this is the job binary template" + } + +- Example response + + .. code-block:: + + { + "job_binary": { + "name": "my-job-binary", + "url": "/simple/mapreduce/program", + "description": "this is the job binary template", + "created_at": "2017-06-22T09:04:53", + "updated_at": null, + "id": "da37b581-042f-4d7a-9378-f628f32bd9ae", + "tenant_id": "5a3314075bfa49b9ae360f4ecd333695", + "is_public": false, + "is_protected": false + } + } + +Status Code +----------- + +:ref:`Table 4 ` describes the status code of this API. + +.. _mrs_02_0034__table1584477916050: + +.. table:: **Table 4** Status code + + =========== ==================================================== + Status Code Description + =========== ==================================================== + 202 The job binary object has been successfully created. + =========== ==================================================== + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/job_binary_object_apis/deleting_a_job_binary_object.rst b/api-ref/source/apis/job_binary_object_apis/deleting_a_job_binary_object.rst new file mode 100644 index 0000000..6695f09 --- /dev/null +++ b/api-ref/source/apis/job_binary_object_apis/deleting_a_job_binary_object.rst @@ -0,0 +1,72 @@ +:original_name: mrs_02_0038.html + +.. _mrs_02_0038: + +Deleting a Job Binary Object +============================ + +Function +-------- + +This API is used to delete a binary object. This API is compatible with Sahara. + +URI +--- + +- Format + + DELETE /v1.1/{project_id}/job-binaries/{job_binary_id} + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +---------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +===============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +---------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | job_binary_id | Yes | Job binary object ID | + +---------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +**Request parameters** + +None + +Response +-------- + +**Response parameters** + +None + +Example +------- + +- Example request + + None + +- Example response + + None + +Status Code +----------- + +:ref:`Table 2 ` describes the status code of this API. + +.. _mrs_02_0038__table1584477916050: + +.. table:: **Table 2** Status code + + =========== ========================================== + Status code Description + =========== ========================================== + 204 The binary object is deleted successfully. + =========== ========================================== + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/job_binary_object_apis/index.rst b/api-ref/source/apis/job_binary_object_apis/index.rst new file mode 100644 index 0000000..4e5712a --- /dev/null +++ b/api-ref/source/apis/job_binary_object_apis/index.rst @@ -0,0 +1,22 @@ +:original_name: mrs_02_0033.html + +.. _mrs_02_0033: + +Job Binary Object APIs +====================== + +- :ref:`Creating a Job Binary Object ` +- :ref:`Updating a Job Binary Object ` +- :ref:`Querying the Binary Object List ` +- :ref:`Querying the Binary Object Details ` +- :ref:`Deleting a Job Binary Object ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + creating_a_job_binary_object + updating_a_job_binary_object + querying_the_binary_object_list + querying_the_binary_object_details + deleting_a_job_binary_object diff --git a/api-ref/source/apis/job_binary_object_apis/querying_the_binary_object_details.rst b/api-ref/source/apis/job_binary_object_apis/querying_the_binary_object_details.rst new file mode 100644 index 0000000..3d27e7e --- /dev/null +++ b/api-ref/source/apis/job_binary_object_apis/querying_the_binary_object_details.rst @@ -0,0 +1,116 @@ +:original_name: mrs_02_0037.html + +.. _mrs_02_0037: + +Querying the Binary Object Details +================================== + +Function +-------- + +This API is used to query detailed information about a binary object. This API is compatible with Sahara. + +URI +--- + +- Format + + GET /v1.1/{project_id}/job-binaries/{job_binary_id} + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +---------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +===============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +---------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | job_binary_id | Yes | Binary object ID | + +---------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +**Request parameters** + +None + +Response +-------- + +.. table:: **Table 2** Response parameter description + + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+===========================================================================================================+ + | is_public | Bool | Whether a binary object is public | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | description | String | Binary object description | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | url | String | Binary object URL | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | tenant_id | String | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | created_at | String | Binary object creation time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | updated_at | String | Binary object update time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | id | String | Binary object ID | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | name | String | Binary object name | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_protected | Bool | Whether a binary object is protected | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + + None + +- Example response + + .. code-block:: + + { + "job_binary": { + "name": "my-job-binary-update", + "url": "/simple/mapreduce/program", + "description": "this is the job binary template", + "created_at": "2017-06-22T09:04:53", + "updated_at": "2017-06-22T09:06:50", + "id": "da37b581-042f-4d7a-9378-f628f32bd9ae", + "tenant_id": "5a3314075bfa49b9ae360f4ecd333695", + "is_public": false, + "is_protected": false + } + } + +Status Code +----------- + +:ref:`Table 3 ` describes the status code of this API. + +.. _mrs_02_0037__table1584477916050: + +.. table:: **Table 3** Status code + + =========== =================================================== + Status code Description + =========== =================================================== + 200 The binary object details are queried successfully. + =========== =================================================== + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/job_binary_object_apis/querying_the_binary_object_list.rst b/api-ref/source/apis/job_binary_object_apis/querying_the_binary_object_list.rst new file mode 100644 index 0000000..ad02a8f --- /dev/null +++ b/api-ref/source/apis/job_binary_object_apis/querying_the_binary_object_list.rst @@ -0,0 +1,164 @@ +:original_name: mrs_02_0036.html + +.. _mrs_02_0036: + +Querying the Binary Object List +=============================== + +Function +-------- + +This API is used to query the binary object list. This API is compatible with Sahara. + +URI +--- + +- Format + + GET /v1.1/{project_id}/job-binaries + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +-----------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +=======================+=======================+==================================================================================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +-----------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | limit | No | Maximum number of objects in response data | + | | | | + | | | Value range: 1 to 1073741822 | + +-----------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | marker | No | Job binary object ID | + | | | | + | | | Query the job binary object list, and select one job binary object ID as the marker. The ID is the ID of the last element in the list that will not be returned. | + +-----------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | sort_by | No | Sort field | + | | | | + | | | A hyphen (-) before the sort field indicates to sort in descending order. Example: | + | | | | + | | | - **sort_by=name** indicates to sort by name in ascending order. | + | | | - **sort_by=-name** indicates to sort by name in descending order. | + +-----------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Request +------- + +**Request parameters** + +None. + +Response +-------- + +.. table:: **Table 2** Response parameter description + + +-----------------------+-----------------------+---------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+=====================================================================+ + | markers | Object | Markers object | + | | | | + | | | For details, see :ref:`Table 3 `. | + +-----------------------+-----------------------+---------------------------------------------------------------------+ + | binaries | Array | Binary object list | + | | | | + | | | For details, see :ref:`Table 4 `. | + +-----------------------+-----------------------+---------------------------------------------------------------------+ + +.. _mrs_02_0036__table35904709104244: + +.. table:: **Table 3** **markers** parameter description + + ========= ====== =========================== + Parameter Type Description + ========= ====== =========================== + prev String Marker on the previous page + next String Marker on the next page + ========= ====== =========================== + +.. _mrs_02_0036__table5646270112712: + +.. table:: **Table 4** **binaries** parameter description + + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+===========================================================================================================+ + | name | String | Binary object name | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | url | String | Binary object URL | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | description | String | Binary object description | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | created_at | String | Binary object creation time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | updated_at | String | Binary object update time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | id | String | Binary object ID | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | tenant_id | String | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_public | Bool | Whether a binary object is public | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_protected | Bool | Whether a binary object is protected | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + + .. code-block:: text + + GET /v1.1/{project_id}/job-binaries?limit=1&sort_by=name&marker= eadfb8ec-760b-499f-b8df-00a6def854f8 + +- Example response + + .. code-block:: + + { + "markers": { + "prev": "ddf13f9d-93e8-4999-b860-0dc0c01c517d", + "next": null + }, + "binaries": [ + { + "name": "my-job-binary-update", + "url": "/simple/mapreduce/program", + "description": "this is the job binary template", + "created_at": "2017-06-22T09:04:53", + "updated_at": "2017-06-22T09:06:50", + "id": "da37b581-042f-4d7a-9378-f628f32bd9ae", + "tenant_id": "5a3314075bfa49b9ae360f4ecd333695", + "is_public": false, + "is_protected": false + } + ] + } + +Status Code +----------- + +:ref:`Table 5 ` describes the status code of this API. + +.. _mrs_02_0036__table1584477916050: + +.. table:: **Table 5** Status code + + =========== =============================================== + Status Code Description + =========== =============================================== + 200 The binary object list is queried successfully. + =========== =============================================== + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/job_binary_object_apis/updating_a_job_binary_object.rst b/api-ref/source/apis/job_binary_object_apis/updating_a_job_binary_object.rst new file mode 100644 index 0000000..5aaebe7 --- /dev/null +++ b/api-ref/source/apis/job_binary_object_apis/updating_a_job_binary_object.rst @@ -0,0 +1,152 @@ +:original_name: mrs_02_0035.html + +.. _mrs_02_0035: + +Updating a Job Binary Object +============================ + +Function +-------- + +This API is used to update a job binary object. This API is compatible with Sahara. + +URI +--- + +- Format + + PUT /v1.1/{project_id}/job-binaries/{job_binary_id} + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +---------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +===============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +---------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | job_binary_id | Yes | Binary object ID | + +---------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +.. table:: **Table 2** Request parameter description + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | name | No | String | Binary object name | + | | | | | + | | | | Contains 1 to 80 characters and consists of letters, digits, hyphens (-), and underscores (_) only. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | url | No | String | Binary object URL, which contains of 1 to 255 characters. | + | | | | | + | | | | The URL must start with **s3a://** or **/**. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | is_protected | No | Bool | Whether a binary object is protected | + | | | | | + | | | | - true | + | | | | - false | + | | | | | + | | | | The current version does not support this function. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | is_public | No | Bool | Whether a binary object is public | + | | | | | + | | | | - true | + | | | | - false | + | | | | | + | | | | The current version does not support this function. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | description | Yes | String | Binary object description | + | | | | | + | | | | Contains a maximum of 65535 characters. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response +-------- + +.. table:: **Table 3** Response parameter description + + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+===========================================================================================================+ + | description | String | Binary object description | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | url | String | Binary object URL | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | tenant_id | String | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | created_at | String | Binary object creation time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | updated_at | String | Binary object update time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_protected | Bool | Whether a binary object is protected | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_public | Bool | Whether a binary object is public | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | id | String | Binary object ID | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | name | String | Binary object name | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + + .. code-block:: + + { + "name": "my-job-binary-update", + "url": "/simple/mapreduce/program", + "is_protected": false, + "is_public": false, + "description": "this is the job binary template" + } + +- Example response + + .. code-block:: + + { + "job_binary": { + "name": "my-job-binary-update", + "url": "/simple/mapreduce/program", + "description": "this is the job binary template", + "created_at": "2017-06-22T09:04:53", + "updated_at": "2017-06-22T09:06:50", + "id": "da37b581-042f-4d7a-9378-f628f32bd9ae", + "tenant_id": "5a3314075bfa49b9ae360f4ecd333695", + "is_public": false, + "is_protected": false + } + } + +Status Code +----------- + +:ref:`Table 4 ` describes the status code of this API. + +.. _mrs_02_0035__table1584477916050: + +.. table:: **Table 4** Status code + + =========== ================================================ + Status Code Description + =========== ================================================ + 202 The binary object has been updated successfully. + =========== ================================================ + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/job_execution_object_apis_v1,_not_recommended/canceling_job_execution.rst b/api-ref/source/apis/job_execution_object_apis_v1,_not_recommended/canceling_job_execution.rst new file mode 100644 index 0000000..c2fef4f --- /dev/null +++ b/api-ref/source/apis/job_execution_object_apis_v1,_not_recommended/canceling_job_execution.rst @@ -0,0 +1,143 @@ +:original_name: mrs_02_0052.html + +.. _mrs_02_0052: + +Canceling Job Execution +======================= + +Function +-------- + +This API is used to cancel a job object being executed. This API is compatible with Sahara. + +URI +--- + +- Format + + GET /v1.1/{project_id}/job-executions/{job_execution_id}/cancel + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +==================+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | job_execution_id | Yes | Job execution object ID | + +------------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +**Request parameters** + +None. + +Response +-------- + +.. table:: **Table 2** Response parameter description + + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+===========================================================================================================+ + | info | String | Key-value pair set, containing job running information returned by Oozie | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | cluster_id | String | Cluster ID | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | job_id | String | Job ID | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | oozie_job_id | String | Workflow ID returned by Oozie | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | tenant_id | String | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | created_at | String | Job execution object creation time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | updated_at | String | Job execution object update time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | start_time | String | Job start time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | end_time | Bool | Job end time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | return_code | String | Response code after job execution | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | input_id | String | Input data source ID of a job execution object | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | output_id | String | Output data source ID of a job execution object | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_protected | Bool | Whether a job execution object is protected | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_public | Bool | Whether a job execution object is public | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | job_configs | Object | Key-value pair set for saving job running configurations | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | id | String | Job execution object ID | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | oozie_job_id | String | Workflow ID returned by Oozie | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | info | String | Key-value pair set, containing job running information returned by Oozie | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + + None. + +- Example response + + .. code-block:: + + { + "job_execution": { + "created_at": "2017-05-25T07:28:12", + "updated_at": "2017-05-25T07:28:13", + "id": "2de74673-1a78-48af-a95b-e1fec4a4ae9c", + "tenant_id": "37caa80116e1403ab603e5eeb48a2f74", + "job_id": "", + "start_time": "2017-05-25T07:28:12", + "end_time": null, + "cluster_id": "ef7b54f2-3d92-49b2-a6d7-94607e1ea7df", + "oozie_job_id": null, + "return_code": null, + "input_id": null, + "output_id": null, + "is_protected": false, + "is_public": null, + "engine_job_id": null, + "job_configs": null, + "data_source_urls": null, + "info": null + } + } + +Status Code +----------- + +:ref:`Table 3 ` describes the status code of this API. + +.. _mrs_02_0052__table1584477916050: + +.. table:: **Table 3** Status code + + +-------------+---------------------------------------------------------------+ + | Status Code | Description | + +=============+===============================================================+ + | 200 | The job object being executed has been canceled successfully. | + +-------------+---------------------------------------------------------------+ + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/job_execution_object_apis_v1,_not_recommended/deleting_a_job_execution_object.rst b/api-ref/source/apis/job_execution_object_apis_v1,_not_recommended/deleting_a_job_execution_object.rst new file mode 100644 index 0000000..861271c --- /dev/null +++ b/api-ref/source/apis/job_execution_object_apis_v1,_not_recommended/deleting_a_job_execution_object.rst @@ -0,0 +1,72 @@ +:original_name: mrs_02_0053.html + +.. _mrs_02_0053: + +Deleting a Job Execution Object +=============================== + +Function +-------- + +This API is used to delete a job execution object. This API is compatible with Sahara. + +URI +--- + +- Format + + DELETE /v1.1/{project_id}/job-executions/{job_execution_id} + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +==================+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | job_execution_id | Yes | Job ID | + +------------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +**Request parameters** + +None. + +Response +-------- + +**Response parameters** + +None. + +Example +------- + +- Example request + + None. + +- Example response + + None. + +Status Code +----------- + +:ref:`Table 2 ` describes the status code of this API. + +.. _mrs_02_0053__table1584477916050: + +.. table:: **Table 2** Status code + + =========== ================================================= + Status Code Description + =========== ================================================= + 204 The job execution object is deleted successfully. + =========== ================================================= + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/job_execution_object_apis_v1,_not_recommended/index.rst b/api-ref/source/apis/job_execution_object_apis_v1,_not_recommended/index.rst new file mode 100644 index 0000000..807cd1e --- /dev/null +++ b/api-ref/source/apis/job_execution_object_apis_v1,_not_recommended/index.rst @@ -0,0 +1,20 @@ +:original_name: mrs_02_0049.html + +.. _mrs_02_0049: + +Job Execution Object APIs (V1, Not Recommended) +=============================================== + +- :ref:`Querying the Job Execution Object List ` +- :ref:`Querying Job Execution Object Details ` +- :ref:`Canceling Job Execution ` +- :ref:`Deleting a Job Execution Object ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + querying_the_job_execution_object_list + querying_job_execution_object_details + canceling_job_execution + deleting_a_job_execution_object diff --git a/api-ref/source/apis/job_execution_object_apis_v1,_not_recommended/querying_job_execution_object_details.rst b/api-ref/source/apis/job_execution_object_apis_v1,_not_recommended/querying_job_execution_object_details.rst new file mode 100644 index 0000000..b4c91e8 --- /dev/null +++ b/api-ref/source/apis/job_execution_object_apis_v1,_not_recommended/querying_job_execution_object_details.rst @@ -0,0 +1,157 @@ +:original_name: mrs_02_0051.html + +.. _mrs_02_0051: + +Querying Job Execution Object Details +===================================== + +Function +-------- + +This API is used to query detailed information about a job execution object. This API is compatible with Sahara. + +URI +--- + +- Format + + GET /v1.1/{project_id}/job-executions/{job_execution_id} + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +==================+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | job_execution_id | Yes | Job execution object ID | + +------------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +**Request parameters** + +None. + +Response +-------- + +.. table:: **Table 2** Response parameter description + + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+===========================================================================================================+ + | info | String | Key-value pair set, containing job running information returned by Oozie | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | cluster_id | String | Cluster ID | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | job_id | String | Job ID | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | engine_job_id | String | Workflow ID of Oozie | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | oozie_job_id | String | Workflow ID returned by Oozie | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | tenant_id | String | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | created_at | String | Job execution object creation time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | updated_at | String | Job execution object update time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | start_time | String | Job start time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | end_time | String | Job end time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | return_code | String | Response code after job execution | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | input_id | String | Input data source ID of a job execution object | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | output_id | String | Output data source ID of a job execution object | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_protected | Bool | Whether a job execution object is protected | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_public | Bool | Whether a job execution object is public | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | job_configs | Object | Key-value pair set for saving job running configurations | + | | | | + | | | For details, see :ref:`Table 3 `. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | data_source_urls | Object | Data source URL of a job execution object | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | Id | String | Job execution object ID | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0051__table2159451151623: + +.. table:: **Table 3** **job_configs** parameter description + + ========= ====== ======================================= + Parameter Type Description + ========= ====== ======================================= + configs Object Key-value pair set configured for a job + args Array List of arguments + params Object Key-value pair set for running a job + ========= ====== ======================================= + +Example +------- + +- Example request + + None. + +- Example response + + .. code-block:: + + { + "job_execution": { + "created_at": "2017-06-22T06:23:51", + "updated_at": "2017-06-22T06:23:51", + "id": "852042ea-a32c-424b-aacf-df2e6d6642b5", + "tenant_id": "5a3314075bfa49b9ae360f4ecd333695", + "job_id": "", + "start_time": "2017-06-22T06:23:51", + "end_time": null, + "cluster_id": "33dff020-7f96-4270-9c3a-88b99627f6e2", + "oozie_job_id": null, + "return_code": null, + "input_id": null, + "output_id": null, + "is_protected": false, + "is_public": null, + "engine_job_id": null, + "job_configs": null, + "data_source_urls": null, + "info": null + } + } + +Status Code +----------- + +:ref:`Table 4 ` describes the status code of this API. + +.. _mrs_02_0051__table1584477916050: + +.. table:: **Table 4** Status code + + =========== ========================================================== + Status Code Description + =========== ========================================================== + 200 The job execution object details are queried successfully. + =========== ========================================================== + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/job_execution_object_apis_v1,_not_recommended/querying_the_job_execution_object_list.rst b/api-ref/source/apis/job_execution_object_apis_v1,_not_recommended/querying_the_job_execution_object_list.rst new file mode 100644 index 0000000..088d955 --- /dev/null +++ b/api-ref/source/apis/job_execution_object_apis_v1,_not_recommended/querying_the_job_execution_object_list.rst @@ -0,0 +1,223 @@ +:original_name: mrs_02_0050.html + +.. _mrs_02_0050: + +Querying the Job Execution Object List +====================================== + +Function +-------- + +This API is used to query the job execution object list. This API is compatible with Sahara. + +URI +--- + +- Format + + GET /v1.1/{project_id}/job-executions + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +=======================+=======================+==========================================================================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | limit | No | Maximum number of objects in response data | + | | | | + | | | Value range: 1 to 1073741822 | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | marker | No | Job execution ID | + | | | | + | | | Query the job execution list, and select one job execution ID as the marker. The ID is the ID of the last element in the list that will not be returned. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+ + | sort_by | No | Sort field | + | | | | + | | | A hyphen (-) before the sort field indicates to sort in descending order. Example: | + | | | | + | | | - **sort_by=name** indicates to sort by **name** in ascending order. | + | | | - **sort_by=-name** indicates to sort by **name** in descending order. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Request +------- + +**Request parameters** + +None. + +Response +-------- + +.. table:: **Table 2** Response parameter description + + +-----------------------+-----------------------+--------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+====================================================================+ + | markers | Object | Markers object | + | | | | + | | | For details, see :ref:`Table 3 `. | + +-----------------------+-----------------------+--------------------------------------------------------------------+ + | job_executions | Array | Job execution list | + | | | | + | | | For details, see :ref:`Table 4 `. | + +-----------------------+-----------------------+--------------------------------------------------------------------+ + +.. _mrs_02_0050__table2264538214423: + +.. table:: **Table 3** **markers** parameter description + + ========= ====== =========================== + Parameter Type Description + ========= ====== =========================== + prev String Marker on the previous page + next String Marker on the next page + ========= ====== =========================== + +.. _mrs_02_0050__table2078214316114: + +.. table:: **Table 4** **job_executions** parameter description + + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+=================================================================================================================================================+ + | job_configs | Object | Key-value pair set for saving job running configurations For more parameter description, see :ref:`Table 5 `. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ + | is_protected | Bool | Whether a job execution object is protected | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ + | input_id | String | Input data source ID of a job execution object | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_id | String | Job ID | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ + | cluster_id | String | Cluster ID | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ + | created_at | String | Job execution object creation time | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ + | end_time | String | Job end time | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ + | output_id | String | Output data source ID of a job execution object | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ + | is_public | Bool | Whether a job execution object is public | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ + | updated_at | String | Job execution object update time | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ + | return_code | String | Response code after job execution | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ + | data_source_urls | Object | Data source URL of a job execution object | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ + | tenant_id | String | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ + | start_time | String | Job start time | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ + | Id | String | Job execution object ID | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ + | engine_job_id | String | Workflow ID of Oozie | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ + | oozie_job_id | String | Workflow ID returned by Oozie | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ + | info | String | Key-value pair set, containing job running information returned by Oozie | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0050__table30347504144155: + +.. table:: **Table 5** **job_configs** parameter description + + ========= ====== ======================================= + Parameter Type Description + ========= ====== ======================================= + configs Object Key-value pair set configured for a job + args Array List of arguments + params Object Key-value pair set for running a job + ========= ====== ======================================= + +Example +------- + +- Example request + + .. code-block:: text + + GET /v1.1/{project_id}/job-executions?limit=2&sort_by=id&marker=839244be-c471-469b-80c0-6f63e376bcbc + +- Example response + + .. code-block:: + + { + "markers": { + "prev": "821c8924-5249-4dd8-8069-b8d425f3f54a", + "next": null + }, + "job_executions": [ + { + "created_at": "2017-06-22T06:24:57", + "updated_at": "2017-06-22T06:24:59", + "id": "84900772-8807-4ddc-9484-f719fa43711f", + "tenant_id": "5a3314075bfa49b9ae360f4ecd333695", + "job_id": "", + "start_time": "2017-06-22T06:24:49", + "end_time": "2017-06-22T06:25:02", + "cluster_id": "33dff020-7f96-4270-9c3a-88b99627f6e2", + "oozie_job_id": null, + "return_code": null, + "input_id": null, + "output_id": null, + "is_protected": false, + "is_public": null, + "engine_job_id": null, + "job_configs": null, + "data_source_urls": null, + "info": null + }, + { + "created_at": "2017-06-22T06:23:51", + "updated_at": "2017-06-22T06:23:51", + "id": "852042ea-a32c-424b-aacf-df2e6d6642b5", + "tenant_id": "5a3314075bfa49b9ae360f4ecd333695", + "job_id": "", + "start_time": "2017-06-22T06:23:51", + "end_time": null, + "cluster_id": "33dff020-7f96-4270-9c3a-88b99627f6e2", + "oozie_job_id": null, + "return_code": null, + "input_id": null, + "output_id": null, + "is_protected": false, + "is_public": null, + "engine_job_id": null, + "job_configs": null, + "data_source_urls": null, + "info": null + } + ] + } + +Status Code +----------- + +:ref:`Table 6 ` describes the status code of this API. + +.. _mrs_02_0050__table1584477916050: + +.. table:: **Table 6** Status code + + =========== ====================================================== + Status Code Description + =========== ====================================================== + 200 The job execution object list is queried successfully. + =========== ====================================================== + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/job_object_apis_v1,_not_recommended/adding_a_job_and_executing_the_job.rst b/api-ref/source/apis/job_object_apis_v1,_not_recommended/adding_a_job_and_executing_the_job.rst new file mode 100644 index 0000000..58f2ba3 --- /dev/null +++ b/api-ref/source/apis/job_object_apis_v1,_not_recommended/adding_a_job_and_executing_the_job.rst @@ -0,0 +1,480 @@ +:original_name: mrs_02_0040.html + +.. _mrs_02_0040: + +Adding a Job and Executing the Job +================================== + +Function +-------- + +This API is used to add a job to an MRS cluster and execute the job. This API is incompatible with Sahara. + +URI +--- + +- Format + + POST /v1.1/{project_id}/jobs/submit-job + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +.. table:: **Table 2** Request parameter description + + +------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +==================+=================+=================+=============================================================================================================================================================================================================================================================================================================================================================================+ + | job_type | Yes | Integer | Job type code | + | | | | | + | | | | - 1: MapReduce | + | | | | - 2: Spark | + | | | | - 3: Hive Script | + | | | | - 4: HiveQL (not supported currently) | + | | | | - 5: DistCp, importing and exporting data. For details, see :ref:`Table 3 `. | + | | | | - 6: Spark Script | + | | | | - 7: Spark SQL, submitting Spark SQL statements. For details, see :ref:`Table 4 `. (Not supported in this API currently.) | + | | | | | + | | | | .. note:: | + | | | | | + | | | | Spark and Hive jobs can be added to only clusters that include Spark and Hive components. | + +------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_name | Yes | String | Job name | + | | | | | + | | | | Contains only 1 to 64 letters, digits, hyphens (-), and underscores (_). | + | | | | | + | | | | .. note:: | + | | | | | + | | | | Identical job names are allowed but not recommended. | + +------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | cluster_id | Yes | String | Cluster ID | + +------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | jar_path | Yes | String | Path of the JAR or SQL file for program execution | + | | | | | + | | | | The parameter must meet the following requirements: | + | | | | | + | | | | - Contains a maximum of 1,023 characters, excluding special characters such as ``;|&><'$.`` The address cannot be empty or full of spaces. | + | | | | - Starts with **/** or **s3a://**. The OBS path does not support files or programs encrypted by KMS. | + | | | | - Spark Script must end with **.sql** while MapReduce and Spark Jar must end with **.jar**.\ **sql** and **jar** are case-insensitive. | + +------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | arguments | No | String | Key parameter for program execution. The parameter is specified by the function of the user's program. MRS is only responsible for loading the parameter. | + | | | | | + | | | | The parameter contains a maximum of 2,047 characters, excluding special characters such as ``;|&>'<$,`` and can be left blank. | + | | | | | + | | | | .. note:: | + | | | | | + | | | | When entering a parameter containing sensitive information (for example, login password), you can add an at sign (@) before the parameter name to encrypt the parameter value. This prevents the sensitive information from being persisted in plaintext. Therefore, when you view job information on the MRS, sensitive information will be displayed as asterisks (*). | + | | | | | + | | | | For example, username=admin @password=admin_123. | + +------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | input | No | String | Path for inputting data, which must start with **/** or **s3a://**. Set this parameter to a correct OBS path. The OBS path does not support files or programs encrypted by KMS. | + | | | | | + | | | | The parameter contains a maximum of 1,023 characters, excluding special characters such as ``;|&>'<$,`` and can be left blank. | + +------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | output | No | String | Path for outputting data, which must start with **/** or **s3a://**. A correct OBS path is required. If the path does not exist, the system automatically creates it. | + | | | | | + | | | | The parameter contains a maximum of 1,023 characters, excluding special characters such as ``;|&>'<$,`` and can be left blank. | + +------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_log | No | String | Path for storing job logs that record job running status. The path must start with **/** or **s3a://**. A correct OBS path is required. | + | | | | | + | | | | The parameter contains a maximum of 1,023 characters, excluding special characters such as ``;|&>'<$,`` and can be left blank. | + +------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | hive_script_path | Yes | String | SQL program path | + | | | | | + | | | | This parameter is needed by Spark Script and Hive Script jobs only, and must meet the following requirements: | + | | | | | + | | | | - Contains a maximum of 1,023 characters, excluding special characters such as ``;|&><'$.`` The address cannot be empty or full of spaces. | + | | | | - The path must start with **/** or **s3a://**. The OBS path does not support files or programs encrypted by KMS. | + | | | | - The path must end with **.sql**.\ **sql** is case-insensitive. | + +------------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0040__table3863810010324: + +.. table:: **Table 3** **DistCp** parameter description + + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================================+ + | job_name | Yes | String | Job name | + | | | | | + | | | | Contains only 1 to 64 letters, digits, hyphens (-), and underscores (_). | + | | | | | + | | | | .. note:: | + | | | | | + | | | | Identical job names are allowed but not recommended. | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------+ + | input | No | String | Data source path | + | | | | | + | | | | - When you import data, the parameter is set to an OBS path. Files or programs encrypted by KMS are not supported. | + | | | | - When you export data, the parameter is set to an HDFS path. | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------+ + | output | No | String | Data receiving path | + | | | | | + | | | | - When you import data, the parameter is set to an HDFS path. | + | | | | - When you export data, the parameter is set to an OBS path. | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------+ + | file_action | Yes | String | Types of file operations, including: | + | | | | | + | | | | - export: Export data from HDFS to OBS. | + | | | | - import: Import data from OBS to HDFS. | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0040__table63617887103233: + +.. table:: **Table 4** **Spark SQL** parameter description + + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+===========================================================================================================================================================================================================================================================================================================================================================================================================================================================================+ + | hql | Yes | String | Spark SQL statement, which needs Base64 encoding and decoding. **ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/** is a standard encoding table. MRS uses **ABCDEFGHILKJMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/** for Base64 encoding. The value of the **hql** parameter is generated by adding any letter to the beginning of the encoded character string. The Spark SQL statement is generated by decoding the value in the background. | + | | | | | + | | | | Example: | + | | | | | + | | | | #. Obtain the Base64 encoding tool. | + | | | | #. Enter the **show tables;** Spark SQL statement in the encoding tool to perform Base64 encoding. | + | | | | #. Obtain the encoded character string **c2hvdyB0YWLsZXM7**. | + | | | | #. At the beginning of **c2hvdyB0YWLsZXM7**, add any letter, for example, **g**. Then, the character string becomes **gc2hvdyB0YWLsZXM7**, that is, the value of the **hql** parameter. | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_name | Yes | String | Job name. It contains 1 to 64 characters. Only letters, digits, hyphens (-), and underscores (_) are allowed. | + | | | | | + | | | | .. note:: | + | | | | | + | | | | Identical job names are allowed but not recommended. | + +-----------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Response +-------- + +.. table:: **Table 5** Response parameter description + + +---------------+--------+---------------------------------------------------------------------+ + | Parameter | Type | Description | + +===============+========+=====================================================================+ + | job_execution | Object | For details, see :ref:`Table 6 `. | + +---------------+--------+---------------------------------------------------------------------+ + +.. _mrs_02_0040__table12040613193927: + +.. table:: **Table 6** **job_execution** parameter description + + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+=================================================================================================================================================================================================+ + | templated | Bool | Whether job execution objects are generated by job templates. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | created_at | Integer | Creation time, which is a 10-bit timestamp. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | updated_at | Integer | Update time, which is a 10-bit timestamp. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | id | String | Job ID | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | tenant_id | String | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_id | String | Job application ID | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_name | String | Job name | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | input_id | String | Data input ID | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | output_id | String | Data output ID | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | start_time | Integer | Start time of job execution, which is a 10-bit timestamp. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | end_time | Integer | End time of job execution, which is a 10-bit timestamp. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | cluster_id | String | Cluster ID | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | engine_job_id | String | Workflow ID of Oozie | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | return_code | Integer | Returned code for an execution result | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | is_public | Bool | Whether a job is public | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | is_protected | Bool | Whether a job is protected | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | group_id | String | Group ID of a job | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | jar_path | String | Path of the **.jar** file for program execution | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | input | String | Address for inputting data | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | output | String | Address for outputting data | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_log | String | Address for storing job logs | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_type | Integer | Job type code | + | | | | + | | | - 1: MapReduce | + | | | - 2: Spark | + | | | - 3: Hive Script | + | | | - 4: HiveQL (not supported currently) | + | | | - 5: DistCp | + | | | - 6: Spark Script | + | | | - 7: Spark SQL (not supported in this API currently) | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | file_action | String | Data import and export | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | arguments | String | Key parameter for program execution. The parameter is specified by the function of the user's internal program. MRS is only responsible for loading the parameter. This parameter can be empty. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_state | Integer | Job status code | + | | | | + | | | - -1: Terminated | + | | | - 1: Starting | + | | | - 2: Running | + | | | - 3: Completed | + | | | - 4: Abnormal | + | | | - 5: Error | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_final_status | Integer | Final job status | + | | | | + | | | - 0: unfinished | + | | | - 1: terminated due to an execution error | + | | | - 2: executed successfully | + | | | - 3: canceled | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | hive_script_path | String | Address of the Hive script | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | create_by | String | User ID for creating jobs | + | | | | + | | | This parameter is not used in the current version, but is retained for compatibility with earlier versions. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | finished_step | Integer | Number of completed steps | + | | | | + | | | This parameter is not used in the current version, but is retained for compatibility with earlier versions. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_main_id | String | Main ID of a job | + | | | | + | | | This parameter is not used in the current version, but is retained for compatibility with earlier versions. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_step_id | String | Step ID of a job | + | | | | + | | | This parameter is not used in the current version, but is retained for compatibility with earlier versions. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | postpone_at | Integer | Delay time, which is a 10-bit timestamp. | + | | | | + | | | This parameter is not used in the current version, but is retained for compatibility with earlier versions. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | step_name | String | Step name of a job | + | | | | + | | | This parameter is not used in the current version, but is retained for compatibility with earlier versions. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | step_num | Integer | Number of steps | + | | | | + | | | This parameter is not used in the current version, but is retained for compatibility with earlier versions. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | task_num | Integer | Number of tasks | + | | | | + | | | This parameter is not used in the current version, but is retained for compatibility with earlier versions. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | update_by | String | User ID for updating jobs | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | credentials | String | Token | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | user_id | String | User ID for creating jobs | + | | | | + | | | This parameter is not used in the current version, but is retained for compatibility with earlier versions. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_configs | String | Key-value pair set for saving job running configurations | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | extra | String | Authentication information | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | data_source_urls | String | Data source URL | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | info | String | Key-value pair set, containing job running information returned by Oozie | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + + The following is an example of an MapReduce job request: + + .. code-block:: + + { + "job_type": 1, + "job_name": "mrs_test_jobone_20170602_141106", + "cluster_id": "e955a7a3-d334-4943-a39a-994976900d56", + "jar_path": "s3a://mrs-opsadm/jarpath/hadoop-mapreduce-examples-2.7.2.jar", + "arguments": "wordcount", + "input": "s3a://mrs-opsadm/input/", + "output": "s3a://mrs-opsadm/output/", + "job_log": "s3a://mrs-opsadm/log/", + "file_action": "", + "hql": "", + "hive_script_path": "" + } + + The request example of Spark job: + + .. code-block:: + + { + "job_type": 2, + "job_name": "mrs_test_sparkjob_20170602_141106", + "cluster_id": "e955a7a3-d334-4943-a39a-994976900d56", + "jar_path": "s3a://mrs-opsadm/jarpath/spark-test.jar", + "arguments": "org.apache.spark.examples.SparkPi 10", + "input": "", + "output": "s3a://mrs-opsadm/output/", + "job_log": "s3a://mrs-opsadm/log/", + "file_action": "", + "hql": "", + "hive_script_path": "" + } + + The request example of Hive Script job: + + .. code-block:: + + { + "job_type": 3, + "job_name": "mrs_test_SparkScriptJob_20170602_141106", + "cluster_id": "e955a7a3-d334-4943-a39a-994976900d56", + "jar_path": "s3a://mrs-opsadm/jarpath/Hivescript.sql", + "arguments": "", + "input": "s3a://mrs-opsadm/input/", + "output": "s3a://mrs-opsadm/output/", + "job_log": "s3a://mrs-opsadm/log/", + "file_action": "", + "hql": "", + "hive_script_path": "s3a://mrs-opsadm/jarpath/Hivescript.sql" + } + + The request example of DistCp job for import: + + .. code-block:: + + { + "job_type": 5, + "job_name": "mrs_test_importjob_20170602_141106", + "cluster_id": "e955a7a3-d334-4943-a39a-994976900d56", + "input": "s3a://mrs-opsadm/jarpath/hadoop-mapreduce-examples-2.7.2.jar", + "output": "/user", + "file_action": "import" + } + + The request example of DistCp job for export: + + .. code-block:: + + { + "job_type": 5, + "job_name": "mrs_test_exportjob_20170602_141106", + "cluster_id": "e955a7a3-d334-4943-a39a-994976900d56", + "input": "/user/hadoop-mapreduce-examples-2.7.2.jar", + "output": "s3a://mrs-opsadm/jarpath/", + "file_action": "export" + } + + The request example of Spark Script job: + + .. code-block:: + + { + "job_type": 6, + "job_name": "mrs_test_sparkscriptjob_20170602_141106", + "cluster_id": "e955a7a3-d334-4943-a39a-994976900d56", + "jar_path": "s3a://mrs-opsadm/jarpath/sparkscript.sql", + "arguments": "", + "input": "s3a://mrs-opsadm/input/", + "output": "s3a://mrs-opsadm/output/", + "job_log": "s3a://mrs-opsadm/log/", + "file_action": "", + "hql": "", + "hive_script_path": "s3a://mrs-opsadm/jarpath/sparkscript.sql" + } + +- Example response + + .. code-block:: + + { + "job_execution": { + "templated": false, + "created_at": 1496387588, + "updated_at": 1496387588, + "id": "12ee9ae4-6ee1-48c6-bb84-fb0b4f76cf03", + "tenant_id": "c71ad83a66c5470496c2ed6e982621cc", + "job_id": "", + "job_name": "mrs_test_jobone_20170602_141106", + "input_id": null, + "output_id": null, + "start_time": 1496387588, + "end_time": null, + "cluster_id": "e955a7a3-d334-4943-a39a-994976900d56", + "engine_job_id": null, + "return_code": null, + "is_public": null, + "is_protected": false, + "group_id": "12ee9ae4-6ee1-48c6-bb84-fb0b4f76cf03", + "jar_path": "s3a://mrs-opsadm/jarpath/hadoop-mapreduce-examples-2.7.2.jar", + "input": "s3a://mrs-opsadm/input/", + "output": "s3a://mrs-opsadm/output/", + "job_log": "s3a://mrs-opsadm/log/", + "job_type": 1, + "file_action": "", + "arguments": "wordcount", + "hql": "", + "job_state": 2, + "job_final_status": 0, + "hive_script_path": "", + "create_by": "b67132be2f054a45b247365647e05af0", + "finished_step": 0, + "job_main_id": "", + "job_step_id": "", + "postpone_at": 1496387588, + "step_name": "", + "step_num": 0, + "task_num": 0, + "update_by": "b67132be2f054a45b247365647e05af0", + "credentials": "", + "user_id": "b67132be2f054a45b247365647e05af0", + "job_configs": null, + "extra": null, + "data_source_urls": null, + "info": null + } + } + +Status Code +----------- + +:ref:`Table 7 ` describes the status code of this API. + +.. _mrs_02_0040__table1584477916050: + +.. table:: **Table 7** Status Code + + =========== ==================================== + Status Code Description + =========== ==================================== + 200 The job has been successfully added. + =========== ==================================== + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/job_object_apis_v1,_not_recommended/creating_a_job_object.rst b/api-ref/source/apis/job_object_apis_v1,_not_recommended/creating_a_job_object.rst new file mode 100644 index 0000000..051b43a --- /dev/null +++ b/api-ref/source/apis/job_object_apis_v1,_not_recommended/creating_a_job_object.rst @@ -0,0 +1,252 @@ +:original_name: mrs_02_0041.html + +.. _mrs_02_0041: + +Creating a Job Object +===================== + +Function +-------- + +This API is used to create a job object. This API is compatible with Sahara. + +URI +--- + +- Format + + POST /v1.1/{project_id}/jobs + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +.. table:: **Table 2** Request parameter description + + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=============================================================================================================+ + | name | Yes | String | Job object name | + | | | | | + | | | | Contains 1 to 64 characters and consists of letters, digits, hyphens (-), and underscores (_) only. | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------+ + | mains | No | Array | Executable program set of a job object | + | | | | | + | | | | If the job type is Hive or Spark Script, the value of **mains** must not be empty. | + | | | | | + | | | | For details on how to obtain the executable program, see :ref:`Creating a Job Binary Object `. | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------+ + | libs | No | Array | Dependency package set of a job object | + | | | | | + | | | | If the job type is MapReduce or Spark, the value of **libs** must not be empty. | + | | | | | + | | | | For details on how to obtain the dependency package, see :ref:`Creating a Job Binary Object `. | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------+ + | is_protected | No | Bool | Whether a job object is protected | + | | | | | + | | | | - true | + | | | | - false | + | | | | | + | | | | The current version does not support this function. | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------+ + | interface | No | Array | User-defined interface set | + | | | | | + | | | | The current version does not support this function. | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------+ + | is_public | No | Bool | Whether a job object is public | + | | | | | + | | | | - true | + | | | | - false | + | | | | | + | | | | The current version does not support this function. | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------+ + | type | Yes | String | Job object type | + | | | | | + | | | | - MapReduce | + | | | | - Spark | + | | | | - Hive (not supported currently) | + | | | | - hql | + | | | | - DistCp | + | | | | - SparkScript | + | | | | - SparkSql (not supported in this API currently) | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------+ + | description | No | String | Job object description | + | | | | | + | | | | Contains a maximum of 65535 characters. | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------+ + +Response +-------- + +.. table:: **Table 3** Response parameter description + + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+===========================================================================================================+ + | description | String | Job object description | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | tenant_id | String | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | created_at | String | Job object creation time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | updated_at | String | Job object update time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | mains | Array | Executable program set of a job object | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | libs | Array | Dependency package set of a job object | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_protected | Bool | Whether a job object is protected | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | interface | Array | User-defined interface set | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_public | Bool | Whether a job object is public | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | type | String | Job object type | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | id | String | Job object ID | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | name | String | Job object name | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + + .. code-block:: + + The request example of MapReduce job: + { + "name": "my-mapreduce-job", + "mains": [ ], + "libs": [ + "092b628b-26a3-4571-9ba4-f8d000df8877" + ], + "is_protected": false, + "interface": [ ], + "is_public": false, + "type": "MapReduce", + "description": "This is the Map Reduce job template" + } + + The request example of Spark job: + { + "name": "my-spark-job", + "type": "Spark", + "description": "This is the Spark job template", + "mains": [ ], + "libs": [ + "ed2ffd92-6308-44cb-b930-e10b6d65d3aa" + ], + "is_public": false, + "is_protected": false, + "interface": [ ] + } + + The request example of DistCp job: + { + "name": "my-distcp-job", + "type": "DistCp", + "description": "This is the DistCp job template", + "mains": [ ], + "libs": [ ], + "is_public": false, + "is_protected": false, + "interface": [ ] + } + + The request example of Hive job: + { + "name": "my-hive-job", + "type": "Hive", + "description": "This is the Hive job template", + "mains": [ + "0d58a7e1-3ea7-413e-9a94-7702f99a9fa2" + ], + "libs": [ ], + "is_public": false, + "is_protected": false, + "interface": [ ] + } + + The request example of SparkScript job: + { + "name": "my-sparkscript-job", + "type": "SparkScript", + "description": "This is the SparkScript job template", + "mains": [ + "89e6a8bc-dde1-4053-97c1-72504f630dbf" + ], + "libs": [ ], + "is_public": false, + "is_protected": false, + "interface": [ ] + } + +- Example response + + .. code-block:: + + { + "job": { + "name": "my-mapreduce-job", + "type": "MapReduce", + "description": "This is the Map Reduce job template", + "mains": [], + "libs": [ + { + "name": "my-job-binary-666", + "url": "/simple/mapreduce/program", + "description": "this is the job binary template", + "id": "2628d0e4-6109-4a09-a338-c4ee1b0963ed", + "tenant_id": "5a3314075bfa49b9ae360f4ecd333695", + "is_public": false, + "is_protected": false, + "extra": null + } + ], + "created_at": "2017-06-22T09:39:13", + "updated_at": "2017-06-22T09:39:13", + "id": "38a04cba-c113-4868-b11f-f50e8b1bf252", + "tenant_id": "5a3314075bfa49b9ae360f4ecd333695", + "is_public": false, + "is_protected": false, + "interface": [] + } + } + +Status Code +----------- + +:ref:`Table 4 ` describes the status code of this API. + +.. _mrs_02_0041__table1584477916050: + +.. table:: **Table 4** Status code + + =========== ============================================= + Status code Description + =========== ============================================= + 202 The job object has been successfully created. + =========== ============================================= + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/job_object_apis_v1,_not_recommended/deleting_a_job_object.rst b/api-ref/source/apis/job_object_apis_v1,_not_recommended/deleting_a_job_object.rst new file mode 100644 index 0000000..fb1766b --- /dev/null +++ b/api-ref/source/apis/job_object_apis_v1,_not_recommended/deleting_a_job_object.rst @@ -0,0 +1,72 @@ +:original_name: mrs_02_0048.html + +.. _mrs_02_0048: + +Deleting a Job Object +===================== + +Function +-------- + +This API is used to delete a job object. This API is compatible with Sahara. + +URI +--- + +- Format + + DELETE /v1.1/{project_id}/jobs/{job_id} + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | job_id | Yes | Job object ID | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +**Request parameters** + +None. + +Response +-------- + +**Response parameters** + +None. + +Example +------- + +- Example request + + None. + +- Example response + + None. + +Status Code +----------- + +:ref:`Table 2 ` describes the status code of this API. + +.. _mrs_02_0048__table1584477916050: + +.. table:: **Table 2** Status code + + =========== ============================================= + Status Code Description + =========== ============================================= + 204 The job object has been successfully deleted. + =========== ============================================= + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/job_object_apis_v1,_not_recommended/executing_a_job_object.rst b/api-ref/source/apis/job_object_apis_v1,_not_recommended/executing_a_job_object.rst new file mode 100644 index 0000000..25e8945 --- /dev/null +++ b/api-ref/source/apis/job_object_apis_v1,_not_recommended/executing_a_job_object.rst @@ -0,0 +1,278 @@ +:original_name: mrs_02_0043.html + +.. _mrs_02_0043: + +Executing a Job Object +====================== + +Function +-------- + +This API is used to execute a created job object. This API is compatible with Sahara. + +URI +--- + +- Format + + POST /v1.1/{project_id}/jobs/{job_id}/execute + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | job_id | Yes | Job object ID | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +.. table:: **Table 2** Request parameter description + + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+======================================================================================================================================================================================+ + | cluster_id | Yes | String | Cluster ID | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | input_id | Yes | String | Input data source ID of a job object | + | | | | | + | | | | For details on how to obtain the input data source ID, see :ref:`Creating a Data Source `. | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | output_id | Yes | String | Output data source ID of a job object | + | | | | | + | | | | For details on how to obtain the output data source ID, see :ref:`Creating a Data Source `. | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | is_protected | No | Bool | Whether a job object is protected | + | | | | | + | | | | - true | + | | | | - false | + | | | | | + | | | | The current version does not support this function. | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | is_public | No | Bool | Whether a job object is public | + | | | | | + | | | | - true | + | | | | - false | + | | | | | + | | | | The current version does not support this function. | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_configs | Yes | Object | Key-value pair set for saving job running configurations | + | | | | | + | | | | If the job type is MapReduce or Spark, set the first parameter of **args** to be the same as the **arguments** parameter in :ref:`Adding a Job and Executing the Job `. | + +-----------------+-----------------+-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Response +-------- + +.. table:: **Table 3** Response parameter description + + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+===========================================================================================================+ + | output_id | String | Output data source ID of a job object | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | info | Object | Job object status information | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | job_id | String | Job object ID | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | tenant_id | String | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | created_at | String | Job object creation time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | updated_at | String | Job object update time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | return_code | String | Response code after job execution | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | oozie_job_id | String | Workflow ID returned by Oozie | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_protected | Bool | Whether a job object is protected | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | input_id | String | Input data source ID of a job object | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | cluster_id | String | Cluster ID | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_public | Bool | Whether a job object is public | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | job_configs | Object | Key-value pair set for saving job running configurations | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | id | String | Job object ID | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + + .. code-block:: + + The request example of MapReduce job: + { + "cluster_id": "811e1134-666f-4c48-bc92-afb5b10c9d8c", + "input_id": "3e1bc8e6-8c69-4749-8e52-90d9341d15bc", + "output_id": "52146b52-6540-4aac-a024-fee253cf52a9", + "is_protected": false, + "is_public": false, + "job_configs": { + "configs": { + "mapred.map.tasks": "1", + "mapred.reduce.tasks": "1" + }, + "args": [ + "wordcount", + "arg2" + ], + "params": { + "param2": "value2", + "param1": "value1" + } + } + } + + The request example of Spark job: + { + "cluster_id": "8f3a547d-d53a-44ba-9aad-ded0b0b26e9c", + "input_id": "3e1bc8e6-8c69-4749-8e52-90d9341d15bc", + "output_id": "8bb0259f-309a-49f4-843b-0be86ac1623a", + "job_configs": { + "configs": { }, + "args": [ + "org.apache.spark.examples.SparkPi 10", + "arg2" + ], + "params": { + "param2": "value2", + "param1": "value1" + } + } + } + + The request example of DistCp job: + { + "cluster_id": "811e1134-666f-4c48-bc92-afb5b10c9d8c", + "input_id": "3e1bc8e6-8c69-4749-8e52-90d9341d15bc", + "output_id": "52146b52-6540-4aac-a024-fee253cf52a9", + "is_protected": false, + "is_public": false, + "job_configs": { + "configs": { }, + "args": [ + "arg1", + "arg2" + ], + "params": { + "param2": "value2", + "param1": "value1" + } + } + } + + The request example of Hive job: + { + "cluster_id": "8f3a547d-d53a-44ba-9aad-ded0b0b26e9c", + "input_id": "3e1bc8e6-8c69-4749-8e52-90d9341d15bc", + "output_id": "8bb0259f-309a-49f4-843b-0be86ac1623a", + "is_protected": false, + "is_public": false, + "job_configs": { + "configs": { }, + "args": [ + "arg1", + "arg2" + ], + "params": { + "param2": "value2", + "param1": "value1" + } + } + } + + The request example of SparkScript job: + { + "cluster_id": "811e1134-666f-4c48-bc92-afb5b10c9d8c", + "input_id": "3e1bc8e6-8c69-4749-8e52-90d9341d15bc", + "output_id": "52146b52-6540-4aac-a024-fee253cf52a9", + "is_protected": false, + "is_public": false, + "job_configs": { + "configs": { }, + "args": [ + "arg1", + "arg2" + ], + "params": { + "param2": "value2", + "param1": "value1" + } + } + } + +- Example response + + .. code-block:: + + { + "job_execution":{ + "created_at":"2017-02-20T09:11:32", + "updated_at":"2017-02-20T09:11:32", + "id":"4a56525d-34db-43e3-99c9-af67491025cd", + "tenant_id":"3f99e3319a8943ceb15c584f3325d064", + "job_id":"2c12ff33-da22-47b1-b51f-2828c16bbad8", + "start_time":"2017-02-20T09:11:32", + "end_time":null, + "cluster_id":"c1000b4f-f2a1-49e1-af3c-2e19fc1eb72d", + "oozie_job_id":null, + "return_code":null, + "input_id":"ce8c2b04-f46c-4580-8b58-5b6aaf4a44a9", + "output_id":"9d59ce5b-d0f4-46d4-8738-6e50c2a5c68a", + "is_protected":null, + "is_public":null, + "job_configs":{ + "configs":{ + "mapred.map.tasks":"1", + "mapred.reduce.tasks":"1" + }, + "args":[ + "wordcount ", + "arg2" + ], + "params":{ + "param2":"value2", + "param1":"value1" + } + }, + "data_source_urls":null, + "info":null + } + } + +Status Code +----------- + +:ref:`Table 4 ` describes the status code of this API. + +.. _mrs_02_0043__table1584477916050: + +.. table:: **Table 4** Status code + + =========== ============================================== + Status code Description + =========== ============================================== + 202 The job object has been executed successfully. + =========== ============================================== + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/job_object_apis_v1,_not_recommended/index.rst b/api-ref/source/apis/job_object_apis_v1,_not_recommended/index.rst new file mode 100644 index 0000000..f67b2ff --- /dev/null +++ b/api-ref/source/apis/job_object_apis_v1,_not_recommended/index.rst @@ -0,0 +1,30 @@ +:original_name: mrs_02_0039.html + +.. _mrs_02_0039: + +Job Object APIs (V1, Not Recommended) +===================================== + +- :ref:`Adding a Job and Executing the Job ` +- :ref:`Creating a Job Object ` +- :ref:`Updating a Job Object ` +- :ref:`Executing a Job Object ` +- :ref:`Querying the Job Object List ` +- :ref:`Querying Job Object Details ` +- :ref:`Querying the exe Object List of Jobs ` +- :ref:`Querying exe Object Details ` +- :ref:`Deleting a Job Object ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + adding_a_job_and_executing_the_job + creating_a_job_object + updating_a_job_object + executing_a_job_object + querying_the_job_object_list + querying_job_object_details + querying_the_exe_object_list_of_jobs + querying_exe_object_details + deleting_a_job_object diff --git a/api-ref/source/apis/job_object_apis_v1,_not_recommended/querying_exe_object_details.rst b/api-ref/source/apis/job_object_apis_v1,_not_recommended/querying_exe_object_details.rst new file mode 100644 index 0000000..d13cd59 --- /dev/null +++ b/api-ref/source/apis/job_object_apis_v1,_not_recommended/querying_exe_object_details.rst @@ -0,0 +1,208 @@ +:original_name: mrs_02_0047.html + +.. _mrs_02_0047: + +Querying exe Object Details +=========================== + +Function +-------- + +This API is used to query detailed information about the exe object of a job. This API is incompatible with Sahara. + +URI +--- + +- Format + + GET /v1.1/{project_id}/job-exes/{job_exe_id} + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | job_exe_id | Yes | Job ID | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +**Request parameters** + +None. + +Response +-------- + +.. table:: **Table 2** Response parameter description + + +---------------+--------+--------------------------------------------------------------------+ + | Parameter | Type | Description | + +===============+========+====================================================================+ + | job_execution | Object | For details, see :ref:`Table 3 `. | + +---------------+--------+--------------------------------------------------------------------+ + +.. _mrs_02_0047__table3315199519550: + +.. table:: **Table 3** **job_execution** parameter description + + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+========================================================================================================================================================================================+ + | id | String | Job ID | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | create_at | Integer | Creation time, which is a 13-bit timestamp. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | update_at | Integer | Update time, which is a 13-bit timestamp. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | tenant_id | String | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_id | String | Job ID | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_name | String | Job name | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | start_time | Integer | Start time of job execution, which is a 13-bit timestamp. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | end_time | Integer | End time of job execution, which is a 13-bit timestamp. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | cluster_id | String | Cluster ID of a job | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | group_id | String | Group ID of a job | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | jar_path | String | Path of the **.jar** file or **.sql** file for program execution | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | input | String | Address for inputting data | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | output | String | Address for outputting data | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_log | String | Address for storing job logs | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_type | Integer | Job type code | + | | | | + | | | - 1: MapReduce | + | | | - 2: Spark | + | | | - 3: Hive Script | + | | | - 4: HiveQL (not supported currently) | + | | | - 5: DistCp | + | | | - 6: Spark Script | + | | | - 7: Spark SQL (not supported in this API currently) | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | file_action | String | Data import and export | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | arguments | String | Key parameter for program execution. The parameter is specified by the function of the user's program. MRS is only responsible for loading the parameter. This parameter can be empty. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | hql | String | HiveQL statement | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_state | Integer | Job status code | + | | | | + | | | - -1: Terminated | + | | | - 1: Starting | + | | | - 2: Running | + | | | - 3: Completed | + | | | - 4: Abnormal | + | | | - 5: Error | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_final_status | Integer | Final job status | + | | | | + | | | - 0: unfinished | + | | | - 1: terminated due to an execution error | + | | | - 2: executed successfully | + | | | - 3: canceled | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | hive_script_path | String | Address of the Hive script | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | create_by | String | User ID for creating jobs | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | finished_step | Integer | Number of completed steps | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_main_id | String | Main ID of a job | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_step_id | String | Step ID of a job | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | postpone_at | Integer | Delay time, which is a 13-bit timestamp. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | step_name | String | Step name of a job | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | step_num | Integer | Number of steps | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | task_num | Integer | Number of tasks | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | update_by | String | User ID for updating jobs | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | spend_time | Integer | Duration of job execution (unit: s) | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | step_seq | Integer | Step sequence of a job | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | progress | String | Job execution progress | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + + None. + +- Example response + + .. code-block:: + + { + "job_execution": { + "id": "632863d5-15d4-4691-9dc1-1a72340cb097", + "create_at": 1484240559176, + "update_at": 1484240559176, + "tenant_id": "3f99e3319a8943ceb15c584f3325d064", + "job_id": "632863d5-15d4-4691-9dc1-1a72340cb097", + "job_name": "hive_script", + "start_time": 1484240559176, + "end_time": null, + "cluster_id": "8b1d55f6-150e-45e2-8347-b2ca608d366b", + "group_id": "632863d5-15d4-4691-9dc1-1a72340cb097", + "jar_path": "s3a://jp-test1/program/Hivescript.sql", + "input": "s3a://jp-test1/input/", + "output": "s3a://jp-test1/output/", + "job_log": "s3a://jp-test1/joblogs/", + "job_type": 3, + "file_action": "", + "arguments": "wordcount", + "hql": null, + "job_state": 3, + "job_final_status": 1, + "hive_script_path": "s3a://jp-test1/program/Hivescript.sql", + "create_by": "3f99e3319a8943ceb15c584f3325d064", + "finished_step": 0, + "job_main_id": "", + "job_step_id": "", + "postpone_at": 1484240558705, + "step_name": "", + "step_num": 0, + "task_num": 0, + "update_by": "3f99e3319a8943ceb15c584f3325d064", + "spend_time": null, + "step_seq": 222, + "progress": "first progress" + } + } + +Status Code +----------- + +:ref:`Table 4 ` describes the status code of this API. + +.. _mrs_02_0047__table1584477916050: + +.. table:: **Table 4** Status code + + =========== ================================================ + Status code Description + =========== ================================================ + 200 The exe object details are queried successfully. + =========== ================================================ + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/job_object_apis_v1,_not_recommended/querying_job_object_details.rst b/api-ref/source/apis/job_object_apis_v1,_not_recommended/querying_job_object_details.rst new file mode 100644 index 0000000..2c3736c --- /dev/null +++ b/api-ref/source/apis/job_object_apis_v1,_not_recommended/querying_job_object_details.rst @@ -0,0 +1,129 @@ +:original_name: mrs_02_0045.html + +.. _mrs_02_0045: + +Querying Job Object Details +=========================== + +Function +-------- + +This API is used to query detailed information about a job object. This API is compatible with Sahara. + +URI +--- + +- Format + + GET /v1.1/{project_id}/jobs/{job_id} + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | job_id | Yes | Job object ID | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +**Request parameters** + +None + +Response +-------- + +.. table:: **Table 2** Response parameter description + + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+===========================================================================================================+ + | tenant_id | String | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | created_at | String | Job object creation time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | id | String | Job object ID | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | name | String | Job object name | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | updated_at | String | Job object update time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | description | String | Job object description | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | interface | Array | User-defined interface set | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | libs | Array | Dependency package set of a job object | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | type | String | Job object type | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | mains | Array | Executable program set of a job object | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_protected | Bool | Whether a job object is protected | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + + None + +- Example response + + .. code-block:: + + { + "job": { + "name": "my-mapreduce-job", + "type": "MapReduce", + "description": "This is the Map Reduce job template", + "mains": [], + "libs": [ + { + "name": "my-job-binary-666", + "url": "/simple/mapreduce/program", + "description": "this is the job binary template", + "id": "2628d0e4-6109-4a09-a338-c4ee1b0963ed", + "tenant_id": "5a3314075bfa49b9ae360f4ecd333695", + "is_public": false, + "is_protected": false, + "extra": null + } + ], + "created_at": "2017-06-22T09:39:13", + "updated_at": "2017-06-22T09:39:13", + "id": "38a04cba-c113-4868-b11f-f50e8b1bf252", + "tenant_id": "5a3314075bfa49b9ae360f4ecd333695", + "is_public": false, + "is_protected": false, + "interface": [] + } + } + +Status Code +----------- + +:ref:`Table 3 ` describes the status code of this API. + +.. _mrs_02_0045__table1584477916050: + +.. table:: **Table 3** Status code + + =========== ================================================ + Status code Description + =========== ================================================ + 200 The job object details are queried successfully. + =========== ================================================ + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/job_object_apis_v1,_not_recommended/querying_the_exe_object_list_of_jobs.rst b/api-ref/source/apis/job_object_apis_v1,_not_recommended/querying_the_exe_object_list_of_jobs.rst new file mode 100644 index 0000000..fc9fb81 --- /dev/null +++ b/api-ref/source/apis/job_object_apis_v1,_not_recommended/querying_the_exe_object_list_of_jobs.rst @@ -0,0 +1,234 @@ +:original_name: mrs_02_0046.html + +.. _mrs_02_0046: + +Querying the exe Object List of Jobs +==================================== + +Function +-------- + +This API is used to query the exe object list of all jobs. This API is incompatible with Sahara. + +URI +--- + +- Format + + GET /v1.1/{project_id}/job-exes + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +.. table:: **Table 2** Request parameter description + + +-----------------+-----------------+-----------------+--------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+============================================+ + | cluster_id | Yes | String | Cluster ID | + +-----------------+-----------------+-----------------+--------------------------------------------+ + | id | No | String | Job execution object ID | + +-----------------+-----------------+-----------------+--------------------------------------------+ + | page_size | No | Integer | Maximum number of jobs displayed on a page | + | | | | | + | | | | Value range: 1 to 100 | + +-----------------+-----------------+-----------------+--------------------------------------------+ + | current_page | No | Integer | Current page number | + +-----------------+-----------------+-----------------+--------------------------------------------+ + | job_name | No | String | Job name | + +-----------------+-----------------+-----------------+--------------------------------------------+ + | state | No | Integer | Job status code | + | | | | | + | | | | - -1: Terminated | + | | | | - 2: Running | + | | | | - 3: Completed | + | | | | - 4: Abnormal | + +-----------------+-----------------+-----------------+--------------------------------------------+ + +Response +-------- + +.. table:: **Table 3** Response parameter description + + +-----------------------+-----------------------+--------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+====================================================================+ + | totalRecord | Integer | Total number of jobs in a list | + +-----------------------+-----------------------+--------------------------------------------------------------------+ + | job_executions | Array | Job list parameter | + | | | | + | | | For details, see :ref:`Table 4 `. | + +-----------------------+-----------------------+--------------------------------------------------------------------+ + +.. _mrs_02_0046__table3315199519550: + +.. table:: **Table 4** **job_executions** parameter description + + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+=================================================================================================================================================================================================+ + | id | String | Job ID | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | create_at | Integer | Creation time, which is a 13-bit timestamp. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | update_at | Integer | Update time, which is a 13-bit timestamp. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | tenant_id | String | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_id | String | Job ID of the YARN | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_name | String | Job name | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | start_time | Integer | Start time of job execution, which is a 13-bit timestamp. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | end_time | Integer | End time of job execution, which is a 13-bit timestamp. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | cluster_id | String | Cluster ID of a job | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | group_id | String | Group ID of a job | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | jar_path | String | Path of the **.jar** file or **.sql** file for program execution | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | input | String | Address for inputting data | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | output | String | Address for outputting data | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_log | String | Address for storing job logs | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_type | Integer | Job type code | + | | | | + | | | - 1: MapReduce | + | | | - 2: Spark | + | | | - 3: Hive Script | + | | | - 4: HiveQL (not supported currently) | + | | | - 5: DistCp | + | | | - 6: Spark Script | + | | | - 7: Spark SQL (not supported in this API currently) | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | file_action | String | Data import and export | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | arguments | String | Key parameter for program execution. The parameter is specified by the function of the user's internal program. MRS is only responsible for loading the parameter. This parameter can be empty. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | hql | String | HiveQL statement | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_state | Integer | Job status code | + | | | | + | | | - -1: Terminated | + | | | - 2: Running | + | | | - 3: Completed | + | | | - 4: Abnormal | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_final_status | Integer | Final job status. | + | | | | + | | | - 0: unfinished | + | | | - 1: terminated due to an execution error | + | | | - 2: executed successfully | + | | | - 3: canceled | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | hive_script_path | String | Address of the Hive script | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | create_by | String | User ID for creating jobs | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | finished_step | Integer | Number of completed steps | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_main_id | String | Main ID of a job | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_step_id | String | Step ID of a job | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | postpone_at | Integer | Delay time, which is a 13-bit timestamp. | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | step_name | String | Step name of a job | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | step_num | Integer | Number of steps | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | task_num | Integer | Number of tasks | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | update_by | String | User ID for updating jobs | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | spend_time | Integer | Duration of job execution (unit: s) | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | step_seq | Integer | Step sequence of a job | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | progress | String | Job execution progress | + +-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + + .. code-block:: text + + GET/v1.1/{project_id}/job-exes?page_size=10¤t_page=1&state=3&job_name=myfirstjob&clusterId=20ca8601-72a2-4570-b788-2a20fec81a95 + +- Example response + + .. code-block:: + + { + "totalRecord": 14, + "job_executions": [ + { + "id": "669476bd-89d2-45aa-8f1a-872d16de377e", + "create_at": 1484641003707, + "update_at": 1484641003707, + "tenant_id": "3f99e3319a8943ceb15c584f3325d064", + "job_id": "", + "job_name": "myfirstjob", + "start_time": 1484641003707, + "end_time": null, + "cluster_id": "2b460e01-3351-4170-b0a7-57b9dd5ffef3", + "group_id": "669476bd-89d2-45aa-8f1a-872d16de377e", + "jar_path": "s3a://jp-test1/program/hadoop-mapreduce-examples-2.4.1.jar", + "input": "s3a://jp-test1/input/", + "output": "s3a://jp-test1/output/", + "job_log": "s3a://jp-test1/joblogs/", + "job_type": 1, + "file_action": "", + "arguments": "wordcount", + "hql": "", + "job_state": 2, + "job_final_status": 1, + "hive_script_path": null, + "create_by": "3f99e3319a8943ceb15c584f3325d064", + "finished_step": 0, + "job_main_id": "", + "job_step_id": "", + "postpone_at": 1484641003174, + "step_name": "", + "step_num": 0, + "task_num": 0, + "update_by": "3f99e3319a8943ceb15c584f3325d064", + "spend_time": null, + "step_seq": 222, + "progress": "first progress" + } + ] + } + +Status Code +----------- + +:ref:`Table 5 ` describes the status code of this API. + +.. _mrs_02_0046__table1584477916050: + +.. table:: **Table 5** Status code + + =========== ==================================================== + Status Code Description + =========== ==================================================== + 200 The exe object list of jobs is queried successfully. + =========== ==================================================== + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/job_object_apis_v1,_not_recommended/querying_the_job_object_list.rst b/api-ref/source/apis/job_object_apis_v1,_not_recommended/querying_the_job_object_list.rst new file mode 100644 index 0000000..0e7b16b --- /dev/null +++ b/api-ref/source/apis/job_object_apis_v1,_not_recommended/querying_the_job_object_list.rst @@ -0,0 +1,205 @@ +:original_name: mrs_02_0044.html + +.. _mrs_02_0044: + +Querying the Job Object List +============================ + +Function +-------- + +This API is used to query the job object list. This API is compatible with Sahara. + +URI +--- + +- Format + + GET /v1.1/{project_id}/jobs + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +=======================+=======================+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | limit | No | Maximum number of objects in response data | + | | | | + | | | Value range: 1 to 1073741822 | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | marker | No | The ID is the ID of the last element in the list that will not be returned. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | sort_by | No | Sort field. A hyphen (-) before the sort field indicates to sort in descending order. Examples: | + | | | | + | | | - **sort_by=name** indicates to sort by **name** in ascending order. | + | | | - **sort_by=-name** indicates to sort by name in descending order. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +**Request parameters** + +None + +Response +-------- + +.. table:: **Table 2** Response parameter description + + +-----------------------+-----------------------+---------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+=====================================================================+ + | markers | Object | Markers object | + | | | | + | | | For details, see :ref:`Table 3 `. | + +-----------------------+-----------------------+---------------------------------------------------------------------+ + | jobs | Array | Job object list | + | | | | + | | | For details, see :ref:`Table 4 `. | + +-----------------------+-----------------------+---------------------------------------------------------------------+ + +.. _mrs_02_0044__table35904709104244: + +.. table:: **Table 3** **markers** parameter description + + ========= ====== =========================== + Parameter Type Description + ========= ====== =========================== + prev String Marker on the previous page + next String Marker on the next page + ========= ====== =========================== + +.. _mrs_02_0044__table5154210817547: + +.. table:: **Table 4** **jobs** parameter description + + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+===========================================================================================================+ + | description | String | Job object description | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | tenant_id | String | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | created_at | String | Job object creation time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | mains | Array | Executable program set of a job object | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | updated_at | String | Job object update time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | libs | Array | Dependency package set of a job object | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_protected | Bool | Whether a job object is protected | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | interface | Array | User-defined interface set | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_public | Bool | Whether a job object is public | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | type | String | Job object type | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | id | String | Job object ID | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | name | String | Job object name | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + + .. code-block:: text + + GET /v1.1/{project_id}/jobs?limit=2&sort_by=name&marker=4f59aa66-bf38-402c-9b6f-320e77219b9b + +- Example response + + .. code-block:: + + { + "markers": { + "prev": "62a287e9-76c3-458d-a2f8-56e2d824a9ee", + "next": null + }, + "jobs": [ + { + "name": "my-mapreduce-job", + "type": "MapReduce", + "description": "This is the Map Reduce job template", + "mains": [], + "libs": [ + { + "name": "my-job-binary-666", + "url": "/simple/mapreduce/program", + "description": "this is the job binary template", + "id": "2628d0e4-6109-4a09-a338-c4ee1b0963ed", + "tenant_id": "5a3314075bfa49b9ae360f4ecd333695", + "is_public": false, + "is_protected": false, + "extra": null + } + ], + "created_at": "2017-06-22T09:39:13", + "updated_at": "2017-06-22T09:39:13", + "id": "38a04cba-c113-4868-b11f-f50e8b1bf252", + "tenant_id": "5a3314075bfa49b9ae360f4ecd333695", + "is_public": false, + "is_protected": false, + "interface": [] + }, + { + "name": "my-mapreduce-job-update", + "type": "MapReduce", + "description": "This is the Map Reduce job template", + "mains": [], + "libs": [ + { + "name": "my-job-binary-666", + "url": "/simple/mapreduce/program", + "description": "this is the job binary template", + "id": "2628d0e4-6109-4a09-a338-c4ee1b0963ed", + "tenant_id": "5a3314075bfa49b9ae360f4ecd333695", + "is_public": false, + "is_protected": false, + "extra": null + } + ], + "created_at": "2017-06-22T12:05:58", + "updated_at": "2017-06-22T12:05:58", + "id": "b8ea4daa-0042-45e0-a522-e8b714e74760", + "tenant_id": "5a3314075bfa49b9ae360f4ecd333695", + "is_public": false, + "is_protected": false, + "interface": [] + } + ] + } + +Status Code +----------- + +:ref:`Table 5 ` describes the status code of this API. + +.. _mrs_02_0044__table1584477916050: + +.. table:: **Table 5** Status code + + =========== ============================================ + Status code Description + =========== ============================================ + 200 The job object list is queried successfully. + =========== ============================================ + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/job_object_apis_v1,_not_recommended/updating_a_job_object.rst b/api-ref/source/apis/job_object_apis_v1,_not_recommended/updating_a_job_object.rst new file mode 100644 index 0000000..a750126 --- /dev/null +++ b/api-ref/source/apis/job_object_apis_v1,_not_recommended/updating_a_job_object.rst @@ -0,0 +1,193 @@ +:original_name: mrs_02_0042.html + +.. _mrs_02_0042: + +Updating a Job Object +===================== + +Function +-------- + +This API is used to update a job object. This API is compatible with Sahara. + +URI +--- + +- Format + + PATCH /v1.1/{project_id}/jobs/{job_id} + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | job_id | Yes | Job object ID | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +.. table:: **Table 2** Request parameter description + + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=====================================================================================================+ + | name | No | String | Job object name | + | | | | | + | | | | Contains 1 to 64 characters and consists of letters, digits, hyphens (-), and underscores (_) only. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | mains | No | Array | Executable program set of a job object | + | | | | | + | | | | The current version does not support update of the executable program set. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | libs | No | Array | Dependency package set of a job object | + | | | | | + | | | | The current version does not support update of the dependency package set. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | is_protected | No | Bool | Whether a job object is protected | + | | | | | + | | | | - true | + | | | | - false | + | | | | | + | | | | The current version does not support this function. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | interface | No | Array | User-defined interface set | + | | | | | + | | | | The current version does not support this function. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | is_public | No | Bool | Whether a job object is public | + | | | | | + | | | | - true | + | | | | - false | + | | | | | + | | | | The current version does not support this function. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | type | No | String | Job object type | + | | | | | + | | | | - MapReduce | + | | | | - Spark | + | | | | - Hive | + | | | | - DistCp | + | | | | - SparkScript | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + | description | No | String | Job object description | + | | | | | + | | | | Contains a maximum of 65535 characters. | + +-----------------+-----------------+-----------------+-----------------------------------------------------------------------------------------------------+ + +Response +-------- + +.. table:: **Table 3** Response parameter description + + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+===========================================================================================================+ + | description | String | Job object description | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | tenant_id | String | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | created_at | String | Job object creation time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | updated_at | String | Job object update time | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | mains | Array | Executable program set of a job object | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | libs | Array | Dependency package set of a job object | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_protected | Bool | Whether a job object is protected | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | interface | Array | User-defined interface set | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | is_public | Bool | Whether a job object is public | + | | | | + | | | - true | + | | | - false | + | | | | + | | | The current version does not support this function. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | type | String | Job object type | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | id | String | Job object ID | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + | name | String | Job object name | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + + .. code-block:: + + { + "name": "my-mapreduce-job-update", + "mains": [ ], + "libs": [ + "2628d0e4-6109-4a09-a338-c4ee1b0963ed" + ], + "is_protected": false, + "interface": [ ], + "is_public": false, + "type": "MapReduce", + "description": "This is the Map Reduce job template" + } + +- Example response + + .. code-block:: + + { + "job": { + "name": "my-mapreduce-job-update", + "type": "MapReduce", + "description": "This is the Map Reduce job template", + "mains": [], + "libs": [ + { + "name": "my-job-binary-666", + "url": "/simple/mapreduce/program", + "description": "this is the job binary template", + "id": "2628d0e4-6109-4a09-a338-c4ee1b0963ed", + "tenant_id": "5a3314075bfa49b9ae360f4ecd333695", + "is_public": false, + "is_protected": false, + "extra": null + } + ], + "created_at": "2017-06-22T12:05:58", + "updated_at": "2017-06-22T12:05:58", + "id": "b8ea4daa-0042-45e0-a522-e8b714e74760", + "tenant_id": "5a3314075bfa49b9ae360f4ecd333695", + "is_public": false, + "is_protected": false, + "interface": [] + } + } + +Status Code +----------- + +:ref:`Table 4 ` describes the status code of this API. + +.. _mrs_02_0042__table1584477916050: + +.. table:: **Table 4** Status code + + =========== ============================================= + Status code Description + =========== ============================================= + 202 The job object has been successfully updated. + =========== ============================================= + +For the description about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/job_object_apis_v2/adding_and_executing_a_job.rst b/api-ref/source/apis/job_object_apis_v2/adding_and_executing_a_job.rst new file mode 100644 index 0000000..3c92b79 --- /dev/null +++ b/api-ref/source/apis/job_object_apis_v2/adding_and_executing_a_job.rst @@ -0,0 +1,297 @@ +:original_name: mrs_02_0085.html + +.. _mrs_02_0085: + +Adding and Executing a Job +========================== + +Function +-------- + +This API is used to add and submit a job in an MRS cluster. + +.. note:: + + - If Kerberos authentication is enabled for a cluster, on the **Dashboard** tab page of the cluster details page, click **Click to synchronize** on the right side of **IAM User Sync** to synchronize IAM users, and then submit a job through this API. + +URI +--- + +- Format + + POST /v2/{project_id}/clusters/{cluster_id}/job-executions + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +============+===========+===================================================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------+ + | cluster_id | Yes | Cluster ID. For details on how to obtain the cluster ID, see :ref:`Obtaining a Cluster ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------+ + +Request +------- + +.. table:: **Table 2** Request parameter description + + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================+ + | job_type | Yes | String | Type of a job. | + | | | | | + | | | | - MapReduce | + | | | | - SparkSubmit | + | | | | - HiveScript | + | | | | - HiveSql | + | | | | - DistCp, importing and exporting data | + | | | | - SparkScript | + | | | | - SparkSql | + | | | | - Flink | + | | | | | + | | | | .. note:: | + | | | | | + | | | | Spark, Hive, and Flink jobs can be added to only clusters that include Spark, Hive, and Flink components. | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_name | Yes | String | Job name. It contains 1 to 64 characters. Only letters, digits, hyphens (-), and underscores (_) are allowed. | + | | | | | + | | | | .. note:: | + | | | | | + | | | | Identical job names are allowed but not recommended. | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | arguments | No | Array | Key parameter for program execution. The parameter is specified by the function of the user's program. MRS is only responsible for loading the parameter. | + | | | | | + | | | | The parameter contains a maximum of 4,096 characters, excluding special characters such as ``;|&>'<$,`` and can be left blank. | + | | | | | + | | | | .. note:: | + | | | | | + | | | | - If you enter a parameter with sensitive information (such as the login password), the parameter may be exposed in the job details display and log printing. Exercise caution when performing this operation. | + | | | | - For MRS 1.9.2 or later, a file path on OBS can start with **obs://**. To use this format to submit HiveScript or HiveSQL jobs, choose **Components** > **Hive** > **Service Configuration** on the cluster details page, set **Type** to **All**, and search for **core.site.customized.configs**. Add the endpoint configuration item (**fs.obs.endpoint**) of OBS and enter the endpoint corresponding to OBS in **Value**. Obtain the value from `Regions and Endpoints `__. | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | properties | No | Object | Program system parameter. | + | | | | | + | | | | The parameter contains a maximum of 2,048 characters, excluding special characters such as :literal:`><|'`&!\\,` and can be left blank. | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Response +-------- + +.. table:: **Table 3** Response parameter description + + +-----------------------+-----------------------+---------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+=========================================================+ + | job_submit_result | Object | Job execution result | + +-----------------------+-----------------------+---------------------------------------------------------+ + | job_id | String | Job ID | + +-----------------------+-----------------------+---------------------------------------------------------+ + | state | String | Job submission status. | + | | | | + | | | - **COMPLETE**: The job is submitted. | + | | | - **JOBSTAT_SUBMIT_FAILED**: Failed to submit the job. | + +-----------------------+-----------------------+---------------------------------------------------------+ + | error_msg | String | Error message | + +-----------------------+-----------------------+---------------------------------------------------------+ + | error_code | String | Error code | + +-----------------------+-----------------------+---------------------------------------------------------+ + +Example +------- + +- Example request + + The following is an example of an MapReduce job request: + + .. code-block:: + + { + "job_name":"MapReduceTest", + "job_type":"MapReduce", + "arguments":[ + "obs://obs-test/program/hadoop-mapreduce-examples-x.x.x.jar", + "wordcount", + "obs://obs-test/input/", + "obs://obs-test/job/mapreduce/output" + ], + "properties":{ + "fs.obs.endpoint":"obs endpoint", + "fs.obs.access.key":"xxx", + "fs.obs.secret.key":"yyy" + } + } + + The following is an example of a SparkSubmit job request: + + .. code-block:: + + { + "job_name":"SparkSubmitTest", + "job_type":"SparkSubmit", + "arguments":[ + "--master", + "yarn", + "--deploy-mode", + "cluster", + "--py-files", + "obs://obs-test/a.py", + "--conf", + "spark.yarn.appMasterEnv.PYTHONPATH=/tmp:$PYTHONPATH", + "--conf", + "spark.yarn.appMasterEnv.aaa=aaaa", + "--conf", + "spark.executorEnv.aaa=executoraaa", + "--properties-file", + "obs://obs-test/test-spark.conf", + "obs://obs-test/pi.py", + "100000" + ], + "properties":{ + "fs.obs.access.key":"xxx", + "fs.obs.secret.key":"yyy" + } + } + + The following is an example of a HiveScript job request: + + .. code-block:: + + { + "job_name":"HiveScriptTest", + "job_type":"HiveScript", + "arguments":[ + "obs://obs-test/sql/test_script.sql" + ], + "properties":{ + "fs.obs.endpoint":"obs endpoint", + "fs.obs.access.key":"xxx", + "fs.obs.secret.key":"yyy" + } + } + + The following is an example of a HiveSQL job request: + + .. code-block:: + + { + "job_name":"HiveSqlTest", + "job_type":"HiveSql", + "arguments":[ + "DROP TABLE IF EXISTS src_wordcount;create external table src_wordcount(line string);insert into src_wordcount values('v1')" + ], + "properties":{ + "fs.obs.endpoint":"obs endpoint", + "fs.obs.access.key":"xxx", + "fs.obs.secret.key":"yyy" + } + } + + The following is an example of a DistCp job request: + + .. code-block:: + + { + "job_name":"DistCpTest", + "job_type":"DistCp", + "arguments":[ + "obs://obs-test/DistcpJob/", + "/user/test/sparksql/" + ], + "properties":{ + "fs.obs.endpoint":"obs endpoint", + "fs.obs.access.key":"xxx", + "fs.obs.secret.key":"yyy" + } + } + + The following is an example of a SparkScript job request: + + .. code-block:: + + { + "job_name":"SparkScriptTest", + "job_type":"SparkScript", + "arguments":[ + "op-key1", + "op-value1", + "op-key2", + "op-value2", + "obs://obs-test/sql/test_script.sql" + ], + "properties":{ + "fs.obs.access.key":"xxx", + "fs.obs.secret.key":"yyy" + } + } + + The following is an example of a SparkSQL job request: + + .. code-block:: + + { + "job_name":"SparkSqlTest", + "job_type":"SparkSql", + "arguments":[ + "op-key1", + "op-value1", + "op-key2", + "op-value2", + "create table student_info3 (id string,name string,gender string,age int,addr string);" + ], + "properties":{ + "fs.obs.access.key":"xxx", + "fs.obs.secret.key":"yyy" + } + } + + The following is an example of a Flink job request: + + .. code-block:: + + { + "job_name":"FlinkTest", + "job_type":"Flink", + "arguments":[ + "run", + "-d", + "-ynm", + "testExcutorejobhdfsbatch", + "-m", + "yarn-cluster", + "hdfs://test/examples/batch/WordCount.jar" + ], + "properties":{ + "fs.obs.endpoint":"obs endpoint", + "fs.obs.access.key":"xxx", + "fs.obs.secret.key":"yyy" + } + } + +- Example response + + - Example of a successful response + + .. code-block:: + + { + "job_submit_result":{ + "job_id":"44b37a20-ffe8-42b1-b42b-78a5978d7e40", + "state":"COMPLETE" + } + } + + - Example of a failed response + + .. code-block:: + + { + "error_msg": Hive jobs cannot be submitted. + "error_code":"0168" + } + +Status Code +----------- + +For details about status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/job_object_apis_v2/deleting_jobs_in_batches.rst b/api-ref/source/apis/job_object_apis_v2/deleting_jobs_in_batches.rst new file mode 100644 index 0000000..7d137b9 --- /dev/null +++ b/api-ref/source/apis/job_object_apis_v2/deleting_jobs_in_batches.rst @@ -0,0 +1,79 @@ +:original_name: mrs_02_0089.html + +.. _mrs_02_0089: + +Deleting Jobs in Batches +======================== + +Function +-------- + +This API is used to delete APIs in batches. + +URI +--- + +- Format + + POST /v2/{project_id}/clusters/{cluster_id}/job-executions/batch-delete + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +============+===========+===================================================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------+ + | cluster_id | Yes | Cluster ID. For details on how to obtain the cluster ID, see :ref:`Obtaining a Cluster ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------+ + +Request +------- + +.. table:: **Table 2** Request parameter description + + +-------------+-----------+-------+--------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=============+===========+=======+======================================================================================================================================+ + | job_id_list | Yes | Array | List of job IDs. For details on how to obtain the list of job IDs, see :ref:`Obtaining a Job ID `. | + +-------------+-----------+-------+--------------------------------------------------------------------------------------------------------------------------------------+ + +Response +-------- + +**Response parameters** + +None + +Example +------- + +- Example request + + .. code-block:: + + { + "job_id_list": ["c23c1f53-5c8e-4eb8-ab2f-a6acff8ac369", "8f7969b6-d2fb-4442-9533-3fe7d7bdf31b"] + } + +- Example response + + - Example of a successful response + + None + + - Example of a failed response + + .. code-block:: + + { + "error_msg": "Failed to delete jobs in batches.", + "error_code":"0161" + } + +Status Code +----------- + +For details about status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/job_object_apis_v2/index.rst b/api-ref/source/apis/job_object_apis_v2/index.rst new file mode 100644 index 0000000..67707ae --- /dev/null +++ b/api-ref/source/apis/job_object_apis_v2/index.rst @@ -0,0 +1,24 @@ +:original_name: mrs_02_0084.html + +.. _mrs_02_0084: + +Job Object APIs (V2) +==================== + +- :ref:`Adding and Executing a Job ` +- :ref:`Querying Information About a Job ` +- :ref:`Querying a List of Jobs ` +- :ref:`Terminating a Job ` +- :ref:`Deleting Jobs in Batches ` +- :ref:`Obtain the SQL Result ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + adding_and_executing_a_job + querying_information_about_a_job + querying_a_list_of_jobs + terminating_a_job + deleting_jobs_in_batches + obtain_the_sql_result diff --git a/api-ref/source/apis/job_object_apis_v2/obtain_the_sql_result.rst b/api-ref/source/apis/job_object_apis_v2/obtain_the_sql_result.rst new file mode 100644 index 0000000..1ecdf92 --- /dev/null +++ b/api-ref/source/apis/job_object_apis_v2/obtain_the_sql_result.rst @@ -0,0 +1,115 @@ +:original_name: mrs_02_0090.html + +.. _mrs_02_0090: + +Obtain the SQL Result +===================== + +Function +-------- + +This API is used to obtain results returned after the SQL statements for querying SparkSQL and SparkScript jobs in an MRS cluster are executed. + +URI +--- + +- Format + + GET /v2/{project_id}/clusters/{cluster_id}/job-executions/{job_execution_id}/sql-result + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +==================+===========+===================================================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------+ + | cluster_id | Yes | Cluster ID. For details on how to obtain the cluster ID, see :ref:`Obtaining a Cluster ID `. | + +------------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------+ + | job_execution_id | Yes | Job ID. For details on how to obtain the job ID, see :ref:`Obtaining a Job ID `. | + +------------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------+ + +Request +------- + +**Request parameters** + +None + +Response +-------- + +.. table:: **Table 2** Response parameter description + + =========== ====== =========================== + Parameter Type Description + =========== ====== =========================== + sql-results Object SQL statement query result. + =========== ====== =========================== + +Example +------- + +- Example request + + .. code-block:: + + { + "job_name": "111", + "job_type": "SparkSql", + "arguments": [ + "create table src_wordcount (id int,name string); + show tables; + insert INTO src_wordcount VALUES (1, 'a'); + insert INTO src_wordcount VALUES (2, 'b');SELECT * FROM src_wordcount;" + ], + "properties": {} + } + +- Example response + + - Example of a successful response + + .. code-block:: + + { + "sql_results": { + "0": [{ + "result": "succeed" + }], + "1": [{ + "database": "default", + "isTemporary": "false", + "tableName": "src_wordcount" + }], + "2": [{ + "result": "succeed" + }], + "3": [{ + "result": "succeed" + }], + "4": [{ + "name": "a", + "id": "1" + }, { + "name": "b", + "id": "2" + }] + } + } + + - Example of a failed response + + .. code-block:: + + { + "error_msg": "Failed to collect SQL job results." + "error_code":"0172" + } + +Status Code +----------- + +For details about status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/job_object_apis_v2/querying_a_list_of_jobs.rst b/api-ref/source/apis/job_object_apis_v2/querying_a_list_of_jobs.rst new file mode 100644 index 0000000..0c5f050 --- /dev/null +++ b/api-ref/source/apis/job_object_apis_v2/querying_a_list_of_jobs.rst @@ -0,0 +1,225 @@ +:original_name: mrs_02_0087.html + +.. _mrs_02_0087: + +Querying a List of Jobs +======================= + +Function +-------- + +This API is used to query the job list in an MRS cluster. + +URI +--- + +- Format + + GET /v2/{project_id}/clusters/{cluster_id}/job-executions + +- Parameter description + + .. table:: **Table 1** URI parameter + + +------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------+ + | Name | Mandatory | Description | + +============+===========+===================================================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------+ + | cluster_id | Yes | Cluster ID. For details on how to obtain the cluster ID, see :ref:`Obtaining a Cluster ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------+ + +Request +------- + +.. table:: **Table 2** Request parameter description + + +----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +======================+=================+=================+===============================================================================================================+ + | job_name | No | String | Job name. It contains 1 to 64 characters. Only letters, digits, hyphens (-), and underscores (_) are allowed. | + +----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------+ + | job_type | No | String | Type of a job. | + | | | | | + | | | | - MapReduce | + | | | | - SparkSubmit | + | | | | - HiveScript | + | | | | - HiveSql | + | | | | - DistCp, importing and exporting data | + | | | | - SparkScript | + | | | | - SparkSql | + | | | | - Flink | + +----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------+ + | job_state | No | String | Execution status of a job. | + | | | | | + | | | | - **FAILED**: indicates that the job fails to be executed. | + | | | | - **KILLED**: indicates that the job is terminated. | + | | | | - **New**: indicates that the job is created. | + | | | | - **NEW_SAVING**: indicates that the job has been created and is being saved. | + | | | | - **SUBMITTED**: indicates that the job is submitted. | + | | | | - **ACCEPTED**: indicates that the job is accepted. | + | | | | - **RUNNING**: indicates that the job is running. | + | | | | - **FINISHED**: indicates that the job is completed. | + +----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------+ + | job_result | No | String | Execution result of a job. | + | | | | | + | | | | - **FAILED**: indicates that the job fails to be executed. | + | | | | - **KILLED**: indicates that the job is manually terminated during execution. | + | | | | - **UNDEFINED**: indicates that the job is being executed. | + | | | | - **SUCCEEDED**: indicates that the job has been successfully executed. | + +----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------+ + | limit | No | Integer | Number of records displayed on each page in the returned result. The default value is **10**. | + +----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------+ + | offset | No | Integer | Offset. | + | | | | | + | | | | The default offset from which the job list starts to be queried is **1**. | + +----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------+ + | sort_by | No | String | Ranking mode of returned results. The default value is **desc**. | + | | | | | + | | | | - **asc**: indicates that the returned results are ranked in ascending order. | + | | | | - **desc**: indicates that the returned results are ranked in descending order. | + +----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------+ + | submitted_time_begin | No | TimeStamp | UTC timestamp after which a job is submitted, in milliseconds. For example, 1562032041362. | + +----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------+ + | submitted_time_end | No | TimeStamp | UTC timestamp before which a job is submitted, in milliseconds. For example, 1562032041362. | + +----------------------+-----------------+-----------------+---------------------------------------------------------------------------------------------------------------+ + +Response +-------- + +.. table:: **Table 3** Response parameter description + + +--------------+---------+-----------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +==============+=========+===============================================================================================+ + | total_record | Integer | Total number of jobs | + +--------------+---------+-----------------------------------------------------------------------------------------------+ + | job_list | Array | Job list. For details about the parameter, see :ref:`Table 4 `. | + +--------------+---------+-----------------------------------------------------------------------------------------------+ + +.. _mrs_02_0087__table9145123857: + +.. table:: **Table 4** Job parameter description + + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+================================================================================================================================================================================================================+ + | job_id | String | Job ID | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | user | String | Name of the user who submits a job. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_name | String | Job name. It contains 1 to 64 characters. Only letters, digits, hyphens (-), and underscores (_) are allowed. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_result | String | Final result of a job. | + | | | | + | | | - **FAILED**: indicates that the job fails to be executed. | + | | | - **KILLED**: indicates that the job is manually terminated during execution. | + | | | - **UNDEFINED**: indicates that the job is being executed. | + | | | - **SUCCEEDED**: indicates that the job has been successfully executed. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_state | String | Execution status of a job. | + | | | | + | | | - **FAILED**: indicates that the job fails to be executed. | + | | | - **KILLED**: indicates that the job is terminated. | + | | | - **New**: indicates that the job is created. | + | | | - **NEW_SAVING**: indicates that the job has been created and is being saved. | + | | | - **SUBMITTED**: indicates that the job is submitted. | + | | | - **ACCEPTED**: indicates that the job is accepted. | + | | | - **RUNNING**: indicates that the job is running. | + | | | - **FINISHED**: indicates that the job is completed. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_progress | Float | Job execution progress. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_type | String | Type of a job. | + | | | | + | | | - MapReduce | + | | | - SparkSubmit | + | | | - HiveScript | + | | | - HiveSql | + | | | - DistCp, importing and exporting data | + | | | - SparkScript | + | | | - SparkSql | + | | | - Flink | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | started_time | Long | Start time to run a job. Unit: milliseconds | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | submitted_time | Long | Time when a job is submitted. Unit: milliseconds | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | finished_time | Long | End time to run a job. Unit: milliseconds | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | elapsed_time | Long | Running duration of a job. Unit: milliseconds | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | arguments | Array | Run parameters. The parameter contains a maximum of 4,096 characters, excluding special characters such as ``;|&>'<$,`` and can be left blank. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | properties | Object | Configuration parameter, which is used to configure **-d** parameters. The parameter contains a maximum of 2,048 characters, excluding special characters such as :literal:`><|'`&!\\,` and can be left blank. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | launcher_id | String | Launcher job ID. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | app_id | String | Actual job ID. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + + None. + +- Example response + + - Example of a successful response + + .. code-block:: + + { + "total_record": 2, + "job_list": [{ + "job_id": "981374c1-85da-44ee-be32-edfb4fba776c", + "user": "xxxx", + "job_name": "SparkSubmitTset", + "job_result": "UNDEFINED", + "job_state": "ACCEPTED", + "job_progress": 0, + "job_type": "SparkSubmit", + "started_time": 0, + "submitted_time": 1564714763119, + "finished_time": 0, + "elapsed_time": 0, + "queue": "default", + "arguments": "[--class, --driver-memory, --executor-cores, --master, yarn-cluster, obs://obs-test/hadoop-mapreduce-examples-3.1.1.jar, dddd]", + "launcher_id": "application_1564622673393_0613", + "properties": "{}" + }, + { + "job_id": "c54c8aa0-c277-4f83-8acc-521d85cfa32b", + "user": "xxxx", + "job_name": "SparkSubmitTset2", + "job_result": "UNDEFINED", + "job_state": "ACCEPTED", + "job_progress": 0, + "job_type": "SparkSubmit", + "started_time": 0, + "submitted_time": 1564714020099, + "finished_time": 0, + "elapsed_time": 0, + "queue": "default", + "arguments": "[--conf, yujjsjhe, --driver-memory, yueujdjjd, --master, yarn-cluster, obs://obs-test/hadoop-mapreduce-examples-3.1.1.jar]", + "launcher_id": "application_1564622673393_0611", + "properties": "{}" + } + ] + } + + - Example of a failed response + + .. code-block:: + + { + "error_msg": "Failed to query the job list." + "error_code":"0166" + } + +Status Code +----------- + +For details about status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/job_object_apis_v2/querying_information_about_a_job.rst b/api-ref/source/apis/job_object_apis_v2/querying_information_about_a_job.rst new file mode 100644 index 0000000..58987af --- /dev/null +++ b/api-ref/source/apis/job_object_apis_v2/querying_information_about_a_job.rst @@ -0,0 +1,159 @@ +:original_name: mrs_02_0086.html + +.. _mrs_02_0086: + +Querying Information About a Job +================================ + +Function +-------- + +This API is used to query information about a specified job in an MRS cluster. + +URI +--- + +- Format + + GET /v2/{project_id}/clusters/{cluster_id}/job-executions/{job_execution_id} + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +==================+===========+===================================================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------+ + | cluster_id | Yes | Cluster ID. For details on how to obtain the cluster ID, see :ref:`Obtaining a Cluster ID `. | + +------------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------+ + | job_execution_id | Yes | Job ID. For details on how to obtain the job ID, see :ref:`Obtaining a Job ID `. | + +------------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------+ + +Request +------- + +**Request parameters** + +None. + +Response +-------- + +.. table:: **Table 2** Response parameter description + + +------------+--------+------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +============+========+======================================================================================================+ + | job_detail | Object | Job details. For details about the parameter, see :ref:`Table 3 `. | + +------------+--------+------------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0086__table12040613193927: + +.. table:: **Table 3** Job parameter description + + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=======================+=======================+================================================================================================================================================================================================================+ + | job_id | String | Job ID. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | user | String | Name of the user who submits a job. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_name | String | Job name. It contains 1 to 64 characters. Only letters, digits, hyphens (-), and underscores (_) are allowed. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_result | String | Final result of a job. | + | | | | + | | | - **FAILED**: indicates that the job fails to be executed. | + | | | - **KILLED**: indicates that the job is manually terminated during execution. | + | | | - **UNDEFINED**: indicates that the job is being executed. | + | | | - **SUCCEEDED**: indicates that the job has been successfully executed. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_state | String | Execution status of a job. | + | | | | + | | | - FAILED: failed | + | | | - **KILLED**: indicates that the job is terminated. | + | | | - **New**: indicates that the job is created. | + | | | - **NEW_SAVING**: indicates that the job has been created and is being saved. | + | | | - **SUBMITTED**: indicates that the job is submitted. | + | | | - **ACCEPTED**: indicates that the job is accepted. | + | | | - **RUNNING**: indicates that the job is running. | + | | | - **FINISHED**: indicates that the job is completed. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_progress | Float | Job execution progress. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | job_type | String | Type of a job. | + | | | | + | | | - MapReduce | + | | | - SparkSubmit | + | | | - HiveScript | + | | | - HiveSql | + | | | - DistCp, importing and exporting data | + | | | - SparkScript | + | | | - SparkSql | + | | | - Flink | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | started_time | Long | Start time to run a job. Unit: ms. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | submitted_time | Long | Time when a job is submitted. Unit: ms. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | finished_time | Long | End time to run a job. Unit: ms. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | elapsed_time | Long | Running duration of a job. Unit: ms. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | arguments | Array | Running parameter. The parameter contains a maximum of 4,096 characters, excluding special characters such as ``;|&>'<$,`` and can be left blank. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | properties | Object | Configuration parameter, which is used to configure **-d** parameters. The parameter contains a maximum of 2,048 characters, excluding special characters such as :literal:`><|'`&!\\,` and can be left blank. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | launcher_id | String | Launcher job ID. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | app_id | String | Actual job ID. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + + None. + +- Example response + + - Example of a successful response + + .. code-block:: + + { + "job_detail": { + "job_id": "431b135e-c090-489f-b1db-0abe3822b855", + "user": "xxxx", + "job_name": "pyspark1", + "job_result": "SUCCEEDED", + "job_state": "FINISHED", + "job_progress": 100, + "job_type": "SparkSubmit", + "started_time": 1564626578817, + "submitted_time": 1564626561541, + "finished_time": 1564626664930, + "elapsed_time": 86113, + "queue": "default", + "arguments": "[--class, org.apache.spark.examples.SparkPi, --driver-memory, 512MB, --num-executors, 1, --executor-cores, 1, --master, yarn-cluster, obs://obs-test/jobs/spark/spark-examples_2.11-2.1.0.jar, 10000]", + "launcher_id": "application_1564622673393_0006", + "app_id": "application_1564622673393_0007", + "properties": "{}" + } + } + + - Example of a failed response + + .. code-block:: + + { + "error_msg": "Failed to query the job." + "error_code":"0162" + } + +Status Code +----------- + +For details about status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/job_object_apis_v2/terminating_a_job.rst b/api-ref/source/apis/job_object_apis_v2/terminating_a_job.rst new file mode 100644 index 0000000..5ae1f09 --- /dev/null +++ b/api-ref/source/apis/job_object_apis_v2/terminating_a_job.rst @@ -0,0 +1,85 @@ +:original_name: mrs_02_0088.html + +.. _mrs_02_0088: + +Terminating a Job +================= + +Function +-------- + +This API is used to terminate a specified job in an MRS cluster. + +URI +--- + +- Format + + POST /v2/{project_id}/clusters/{cluster_id}/job-executions/{job_execution_id}/kill + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +==================+===========+===================================================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------+ + | cluster_id | Yes | Cluster ID. For details on how to obtain the cluster ID, see :ref:`Obtaining a Cluster ID `. | + +------------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------+ + | job_execution_id | Yes | Job ID. For details on how to obtain the job ID, see :ref:`Obtaining a Job ID `. | + +------------------+-----------+-----------------------------------------------------------------------------------------------------------------------------------+ + +Request +------- + +**Request parameters** + +None + +Response +-------- + +**Response parameters** + +None + +Example +------- + +- Example request + + None + +- Example response + + - Example of a successful response + + None + + - Example of a failed response + + .. code-block:: + + { + "error_msg": "Failed to terminate the job." + "error_code":"0175" + } + +Status Code +----------- + +:ref:`Table 2 ` describes status codes. + +.. _mrs_02_0088__table1584477916050: + +.. table:: **Table 2** Status code + + =========== =========================================================== + Status Code Description + =========== =========================================================== + 202 The job termination request has been accepted. Please wait. + =========== =========================================================== + +For details about status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/apis/tag_management_apis/adding_a_tag_to_a_specified_cluster.rst b/api-ref/source/apis/tag_management_apis/adding_a_tag_to_a_specified_cluster.rst new file mode 100644 index 0000000..a59b051 --- /dev/null +++ b/api-ref/source/apis/tag_management_apis/adding_a_tag_to_a_specified_cluster.rst @@ -0,0 +1,86 @@ +:original_name: mrs_02_0071.html + +.. _mrs_02_0071: + +Adding a Tag to a Specified Cluster +=================================== + +Function +-------- + +This API is used to add a tag to a specified cluster. + +A cluster has a maximum of 10 tags. This API is idempotent. If a tag to be created has the same key as an existing tag, the tag will overwrite the existing one. + +URI +--- + +- Format + + POST /v1.1/{project_id}/clusters/{cluster_id}/tags + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | cluster_id | Yes | Cluster ID | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +.. table:: **Table 2** **tags** parameter description + + +-----------+-----------+--------+-------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +===========+===========+========+=========================================================================================================================+ + | key | Yes | String | Key. A tag key can contain only uppercase letters, lowercase letters, digits, hyphens (-), and underscores (_). | + +-----------+-----------+--------+-------------------------------------------------------------------------------------------------------------------------+ + | value | Yes | String | Tag value. A tag value can contain only uppercase letters, lowercase letters, digits, hyphens (-), and underscores (_). | + +-----------+-----------+--------+-------------------------------------------------------------------------------------------------------------------------+ + +Response +-------- + +**Response parameters** + +None. + +Example +------- + +- Example request + +.. code-block:: + + { + "tag": + { + "key":"DEV", + "value":"DEV1" + } + } + +- Example response + + None. + +Status Code +----------- + +:ref:`Table 3 ` describes the status code of this API. + +.. _mrs_02_0071__t853eb843894541af90b6f0a45bbc833f: + +.. table:: **Table 3** Status code + + =========== ============================ + Status Code Description + =========== ============================ + 204 The operation is successful. + =========== ============================ diff --git a/api-ref/source/apis/tag_management_apis/adding_or_deleting_cluster_tags_in_batches.rst b/api-ref/source/apis/tag_management_apis/adding_or_deleting_cluster_tags_in_batches.rst new file mode 100644 index 0000000..bc1d6f9 --- /dev/null +++ b/api-ref/source/apis/tag_management_apis/adding_or_deleting_cluster_tags_in_batches.rst @@ -0,0 +1,114 @@ +:original_name: mrs_02_0074.html + +.. _mrs_02_0074: + +Adding or Deleting Cluster Tags in Batches +========================================== + +Function +-------- + +This API is used to add or delete tags to or from a specified cluster in batches. + +You can add a maximum of 10 tags to a cluster. + +This API is idempotent. + +- If a tag to be created has the same key as an existing tag in a cluster, the tag will overwrite the existing one. +- When tags are being deleted and some tags do not exist, the operation is considered successful by default. The character set of the tags will not be checked. A key and a value can respectively contain up to 36 and 43 Unicode characters. When tags are deleted, the tag structure body cannot be missing, and the key cannot be left blank or set to an empty string. + +URI +--- + +- Format + + POST /v1.1/{project_id}/clusters/{cluster_id}/tags/action + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | cluster_id | Yes | Cluster ID | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +.. table:: **Table 2** Request parameter description + + +-----------+-----------+--------------------+----------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +===========+===========+====================+====================================================================================================+ + | action | Yes | String | Operation to be performed. The value can be set to **create** or **delete** only. | + +-----------+-----------+--------------------+----------------------------------------------------------------------------------------------------+ + | tags | Yes | List | Tag list. For details about the parameter, see :ref:`Table 3 `. | + +-----------+-----------+--------------------+----------------------------------------------------------------------------------------------------+ + +.. _mrs_02_0074__table102451749203418: + +.. table:: **Table 3** **tags** parameter description + + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=========================================================================================================================+ + | key | Yes | String | Key. A tag key can contain only uppercase letters, lowercase letters, digits, hyphens (-), and underscores (_). | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------+ + | value | Yes | String | Tag value. A tag value can contain only uppercase letters, lowercase letters, digits, hyphens (-), and underscores (_). | + | | | | | + | | | | Note: | + | | | | | + | | | | - This parameter is mandatory for adding a tag. | + | | | | - This parameter is optional for deleting a tag. | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------+ + +Response +-------- + +**Response parameters** + +None. + +Example +------- + +- Example request + +.. code-block:: + + { + "action": "create", + "tags": [ + { + "key": "key1", + "value": "value1" + }, + { + "key": "key", + "value": "value3" + } + ] + } + +- Example response + + None. + +Status Code +----------- + +:ref:`Table 4 ` describes the status code of this API. + +.. _mrs_02_0074__t8387a0fadf974df1925645625284999c: + +.. table:: **Table 4** Status code + + =========== ============================ + Status Code Description + =========== ============================ + 204 The operation is successful. + =========== ============================ diff --git a/api-ref/source/apis/tag_management_apis/deleting_a_tag_of_a_specified_cluster.rst b/api-ref/source/apis/tag_management_apis/deleting_a_tag_of_a_specified_cluster.rst new file mode 100644 index 0000000..fc9ef63 --- /dev/null +++ b/api-ref/source/apis/tag_management_apis/deleting_a_tag_of_a_specified_cluster.rst @@ -0,0 +1,70 @@ +:original_name: mrs_02_0072.html + +.. _mrs_02_0072: + +Deleting a Tag of a Specified Cluster +===================================== + +Function +-------- + +This API is used to delete a tag of a specified cluster. + +URI +--- + +- Format + + DELETE /v1.1/{project_id}/clusters/{cluster_id}/tags/{key} + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | cluster_id | Yes | Cluster ID | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +**Request parameters** + +None. + +Response +-------- + +**Response parameters** + +None + +Example +------- + +- Example request + + None. + +- Example response + + None + +Status Code +----------- + +:ref:`Table 2 ` describes the status code of this API. + +.. _mrs_02_0072__t72c4159e310d449696ec7ba265e3428e: + +.. table:: **Table 2** Status code + + =========== ============================ + Status Code Description + =========== ============================ + 204 The operation is successful. + =========== ============================ diff --git a/api-ref/source/apis/tag_management_apis/index.rst b/api-ref/source/apis/tag_management_apis/index.rst new file mode 100644 index 0000000..119ee2d --- /dev/null +++ b/api-ref/source/apis/tag_management_apis/index.rst @@ -0,0 +1,24 @@ +:original_name: mrs_02_0070.html + +.. _mrs_02_0070: + +Tag Management APIs +=================== + +- :ref:`Adding a Tag to a Specified Cluster ` +- :ref:`Deleting a Tag of a Specified Cluster ` +- :ref:`Querying Tags of a Specified Cluster ` +- :ref:`Adding or Deleting Cluster Tags in Batches ` +- :ref:`Querying All Tags ` +- :ref:`Querying a List of Clusters with Specified Tags ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + adding_a_tag_to_a_specified_cluster + deleting_a_tag_of_a_specified_cluster + querying_tags_of_a_specified_cluster + adding_or_deleting_cluster_tags_in_batches + querying_all_tags + querying_a_list_of_clusters_with_specified_tags diff --git a/api-ref/source/apis/tag_management_apis/querying_a_list_of_clusters_with_specified_tags.rst b/api-ref/source/apis/tag_management_apis/querying_a_list_of_clusters_with_specified_tags.rst new file mode 100644 index 0000000..719dc34 --- /dev/null +++ b/api-ref/source/apis/tag_management_apis/querying_a_list_of_clusters_with_specified_tags.rst @@ -0,0 +1,276 @@ +:original_name: mrs_02_0076.html + +.. _mrs_02_0076: + +Querying a List of Clusters with Specified Tags +=============================================== + +Function +-------- + +This API is used to filter clusters by tag. + +By default, clusters and tags are sorted in descending order of creation time. + +URI +--- + +- Format + + POST /v1.1/{project_id}/clusters/resource_instances/action + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +.. table:: **Table 2** Request parameter description + + +-----------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================+ + | tags | No | List | The return result contains resources corresponding to all tags in this parameter. This parameter contains a maximum of 10 keys, and each key contains a maximum of 10 values. The structure body cannot be missing, and the key cannot be left blank or set to an empty string. | + +-----------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | tags_any | No | List | The return result contains resources corresponding to any tag in this parameter. This parameter contains a maximum of 10 keys, and each key contains a maximum of 10 values. The structure body cannot be missing, and the key cannot be left blank or set to an empty string. Keys must be unique and values of a key must be unique. | + +-----------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | not_tags | No | List | The return result does not contain resources corresponding to all tags in this parameter. This parameter contains a maximum of 10 keys, and each key contains a maximum of 10 values. The structure body cannot be missing, and the key cannot be left blank or set to an empty string. Keys must be unique and values of a key must be unique. | + +-----------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | not_tags_any | No | List | The return result does not contain resources corresponding to any tag in this parameter. This parameter contains a maximum of 10 keys, and each key contains a maximum of 10 values. The structure body cannot be missing, and the key cannot be left blank or set to an empty string. Keys must be unique and values of a key must be unique. | + +-----------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | limit | No | String | Number of records. This parameter is not available when **action** is set to **count**. The default value is **1000** when **action** is set to **filter**. The maximum value is **1000**, and the minimum value is **1**. The value cannot be a negative number. | + +-----------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | offset | No | String | Index position. The query starts from the next piece of data specified by the **offset** parameter. This parameter is not required when you query data on the first page. The value in the response body returned for querying data on the previous page will be included in this parameter for querying data on subsequent pages. This parameter is not available when **action** is set to **count**. If **action** is set to **filter**, the value must be a number, and the default value is **0**. The value cannot be a negative number. | + +-----------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | action | Yes | String | Operation to be performed. The value can be **filter** or **count**. | + | | | | | + | | | | The value **filter** indicates pagination query. The value **count** indicates that the total number of query results meeting the search criteria will be returned. | + +-----------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | matches | No | List | Search field. **key** indicates the field to be matched, for example, **resource_name**. **value** indicates the matched value. This field is a fixed dictionary value. | + | | | | | + | | | | Determine whether fuzzy match is required based on different fields. For example, if **key** is **resource_name**, fuzzy search is used by default. If **value** is an empty string, exact match is used. | + +-----------------+-----------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. table:: **Table 3** **tag** field description + + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +=================+=================+=================+=================================================================================================================================================+ + | key | Yes | String | Key. It contains a maximum of 127 Unicode characters. It cannot be left empty. (This parameter is not verified in the search process.) | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ + | values | Yes | List | List of values. A value contains a maximum of 255 Unicode characters. | + | | | | | + | | | | If the values are null, it indicates **any_value**. The relationship between values is OR. By default, only the first value is used for search. | + +-----------------+-----------------+-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. table:: **Table 4** **match** field description + + +-----------+-----------+--------+-----------------------------------------------------------------------------------+ + | Parameter | Mandatory | Type | Description | + +===========+===========+========+===================================================================================+ + | key | Yes | String | Key. The value is fixed to **resource_name**, indicating a cluster name. | + +-----------+-----------+--------+-----------------------------------------------------------------------------------+ + | value | Yes | String | Value. A value contains a maximum of 64 Unicode characters. Enter a cluster name. | + +-----------+-----------+--------+-----------------------------------------------------------------------------------+ + +Response +-------- + +.. table:: **Table 5** Response parameter description + + +-------------+------------------+-----------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=============+==================+===================================================================================+ + | resources | Array of objects | Resource details. For details, see :ref:`Table 6 `. | + +-------------+------------------+-----------------------------------------------------------------------------------+ + | total_count | Integer | Total number of resources. | + +-------------+------------------+-----------------------------------------------------------------------------------+ + +.. _mrs_02_0076__table5936005416: + +.. table:: **Table 6** **resources** parameters + + +-----------------+---------+------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +=================+=========+==============================================================================+ + | resource_detail | String | Resource details. | + +-----------------+---------+------------------------------------------------------------------------------+ + | resource_id | String | Resource ID. | + +-----------------+---------+------------------------------------------------------------------------------+ + | resource_name | String | Resource name. | + +-----------------+---------+------------------------------------------------------------------------------+ + | tags | objects | Tag list. For details, see :ref:`Table 7 `. | + +-----------------+---------+------------------------------------------------------------------------------+ + +.. _mrs_02_0076__table1897413881916: + +.. table:: **Table 7** **tags** parameter description + + +-----------+--------+-------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +===========+========+=========================================================================================================================+ + | key | String | Key. A tag key can contain only uppercase letters, lowercase letters, digits, hyphens (-), and underscores (_). | + +-----------+--------+-------------------------------------------------------------------------------------------------------------------------+ + | value | String | Tag value. A tag value can contain only uppercase letters, lowercase letters, digits, hyphens (-), and underscores (_). | + +-----------+--------+-------------------------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + + Request body when **action** is set to **filter** + + .. code-block:: + + { + "offset": "100", + "limit": "100", + "action": "filter", + "matches":[ + { + "key": "resource_name", + "value": "clusterA" + } + ], + "not_tags": [ + { + "key": "key1", + "values": [ + "value1", + "value2" + ] + } + ], + "tags": [ + { + "key": "key1", + "values": [ + "value1", + "value2" + ] + } + ], + "tags_any": [ + { + "key": "key1", + "values": [ + "value1", + "value2" + ] + } + ], + "not_tags_any": [ + { + "key": "key1", + "values": [ + "value1", + "value2" + ] + } + ] + } + + Request body when **action** is set to **count** + + .. code-block:: + + { + "action": "count", + "not_tags": [ + { + "key": "key1", + "values": [ + "value1", + "value2" + ] + } + ], + "tags": [ + { + "key": "key1", + "values": [ + "value1", + "value2" + ] + }, + { + "key": "key2", + "values": [ + "value1", + "value2" + ] + } + ], + "tags_any": [ + { + "key": "key1", + "values": [ + "value1", + "value2" + ] + } + ], + "not_tags_any": [ + { + "key": "key1", + "values": [ + "value1", + "value2" + ] + } + ], + "matches":[ + { + "key": "resource_name", + "value": "clusterA" + } + ] + } + +- Example response + + Response body when **action** is set to **filter** + + .. code-block:: + + { + "resources": [ + { + "resource_detail": null, + "resource_id": "cdfs_cefs_wesas_12_dsad", + "resource_name": "clusterA" + } + ] + "total_count": 1000 + } + + Response body when **action** is set to **count** + + .. code-block:: + + { + "total_count": 1000 + } + +Status Code +----------- + +:ref:`Table 8 ` describes the status code of this API. + +.. _mrs_02_0076__t31bfd33136f84cd88b311dc479046586: + +.. table:: **Table 8** Status code + + =========== ============================ + Status Code Description + =========== ============================ + 200 The operation is successful. + =========== ============================ diff --git a/api-ref/source/apis/tag_management_apis/querying_all_tags.rst b/api-ref/source/apis/tag_management_apis/querying_all_tags.rst new file mode 100644 index 0000000..8392f12 --- /dev/null +++ b/api-ref/source/apis/tag_management_apis/querying_all_tags.rst @@ -0,0 +1,103 @@ +:original_name: mrs_02_0075.html + +.. _mrs_02_0075: + +Querying All Tags +================= + +Function +-------- + +This API is used to query all tag sets of a specified region. + +URI +--- + +- Format + + GET /v1.1/{project_id}/clusters/tags + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +**Request parameters** + +None. + +Response +-------- + +.. table:: **Table 2** Response parameter description + + +-----------+------------------+----------------------------------------------------------------------------+ + | Parameter | Type | Description | + +===========+==================+============================================================================+ + | tags | Array of objects | Tag list. For details, see :ref:`Table 3 `. | + +-----------+------------------+----------------------------------------------------------------------------+ + +.. _mrs_02_0075__table45211674182: + +.. table:: **Table 3** **tags** parameter description + + +-----------+--------+-------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +===========+========+=========================================================================================================================+ + | key | String | Tag key. A tag key can contain only uppercase letters, lowercase letters, digits, hyphens (-), and underscores (_). | + +-----------+--------+-------------------------------------------------------------------------------------------------------------------------+ + | value | String | Tag value. A tag value can contain only uppercase letters, lowercase letters, digits, hyphens (-), and underscores (_). | + +-----------+--------+-------------------------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + +None. + +- Example response + +.. code-block:: + + { + "tags": [ + { + "key": "key1", + "values": [ + "value1", + "value2" + ] + }, + { + "key": "key2", + "values": [ + "value1", + "value2" + ] + } + ] + } + +Status Code +----------- + +:ref:`Table 4 ` describes the status code of this API. + +.. _mrs_02_0075__tb472a78155014ba18b372672dd8358e7: + +.. table:: **Table 4** Status code + + =========== ============================ + Status Code Description + =========== ============================ + 200 The operation is successful. + =========== ============================ diff --git a/api-ref/source/apis/tag_management_apis/querying_tags_of_a_specified_cluster.rst b/api-ref/source/apis/tag_management_apis/querying_tags_of_a_specified_cluster.rst new file mode 100644 index 0000000..665c54e --- /dev/null +++ b/api-ref/source/apis/tag_management_apis/querying_tags_of_a_specified_cluster.rst @@ -0,0 +1,99 @@ +:original_name: mrs_02_0073.html + +.. _mrs_02_0073: + +Querying Tags of a Specified Cluster +==================================== + +Function +-------- + +This API is used to query tags of a specified cluster. + +URI +--- + +- Format + + GET /v1.1/{project_id}/clusters/{cluster_id}/tags + +- Parameter description + + .. table:: **Table 1** URI parameter description + + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory | Description | + +============+===========+===========================================================================================================+ + | project_id | Yes | Project ID. For details on how to obtain the project ID, see :ref:`Obtaining a Project ID `. | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + | cluster_id | Yes | Cluster ID | + +------------+-----------+-----------------------------------------------------------------------------------------------------------+ + +Request +------- + +**Request parameters** + +None. + +Response +-------- + +.. table:: **Table 2** Response parameter description + + +-----------+------------------+----------------------------------------------------------------------------+ + | Parameter | Type | Description | + +===========+==================+============================================================================+ + | tags | Array of objects | Tag list. For details, see :ref:`Table 3 `. | + +-----------+------------------+----------------------------------------------------------------------------+ + +.. _mrs_02_0073__table16429741613: + +.. table:: **Table 3** **tags** parameter description + + +-----------+--------+-------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Type | Description | + +===========+========+=========================================================================================================================+ + | key | String | Key. A tag key can contain only uppercase letters, lowercase letters, digits, hyphens (-), and underscores (_). | + +-----------+--------+-------------------------------------------------------------------------------------------------------------------------+ + | value | String | Tag value. A tag value can contain only uppercase letters, lowercase letters, digits, hyphens (-), and underscores (_). | + +-----------+--------+-------------------------------------------------------------------------------------------------------------------------+ + +Example +------- + +- Example request + + None. + +- Example response + + .. code-block:: + + { + "tags": [ + { + "key": "key1", + "value": "value1" + }, + { + "key": "key2", + "value": "value3" + } + ] + } + +Status Code +----------- + +:ref:`Table 4 ` describes the status code of this API. + +.. _mrs_02_0073__t8879ab801c3841179c9f683931ddb28e: + +.. table:: **Table 4** Status code + + =========== ============================ + Status Code Description + =========== ============================ + 200 The operation is successful. + =========== ============================ diff --git a/api-ref/source/appendix/ecs_specifications_used_by_mrs.rst b/api-ref/source/appendix/ecs_specifications_used_by_mrs.rst new file mode 100644 index 0000000..a545ed1 --- /dev/null +++ b/api-ref/source/appendix/ecs_specifications_used_by_mrs.rst @@ -0,0 +1,173 @@ +:original_name: mrs_01_9005.html + +.. _mrs_01_9005: + +ECS Specifications Used by MRS +============================== + +MRS uses ECSs of the following types in different application scenarios. + +- General computing (S1) +- General computing (S3) +- General computing (C2) +- General computing-plus (C3) +- General computing-plus (C4) +- General computing-plus (C6) +- Disk-intensive (D1) +- Disk-intensive (D2) +- High-performance computing (H1) +- Memory-optimized (M3) +- Memory-optimized (M4) + +ECS Flavor Naming Rules +----------------------- + +AB.C.D + +Example: m3.8xlarge.8 + +In the preceding flavor: + +- **A** specifies the ECS type. For example, **s** indicates a general-purpose ECS, **c** a computing ECS, and **m** a memory-optimized ECS. +- **B** specifies the type ID. For example, the **1** in **s1** indicates a general-purpose first-generation ECS, and the **2** in **s2** indicates a general-purpose second-generation ECS. +- **C** specifies a flavor size and can be any of the following options: medium, large, and xlarge. +- **D** specifies the ratio of memory to vCPUs expressed in a digit. For example, value **4** indicates that the ratio of memory to vCPUs is 4. + +Specifications +-------------- + +.. table:: **Table 1** S1 ECS specifications + + ==== ===== =========== ==================== =================== + Type vCPUs Memory (GB) Flavor Virtualization Type + ==== ===== =========== ==================== =================== + S1 4 16 s1.xlarge.linux.mrs XEN + \ 16 64 s1.4xlarge.linux.mrs XEN + \ 32 128 s1.8xlarge.linux.mrs XEN + ==== ===== =========== ==================== =================== + +.. table:: **Table 2** S3 ECS specifications + + ==== ===== =========== ====================== =================== + Type vCPUs Memory (GB) Flavor Virtualization Type + ==== ===== =========== ====================== =================== + S3 4 8 s3.xlarge.2.linux.mrs XEN + \ 4 16 s3.xlarge.4.linux.mrs XEN + \ 8 16 s3.2xlarge.2.linux.mrs XEN + \ 8 32 s3.2xlarge.4.linux.mrs XEN + \ 16 32 s3.4xlarge.2.linux.mrs XEN + ==== ===== =========== ====================== =================== + +.. table:: **Table 3** C2 ECS specifications + + ==== ===== =========== ==================== =================== + Type vCPUs Memory (GB) Flavor Virtualization Type + ==== ===== =========== ==================== =================== + C2 8 16 c2.2xlarge.linux.mrs KVM + \ 16 32 c2.4xlarge.linux.mrs KVM + ==== ===== =========== ==================== =================== + +.. table:: **Table 4** General computing-plus (C3) ECS specifications + + ==== ===== =========== ======================= =================== + Type vCPUs Memory (GB) Flavor Virtualization Type + ==== ===== =========== ======================= =================== + C3 8 16 c3.2xlarge.2.linux.mrs KVM + \ 4 16 c3.xlarge.4.linux.mrs KVM + \ 8 32 c3.2xlarge.4.linux.mrs KVM + \ 16 32 c3.4xlarge.2.linux.mrs KVM + \ 16 64 c3.4xlarge.4.linux.mrs KVM + \ 32 128 c3.8xlarge.4.linux.mrs KVM + \ 60 256 c3.15xlarge.4.linux.mrs KVM + ==== ===== =========== ======================= =================== + +.. table:: **Table 5** C4 ECS specifications + + ==== ===== =========== ======================= =================== + Type vCPUs Memory (GB) Flavor Virtualization Type + ==== ===== =========== ======================= =================== + C4 4 16 c4.xlarge.4.linux.mrs KVM + \ 8 16 c4.2xlarge.2.linux.mrs KVM + \ 8 32 c4.2xlarge.4.linux.mrs KVM + \ 16 32 c4.4xlarge.2.linux.mrs KVM + \ 16 64 c4.4xlarge.4.linux.mrs KVM + \ 32 64 c4.8xlarge.2.linux.mrs KVM + \ 32 128 c4.8xlarge.4.linux.mrs KVM + \ 64 256 c4.16xlarge.4.linux.mrs KVM + ==== ===== =========== ======================= =================== + +.. table:: **Table 6** C6 ECS specifications + + ==== ===== =========== ======================= =================== + Type vCPUs Memory (GB) Flavor Virtualization Type + ==== ===== =========== ======================= =================== + c6 8 32 c6.2xlarge.4.linux.mrs KVM + \ 16 64 c6.4xlarge.4.linux.mrs KVM + \ 32 64 c6.8xlarge.2.linux.mrs KVM + \ 32 128 c6.8xlarge.4.linux.mrs KVM + \ 64 128 c6.16xlarge.2.linux.mrs KVM + \ 64 256 c6.16xlarge.4.linux.mrs KVM + ==== ===== =========== ======================= =================== + +.. table:: **Table 7** D1 ECS specifications + + +---------+---------+-------------+-------------------------+---------------------+-----------------+------------------------------------------+ + | Type | vCPUs | Memory (GB) | Flavor | Virtualization Type | Local Disk (GB) | Hardware | + +=========+=========+=============+=========================+=====================+=================+==========================================+ + | D1 | 44 | 3232 | d1.xlarge.mrslinux.mrs | KVM | 3x1800 | CPU: Intel® Xeon® Gold 6151 Processor v5 | + | | | | | | | | + | | | | | | | Memory: 20 x 32 GB | + +---------+---------+-------------+-------------------------+---------------------+-----------------+------------------------------------------+ + | | 88 | 6464 | d1.2xlarge.mrslinux.mrs | KVM | 6x1800 | | + +---------+---------+-------------+-------------------------+---------------------+-----------------+------------------------------------------+ + | | 16 | 128 | d1.4xlarge.linux.mrs | KVM | 12x1800 | | + +---------+---------+-------------+-------------------------+---------------------+-----------------+------------------------------------------+ + | | 36 | 256 | d1.8xlarge.linux.mrs | KVM | 24x1800 | | + +---------+---------+-------------+-------------------------+---------------------+-----------------+------------------------------------------+ + +.. table:: **Table 8** D2 ECS specifications + + +---------+---------+-------------+------------------------+---------------------+-----------------+------------------------------------------+ + | Type | vCPUs | Memory (GB) | Flavor | Virtualization Type | Local Disk (GB) | Hardware | + +=========+=========+=============+========================+=====================+=================+==========================================+ + | D2 | 4 | 32 | d2.xlarge.8.linux.mrs | KVM | 2x1800 | CPU: Intel® Xeon® Gold 6151 Processor v5 | + | | | | | | | | + | | | | | | | Memory: 20 x 32 GB | + +---------+---------+-------------+------------------------+---------------------+-----------------+------------------------------------------+ + | | 8 | 64 | d2.2xlarge.8.linux.mrs | KVM | 4x1800 | | + +---------+---------+-------------+------------------------+---------------------+-----------------+------------------------------------------+ + | | 16 | 128 | d2.4xlarge.8.linux.mrs | KVM | 8x1800 | | + +---------+---------+-------------+------------------------+---------------------+-----------------+------------------------------------------+ + | | 32 | 256 | d2.8xlarge.8.linux.mrs | KVM | 16x1800 | | + +---------+---------+-------------+------------------------+---------------------+-----------------+------------------------------------------+ + +.. table:: **Table 9** H1 ECS specifications + + ==== ===== =========== ====================== =================== + Type vCPUs Memory (GB) Flavor Virtualization Type + ==== ===== =========== ====================== =================== + H1 8 32 h1.2xlarge.4.linux.mrs KVM + \ 16 64 h1.4xlarge.4.linux.mrs KVM + \ 32 128 h1.8xlarge.4.linux.mrs KVM + ==== ===== =========== ====================== =================== + +.. table:: **Table 10** M3 ECS specifications + + ==== ===== =========== ====================== =================== + Type vCPUs Memory (GB) Flavor Virtualization Type + ==== ===== =========== ====================== =================== + M3 8 64 m3.2xlarge.8.linux.mrs KVM + \ 16 128 m3.4xlarge.8.linux.mrs KVM + \ 32 256 m3.8xlarge.8.linux.mrs KVM + ==== ===== =========== ====================== =================== + +.. table:: **Table 11** M4 ECS specifications + + ==== ===== =========== ======================= =================== + Type vCPUs Memory (GB) Flavor Virtualization Type + ==== ===== =========== ======================= =================== + M4 8 64 m4.2xlarge.8.linux.mrs KVM + \ 16 128 m4.4xlarge.8.linux.mrs KVM + \ 32 256 m4.8xlarge.8.linux.mrs KVM + \ 64 512 m4.16xlarge.8.linux.mrs KVM + ==== ===== =========== ======================= =================== diff --git a/api-ref/source/appendix/index.rst b/api-ref/source/appendix/index.rst new file mode 100644 index 0000000..ac34a9a --- /dev/null +++ b/api-ref/source/appendix/index.rst @@ -0,0 +1,24 @@ +:original_name: mrs_01_9002.html + +.. _mrs_01_9002: + +Appendix +======== + +- :ref:`ECS Specifications Used by MRS ` +- :ref:`Status Codes ` +- :ref:`Obtaining a Project ID ` +- :ref:`Obtaining Account ID ` +- :ref:`Obtain MRS Cluster Information ` +- :ref:`Roles and components supported by MRS11 ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + ecs_specifications_used_by_mrs + status_codes + obtaining_a_project_id + obtaining_account_id + obtain_mrs_cluster_information + roles_and_components_supported_by_mrs11 diff --git a/api-ref/source/appendix/obtain_mrs_cluster_information.rst b/api-ref/source/appendix/obtain_mrs_cluster_information.rst new file mode 100644 index 0000000..83b135a --- /dev/null +++ b/api-ref/source/appendix/obtain_mrs_cluster_information.rst @@ -0,0 +1,28 @@ +:original_name: mrs_02_0091.html + +.. _mrs_02_0091: + +Obtain MRS Cluster Information +============================== + +.. _mrs_02_0091__section177891315153619: + +Obtaining a Cluster ID +---------------------- + +A cluster ID (**cluster_id**) is required for some URLs when an API is called. To obtain a cluster ID, perform the following operations: + +#. Log in to the MRS management console. +#. Choose **Clusters** > **Active Clusters**, and click the name of the cluster to be operated. The cluster details page is displayed. +#. Click the **Dashboard** tab and obtain the cluster ID in the **Basic Information** area. + +.. _mrs_02_0091__section247234143612: + +Obtaining a Job ID +------------------ + +A job ID (**job_execution_id**) is required for some URLs when an API is called. To obtain a job ID, perform the following operations: + +#. Log in to the MRS management console. +#. Choose **Clusters** > **Active Clusters**, and click the name of the cluster to be operated. The cluster details page is displayed. +#. Click the **Jobs** tab and obtain the ID of the job to be operated from the job list. diff --git a/api-ref/source/appendix/obtaining_a_project_id.rst b/api-ref/source/appendix/obtaining_a_project_id.rst new file mode 100644 index 0000000..d8565f3 --- /dev/null +++ b/api-ref/source/appendix/obtaining_a_project_id.rst @@ -0,0 +1,54 @@ +:original_name: mrs_02_0011.html + +.. _mrs_02_0011: + +Obtaining a Project ID +====================== + +Obtaining a Project ID from the Management Console +-------------------------------------------------- + +A project ID (**project_id**) is required for some URLs when an API is called. To obtain a project ID, perform the following operations: + +#. Log in to the management console. + +#. Click the username and choose **My Credentials** from the drop-down list. + + On the **My Credentials** page, view project IDs in the project list. + +If there are multiple projects in one region, expand **Region** and view subproject IDs in the **Project ID** column. + +Obtaining a Project ID by Calling an API +---------------------------------------- + +You can obtain the project ID by calling the IAM API used to query project information based on the specified criteria. + +The API used to obtain a project ID is **GET https://**\ *{Endpoint}*\ **/v3/projects**. *{Endpoint}* is the IAM endpoint and can be obtained from `Regions and Endpoints `__. For details about API authentication, see :ref:`Authentication `. + +The following is an example response. The value of **id** under **projects** is the project ID of the region specified by **name**. + +.. code-block:: + + { + "projects": [ + { + "domain_id": "65382450e8f64ac0870cd180d14e684b", + "is_domain": false, + "parent_id": "65382450e8f64ac0870cd180d14e684b", + "name": "region_id", + "description": "", + "links": { + "next": null, + "previous": null, + "self": "https://www.example.com/v3/projects/a4a5d4098fb4474fa22cd05f897d6b99" + }, + "id": "a4a5d4098fb4474fa22cd05f897d6b99", + "enabled": true + } + ], + "links": { + "next": null, + "previous": null, + "self": "https://www.example.com/v3/projects" + } + } diff --git a/api-ref/source/appendix/obtaining_account_id.rst b/api-ref/source/appendix/obtaining_account_id.rst new file mode 100644 index 0000000..3e57b08 --- /dev/null +++ b/api-ref/source/appendix/obtaining_account_id.rst @@ -0,0 +1,14 @@ +:original_name: mrs_02_0016.html + +.. _mrs_02_0016: + +Obtaining Account ID +==================== + +A domain ID (**domain-id**) is required for some URLs when an API is called. To obtain an account ID, perform the following operations: + +#. Log in to the management console. + +#. Click the username and choose **My Credentials** from the drop-down list. + + View the account ID diff --git a/api-ref/source/appendix/roles_and_components_supported_by_mrs11.rst b/api-ref/source/appendix/roles_and_components_supported_by_mrs11.rst new file mode 100644 index 0000000..0a5a726 --- /dev/null +++ b/api-ref/source/appendix/roles_and_components_supported_by_mrs11.rst @@ -0,0 +1,55 @@ +:original_name: mrs_02_0106.html + +.. _mrs_02_0106: + +Roles and components supported by MRS11 +======================================= + +.. table:: **Table 1** Roles and components supported by MRS + + ================ ========== + Role Name Component + ================ ========== + OMSServer OMSServer + NameNode HDFS + Zkfc HDFS + JournalNode HDFS + DataNode HDFS + ResourceManager Yarn + NodeManager Yarn + JobHistoryServer Mapreduce + quorumpeer ZooKeeper + HMaster HBase + ThriftServer HBase + RegionServer HBase + SlapdServer LdapServer + KerberosServer KrbServer + KerberosAdmin KrbServer + Hue Hue + LoaderServer Loader + JDBCServer Spark + JobHistory Spark + SparkResource Spark + JDBCServer2x Spark2x + JobHistory2x Spark2x + SparkResource2x Spark2x + MetaStore Hive + WebHCat Hive + HiveServer Hive + MonitorServer Flume + Flume Flume + oozie Oozie + KerberosClient KrbClient + SlapdClient LdapClient + meta meta + DBServer DBService + Broker Kafka + Supervisor Storm + Logviewer Storm + Nimbus Storm + UI Storm + FlinkResource Flink + TezUI Tez + RangerAdmin Ranger + RangerUserSync Ranger + ================ ========== diff --git a/api-ref/source/appendix/status_codes.rst b/api-ref/source/appendix/status_codes.rst new file mode 100644 index 0000000..1e70762 --- /dev/null +++ b/api-ref/source/appendix/status_codes.rst @@ -0,0 +1,122 @@ +:original_name: mrs_02_0015.html + +.. _mrs_02_0015: + +Status Codes +============ + +:ref:`Table 1 ` describes status codes. + +.. _mrs_02_0015__tbcc499a25f1a4cdcb3933a128e804ad8: + +.. table:: **Table 1** Status codes + + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Status Code | Message | Description | + +=======================+=================================+===========================================================================================================================================================================================================================================================================================================================================================================================================+ + | 100 | Continue | The client should continue with its request. | + | | | | + | | | This interim response is used to inform the client that the initial part of the request has been received and has not yet been rejected by the server. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 101 | Switching Protocols | The protocol should be switched. The protocol can only be switched to a newer protocol. | + | | | | + | | | For example, the current HTTPS protocol is switched to a later version. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 200 | OK | The request has been fulfilled. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 201 | Created | The request has been fulfilled and a new resource has been created. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 202 | Accepted | The request has been accepted, but the processing has not been completed. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 203 | Non-Authoritative Information | The server has successfully processed the request, but is returning information that may be from another source. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 204 | NoContent | The request has been fulfilled, but the HTTPS response does not contain a response body. | + | | | | + | | | The status code is returned in response to an HTTPS OPTIONS request. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 205 | Reset Content | The server has fulfilled the request, but the requester is required to reset the content. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 206 | Partial Content | The server has successfully processed the partial GET request. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 300 | Multiple Choices | There are multiple options for the location of the requested resource. The response contains a list of resource characteristics and addresses from which a user terminal (such as a browser) can choose the most appropriate one. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 301 | Moved Permanently | The requested resource has been assigned a new permanent URI, and the new URI is contained in the response. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 302 | Found | The requested resource resides temporarily under a different URI. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 303 | See Other | The response to the request can be found under a different URI. | + | | | | + | | | It can be retrieved by using a GET or POST method. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 304 | Not Modified | The requested resource has not been modified. When the server returns this status code, it does not return any resources. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 305 | Use Proxy | The requested resource is available only through a proxy. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 306 | Unused | The HTTPS status code is no longer used. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 400 | BadRequest | The request is invalid. | + | | | | + | | | The client should not repeat the request without modifications. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 401 | Unauthorized | This status code is returned after the client provides the authentication information, indicating that the authentication information is incorrect or invalid. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 402 | Payment Required | This status code is reserved for future use. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 403 | Forbidden | The server understood the request, but is refusing to fulfill it. | + | | | | + | | | The client should not repeat the request without modifications. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 404 | NotFound | The requested resource cannot be found. | + | | | | + | | | The client should not repeat the request without modifications. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 405 | MethodNotAllowed | A request method is not supported for the requested resource. | + | | | | + | | | The client should not repeat the request without modifications. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 406 | Not Acceptable | The server cannot fulfill the request according to the content characteristics of the request. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 407 | Proxy Authentication Required | This status code is similar to 401, but indicates that the client must first authenticate itself with the proxy. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 408 | Request Time-out | The server has timed out waiting for the request. | + | | | | + | | | The client may repeat the request without modifications at a later time. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 409 | Conflict | The request could not be processed due to a conflict with the current state of the resource. | + | | | | + | | | This status code indicates that the resource that the client is attempting to create already exists, or that the request has failed to be processed because of the update of the conflict request. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 410 | Gone | The requested resource has been deleted permanently and is no longer available. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 411 | Length Required | The server is refusing to process the request without a defined **Content-Length**. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 412 | Precondition Failed | The server did not meet one of the preconditions that the requester put on the request. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 413 | Request Entity Too Large | The server is refusing to process a request because the request entity is too large for the server to process. The server may close the connection to prevent the client from continuing the request. If the server is only temporarily unable to process the request, the response will contain a **Retry-After** header field. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 414 | Request-URI Too Large | The Request-URI is too long for the server to process. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 415 | Unsupported Media Type | The server is unable to process the media format in the request. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 416 | Requested range not satisfiable | The requested range is invalid. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 417 | Expectation Failed | The server has failed to meet the requirements of the **Expect** request-header field. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 422 | UnprocessableEntity | The request is well-formed but is unable to be processed due to semantic errors. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 429 | TooManyRequests | The client has sent excessive number of requests to the server within a given time (exceeding the limit on the access frequency of the client), or the server has received an excessive number of requests within a given time (beyond its processing capability). In this case, the client should resend the request after the time specified in the **Retry-After** header of the response has elapsed. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 500 | InternalServerError | The server is able to receive the request but unable to understand it. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 501 | Not Implemented | The server does not support the function required to fulfill the request. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 502 | Bad Gateway | The server was acting as a gateway or proxy and received an invalid request from the remote server. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 503 | ServiceUnavailable | The requested service is invalid. | + | | | | + | | | The client should not repeat the request without modifications. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 504 | ServerTimeout | The request cannot be fulfilled within a given time. This status code is returned to the client only if the **Timeout** parameter is specified in the request. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | 505 | HTTPS Version not supported | The server does not support the HTTPS protocol version used in the request. | + +-----------------------+---------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ diff --git a/api-ref/source/before_you_start/api_calling.rst b/api-ref/source/before_you_start/api_calling.rst new file mode 100644 index 0000000..d85818f --- /dev/null +++ b/api-ref/source/before_you_start/api_calling.rst @@ -0,0 +1,8 @@ +:original_name: mrs_02_0017.html + +.. _mrs_02_0017: + +API Calling +=========== + +MRS support Representational State Transfer (REST) APIs, allowing you to call APIs using HTTPS. For details about API calling, see :ref:`Calling APIs `. diff --git a/api-ref/source/before_you_start/concepts.rst b/api-ref/source/before_you_start/concepts.rst new file mode 100644 index 0000000..4a4fcf9 --- /dev/null +++ b/api-ref/source/before_you_start/concepts.rst @@ -0,0 +1,42 @@ +:original_name: mrs_02_0005.html + +.. _mrs_02_0005: + +Concepts +======== + +- Domain + + A domain is created upon successful registration with the cloud platform. The domain has full access permissions for all of its cloud services and resources. It can be used to reset user passwords and grant user permissions. The domain is a payment entity and should not be used directly to perform routine management. For security purposes, create users and grant them permissions for routine management. + +- User + + A user is created using a domain to use cloud services. Each user has its own identity credentials (password and access keys). + + The domain username, and password will be required for API authentication. + +- Region + + Regions are geographic areas isolated from each other. Resources are region-specific and cannot be used across regions through internal network connections. For low network latency and quick resource access, select the nearest region. + +- AZ + + An AZ contains one or more physical data centers. Each AZ has independent cooling, fire extinguishing, moisture-proof, and electricity facilities. Within an AZ, computing, network, storage, and other resources are logically divided into multiple clusters. AZs within a region are interconnected using high-speed optical fibers to support cross-AZ high-availability systems. + +- Project + + Projects group and isolate resources (including compute, storage, and network resources) across physical regions. A default project is provided for each region, and sub-projects can be created under each default project. Users can be granted permissions to access all resources in a specific project in your domain. For more refined access control, create sub-projects under a project and create resources in the sub-projects. Users can then be assigned permissions to access only specific resources in the sub-projects. + + + .. figure:: /_static/images/en-us_image_0000001351245889.gif + :alt: **Figure 1** Project isolation model + + **Figure 1** Project isolation model + +- Checkpoint + + Checkpoint: When an application consumes data, the latest SN of the consumed data is recorded as a checkpoint. When the data is reconsumed, the consumption can be continued based on this checkpoint. + +- App + + Application: Multiple applications can access data in the same stream. Checkpoints generated for each application are used to record the consumed data in the stream by each application. diff --git a/api-ref/source/before_you_start/constraints.rst b/api-ref/source/before_you_start/constraints.rst new file mode 100644 index 0000000..948d342 --- /dev/null +++ b/api-ref/source/before_you_start/constraints.rst @@ -0,0 +1,8 @@ +:original_name: mrs_02_0004.html + +.. _mrs_02_0004: + +Constraints +=========== + +- For more constraints, see API description. diff --git a/api-ref/source/before_you_start/endpoints.rst b/api-ref/source/before_you_start/endpoints.rst new file mode 100644 index 0000000..f5c6433 --- /dev/null +++ b/api-ref/source/before_you_start/endpoints.rst @@ -0,0 +1,10 @@ +:original_name: mrs_02_0003.html + +.. _mrs_02_0003: + +Endpoints +========= + +An endpoint is the **request address** for calling an API. Endpoints vary depending on services and regions. For the endpoints of all services, see `Regions and Endpoints `__. + +. diff --git a/api-ref/source/before_you_start/index.rst b/api-ref/source/before_you_start/index.rst new file mode 100644 index 0000000..630cb41 --- /dev/null +++ b/api-ref/source/before_you_start/index.rst @@ -0,0 +1,24 @@ +:original_name: en-us_topic_0037324628.html + +.. _en-us_topic_0037324628: + +Before You Start +================ + +- :ref:`Overview ` +- :ref:`API Calling ` +- :ref:`Endpoints ` +- :ref:`Constraints ` +- :ref:`Concepts ` +- :ref:`Selecting an API Type ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + overview + api_calling + endpoints + constraints + concepts + selecting_an_api_type diff --git a/api-ref/source/before_you_start/overview.rst b/api-ref/source/before_you_start/overview.rst new file mode 100644 index 0000000..2c156bc --- /dev/null +++ b/api-ref/source/before_you_start/overview.rst @@ -0,0 +1,12 @@ +:original_name: mrs_02_0001.html + +.. _mrs_02_0001: + +Overview +======== + +Welcome to *MapReduce Service API Reference*. MapReduce Service (MRS) provides enterprise-level big data clusters on the cloud. Tenants can fully control the clusters and easily run big data components such as Hadoop, Spark, HBase, Kafka, and Storm in the clusters. + +This document describes how to use application programming interfaces (APIs) to perform operations on MRS, such as creating or deleting clusters, adjusting nodes, as well as creating and executing jobs. For details about all supported operations, see :ref:`API Overview `. + +If you plan to access MRS through an API, ensure that you are familiar with MRS concepts. For details, see **Service Overview** in the *MapReduce Service User Guide*. diff --git a/api-ref/source/before_you_start/selecting_an_api_type.rst b/api-ref/source/before_you_start/selecting_an_api_type.rst new file mode 100644 index 0000000..cd2df04 --- /dev/null +++ b/api-ref/source/before_you_start/selecting_an_api_type.rst @@ -0,0 +1,18 @@ +:original_name: mrs_02_0006.html + +.. _mrs_02_0006: + +Selecting an API Type +===================== + +Currently, MRS provides two types (V1 and V2) of APIs for cloud services with customized specifications. Only part of V2 APIs is available and mainly used for submitting jobs and SQL statements. If the API functions are the same, you are advised to use the V2 APIs first. + +All MRS versions support the V1 APIs. MRS 1.9.2 or later supports the V2 APIs. + +Based on the V1 APIs, the V2 APIs have the following enhancements: + +- Jobs can be submitted in a security cluster. +- The HiveSQL, Spark Python, and Flink jobs are supported. +- The SparkSQL and SparkScript results can be queried. + +For details about the APIs and their functions, see :ref:`API Overview `. diff --git a/api-ref/source/calling_apis/authentication.rst b/api-ref/source/calling_apis/authentication.rst new file mode 100644 index 0000000..9f8db3c --- /dev/null +++ b/api-ref/source/calling_apis/authentication.rst @@ -0,0 +1,188 @@ +:original_name: mrs_02_0009.html + +.. _mrs_02_0009: + +Authentication +============== + +Requests for calling an API can be authenticated using either of the following methods: + +- Token-based authentication: Requests are authenticated using a token. +- AK/SK-based authentication: Requests are authenticated by encrypting the request body using an AK/SK pair. AK/SK-based authentication is recommended because it is more secure than token-based authentication. + +Token-based Authentication +-------------------------- + +.. note:: + + The validity period of a token is 24 hours. When using a token for authentication, cache it to prevent frequently calling the IAM API used to obtain a user token. + +A token specifies temporary permissions in a computer system. During API authentication using a token, the token is added to requests to get permissions for calling the API. + +The token can be obtained by calling the API in `Obtaining a User Token `__. A project-level token is required for calling this service API, that is, when calling the API for `Obtaining a User Token `__, set the value of **auth.scope** in the request body to **project**. + +.. code-block:: + + { + "auth": { + "identity": { + "methods": [ + "password" + ], + "password": { + "user": { + "name": "username", + "password": "********", + "domain": { + "name": "domainname" + } + } + } + }, + "scope": { + "project": { + "id": "xxxxxxxx" + } + } + } + } + +After a token is obtained, the **X-Auth-Token** header field must be added to requests to specify the token when calling other APIs. For example, if the token is **ABCDEFJ....**, **X-Auth-Token: ABCDEFJ....** can be added to a request as follows: + +.. code-block:: + + Content-Type: application/json + X-Auth-Token: ABCDEFJ.... + +AK/SK-based Authentication +-------------------------- + +An AK/SK is used to verify the identity of a request sender. In AK/SK-based authentication, a signature needs to be obtained and then added to requests. + +.. note:: + + AK: access key ID, which is a unique identifier used in conjunction with a secret access key to sign requests cryptographically. + + SK: secret access key used in conjunction with an AK to sign requests cryptographically. It identifies a request sender and prevents the request from being modified. + +The following uses a demo project to show how to sign a request and use an HTTP client to send an HTTPS request. + +Download the demo project at https://docs.otc.t-systems.com/en-us/api/apiug/apig-en-api-180328008.html. + +If you do not need the demo project, visit the following URL to download the API Gateway signing SDK: + +https://apig-demo.obs.eu-de.otc.t-systems.com/java/java-sdk-core.zip + +Decompress the downloaded package and reference the obtained JAR files as dependencies. See the following figure. + + +.. figure:: /_static/images/en-us_image_0000001351446161.png + :alt: **Figure 1** Adding the API Gateway signing SDK + + **Figure 1** Adding the API Gateway signing SDK + +#. Generate an AK/SK. (If an AK/SK file has already been obtained, skip this step and locate the downloaded AK/SK file. Generally, the file name will be **credentials.csv**.) + + a. Log in to the management console. + b. Click the username and choose **My Credentials** from the drop-down list. + + c. On the **My Credentials** page, click the **Access Keys** tab. + d. Click **Add Access Key**. + e. Enter the login password. + f. Enter the verification code received by email. + g. Click **OK** to download the access key. + + .. note:: + + Keep the access key secure. + +#. Download and decompress the demo project. + +#. .. _mrs_02_0009__en-us_topic_0121671869_li19564155663214: + + Import the demo project to Eclipse. + + + .. figure:: /_static/images/en-us_image_0000001298566184.png + :alt: **Figure 2** Selecting Existing Projects into Workspace + + **Figure 2** Selecting Existing Projects into Workspace + + + .. figure:: /_static/images/en-us_image_0000001298725832.png + :alt: **Figure 3** Selecting the demo project + + **Figure 3** Selecting the demo project + + + .. figure:: /_static/images/en-us_image_0000001351245885.png + :alt: **Figure 4** Structure of the demo project + + **Figure 4** Structure of the demo project + +#. Sign the request. + + The request signing method is integrated in the JAR files imported in :ref:`3 `. The request needs to be signed before it is sent. The signature will then be added as part of the HTTP header to the request. + + The demo code is classified into the following classes to demonstrate signing and sending the HTTP request: + + - **AccessService**: An abstract class that merges the GET, POST, PUT, and DELETE methods into the access method. + - **Demo**: Execution entry used to simulate the sending of GET, POST, PUT, and DELETE requests. + - **AccessServiceImpl**: Implements the access method, which contains the code required for communication with API Gateway. + + a. Edit the main() method in the **Demo.java** file, and replace the bold text with actual values. + + As shown in the following code, if you use other methods such as POST, PUT, and DELETE, see the corresponding comment. + + Specify **region**, **serviceName**, **ak/sk**, and **url** as the actual values. In this demo, the URLs for accessing VPC resources are used. + + To obtain the project ID in the URLs, see :ref:`Obtaining a Project ID `. + + To obtain the endpoint, see `Regions and Endpoints `__. + + .. code-block:: + + //TODO: Replace region with the name of the region in which the service to be accessed is located. + private static final String region = ""; + + //TODO: Replace vpc with the name of the service you want to access. For example, ecs, vpc, iam, and elb. + private static final String serviceName = ""; + + public static void main(String[] args) throws UnsupportedEncodingException + { + //TODO: Replace the AK and SK with those obtained on the My Credential page. + String ak = "ZIRRKMTWP******1WKNKB"; + String sk = "Us0mdMNHk******YrRCnW0ecfzl"; + + //TODO: To specify a project ID (multi-project scenarios), add the X-Project-Id header. + //TODO: To access a global service, such as IAM, DNS, CDN, and TMS, add the X-Domain-Id header to specify an account ID. + //TODO: To add a header, find "Add special headers" in the AccessServiceImple.java file. + + //TODO: Test the API + String url = "https://{Endpoint}/v1/{project_id}/vpcs"; + get(ak, sk, url); + + //TODO: When creating a VPC, replace {project_id} in postUrl with the actual value. + //String postUrl = "https://serviceEndpoint/v1/{project_id}/cloudservers"; + //String postbody ="{\"vpc\": {\"name\": \"vpc\",\"cidr\": \"192.168.0.0/16\"}}"; + //post(ak, sk, postUrl, postbody); + + //TODO: When querying a VPC, replace {project_id} in url with the actual value. + //String url = "https://serviceEndpoint/v1/{project_id}/vpcs/{vpc_id}"; + //get(ak, sk, url); + + //TODO: When updating a VPC, replace {project_id} and {vpc_id} in putUrl with the actual values. + //String putUrl = "https://serviceEndpoint/v1/{project_id}/vpcs/{vpc_id}"; + //String putbody ="{\"vpc\":{\"name\": \"vpc1\",\"cidr\": \"192.168.0.0/16\"}}"; + //put(ak, sk, putUrl, putbody); + + //TODO: When deleting a VPC, replace {project_id} and {vpc_id} in deleteUrl with the actual values. + //String deleteUrl = "https://serviceEndpoint/v1/{project_id}/vpcs/{vpc_id}"; + //delete(ak, sk, deleteUrl); + } + + b. Compile the code and call the API. + + In the **Package Explorer** area on the left, right-click **Demo.java**, choose **Run AS** > **Java Application** from the shortcut menu to run the demo code. + + You can view the API call logs on the console. diff --git a/api-ref/source/calling_apis/index.rst b/api-ref/source/calling_apis/index.rst new file mode 100644 index 0000000..8e56965 --- /dev/null +++ b/api-ref/source/calling_apis/index.rst @@ -0,0 +1,18 @@ +:original_name: mrs_02_0002.html + +.. _mrs_02_0002: + +Calling APIs +============ + +- :ref:`Making an API Request ` +- :ref:`Authentication ` +- :ref:`Response ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + making_an_api_request + authentication + response diff --git a/api-ref/source/calling_apis/making_an_api_request.rst b/api-ref/source/calling_apis/making_an_api_request.rst new file mode 100644 index 0000000..2474ca3 --- /dev/null +++ b/api-ref/source/calling_apis/making_an_api_request.rst @@ -0,0 +1,166 @@ +:original_name: mrs_02_0008.html + +.. _mrs_02_0008: + +Making an API Request +===================== + +This section describes the structure of a REST API, and uses the IAM API for `obtaining request authentication `__ as an example to demonstrate how to call an API. The obtained token is used to authenticate the calling of other APIs. + +Request URI +----------- + +A request URI is in the following format: + +**{URI-scheme}://{Endpoint}/{resource-path}?{query-string}** + +Although a request URI is included in the request header, most programming languages or frameworks require the request URI to be transmitted separately. + +.. table:: **Table 1** URI parameter description + + +---------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Description | + +===============+================================================================================================================================================================================================================================================================================================+ + | URI-scheme | Protocol used to transmit requests. All APIs use HTTPS. | + +---------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Endpoint | Domain name or IP address of the server bearing the REST service. The endpoint varies between services in different regions. It can be obtained from `Regions and Endpoints `__. | + +---------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | resource-path | Access path of an API for performing a specified operation. Obtain the path from the URI of an API. For example, the **resource-path** of the API used to `obtain request authentication `__ is **/v3/auth/tokens**. | + +---------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | query-string | Query parameter, which is optional. Ensure that a question mark (?) is included before each query parameter that is in the format of "*Parameter name=Parameter value*". For example, **? limit=10** indicates that a maximum of 10 data records will be displayed. | + +---------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. note:: + + To simplify the URI display in this document, each API is provided only with a **resource-path** and a request method. The **URI-scheme** of all APIs is **HTTPS**, and the endpoints of all APIs in the same region are identical. + +Request Methods +--------------- + +The HTTP protocol defines the following request methods that can be used to send a request to the server: + +.. table:: **Table 2** HTTP methods + + +-----------------------------------+----------------------------------------------------------------------------+ + | Method | Description | + +===================================+============================================================================+ + | GET | Requests the server to return specified resources. | + +-----------------------------------+----------------------------------------------------------------------------+ + | PUT | Requests the server to update specified resources. | + +-----------------------------------+----------------------------------------------------------------------------+ + | POST | Requests the server to add resources or perform special operations. | + +-----------------------------------+----------------------------------------------------------------------------+ + | DELETE | Requests the server to delete specified resources, for example, an object. | + +-----------------------------------+----------------------------------------------------------------------------+ + | HEAD | Same as GET except that the server must return only the response header. | + +-----------------------------------+----------------------------------------------------------------------------+ + | PATCH | Requests the server to update partial content of a specified resource. | + | | | + | | If the resource does not exist, a new resource will be created. | + +-----------------------------------+----------------------------------------------------------------------------+ + +In the URI of the API to `obtain request authentication `__, you can see that the request method is **POST**. The request is as follows: + +.. code-block:: text + + POST https://{{endpoint}}/v3/auth/tokens + +Request Header +-------------- + +You can also add additional header fields to a request, such as the fields required by a specified URI or HTTP method. For example, to request for the authentication information, add **Content-Type**, which specifies the request body type. + +:ref:`Table 3 ` lists common request header fields. + +.. _mrs_02_0008__td181b06f1c0949cb913acd8d77f21ec3: + +.. table:: **Table 3** Common request header fields + + +-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+----------------------------------+ + | Field | Description | Mandatory | Example | + +=================+=============================================================================================================================================================================================================================================================+=============================================================================================+==================================+ + | X-Sdk-Date | Time when the request is sent. The time is in **YYYYMMDD'T'HHMMSS'Z'** format. | This field is mandatory for AK/SK-based authentication. | 20150907T101459Z | + | | | | | + | | The value is the current Greenwich Mean Time (GMT) of the system. | | | + +-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+----------------------------------+ + | Host | Server information of the resource being requested. The value can be obtained from the URL of a service API. The value is **hostname[:port]**. If the port number is not specified, the default port is used. The default port number for HTTPS is **443**. | This field is mandatory for AK/SK-based authentication. | code.test.com | + | | | | | + | | | | or | + | | | | | + | | | | code.test.com:443 | + +-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+----------------------------------+ + | Content-Type | MIME type of the request body This field is mandatory and its default value is **application/json**. Other values of this field will be provided for specific APIs if any. | Yes | application/json | + +-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+----------------------------------+ + | Content-Length | Length of the request body. The unit is byte. | This field is mandatory for POST and PUT requests, but must be left blank for GET requests. | 3495 | + +-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+----------------------------------+ + | X-Project-Id | Project ID. This field is used to obtain the token for each project. | No | e9993fc787d94b6c886cbaa340f9c0f4 | + +-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+----------------------------------+ + | X-Auth-Token | User token. | No | ``-`` | + | | | | | + | | It is the response to the API used to `obtain request authentication `__. This API is the only one that does not require authentication. | This field is mandatory for token-based authentication. | | + | | | | | + | | The token is the value of **X-Subject-Token** in the response header. | | | + +-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+----------------------------------+ + | X-Language | Request language. The options are as follows: | No | en-us | + | | | | | + | | **en-us**: English | | | + +-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+----------------------------------+ + | X-Domain-Id | Domain ID | No | ``-`` | + +-----------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------+----------------------------------+ + +.. note:: + + In addition to supporting token-based authentication, APIs also support authentication using access key ID/secret access key (AK/SK). During AK/SK-based authentication, an SDK is used to sign the request, and the **Authorization** (signature authentication) and **X-Sdk-Date** (time when the request is sent) header fields are automatically added to the request. + + For more information, see **AK/SK-based Authentication** in :ref:`Authentication `. + +The API used to `obtain a user token `__ does not require authentication. Therefore, only the **Content-Type** field needs to be added to requests for calling the API. An example of such requests is as follows: + +.. code-block:: text + + POST https://{{endpoint}}/v3/auth/tokens + Content-Type: application/json + +(Optional) Request Body +----------------------- + +This part is optional. The body of a request is often sent in a structured format (for example, JSON or XML) as specified in the **Content-Type** header field. The request body transfers content except the request header. + +The request body varies between APIs. Some APIs do not require the request body, such as the APIs requested using the GET and DELETE methods. + +In the case of the API used to `obtain a user token `__, the request parameters and parameter description can be obtained from the API request. The following provides an example request with a body included. Replace *username*, *domainname*, ``********`` (login password), and *xxxxxxxxxxxxxxxxxx* *(project ID)* with the actual values. To learn how to obtain a project ID, see :ref:`Obtaining a Project ID `. + +.. note:: + + The **scope** parameter specifies where a token takes effect. You can set **scope** to an account or a project under an account. In the following example, the token takes effect only for the resources in a specified project. For more information about this API, see `Obtaining a User Token `__ of the IAM service. + +.. code-block:: text + + POST https://{{endpoint}}/v3/auth/tokens + Content-Type: application/json + + { + "auth": { + "identity": { + "methods": [ + "password" + ], + "password": { + "user": { + "name": "username", + "password": "********", + "domain": { + "name": "domainname" + } + } + } + }, + "scope": { + "project": { + "id": "xxxxxxxxxxxxxxxxxx" + } + } + } + } + +If all data required for the API request is available, you can send the request to call the API through `curl `__, `Postman `__, or coding. In the response to the API used to obtain a user token, **x-subject-token** is the desired user token. This token can then be used to authenticate the calling of other APIs. diff --git a/api-ref/source/calling_apis/response.rst b/api-ref/source/calling_apis/response.rst new file mode 100644 index 0000000..5dc7815 --- /dev/null +++ b/api-ref/source/calling_apis/response.rst @@ -0,0 +1,62 @@ +:original_name: mrs_02_0010.html + +.. _mrs_02_0010: + +Response +======== + +Status Code +----------- + +After sending a request, you will receive a response, including a status code, response header, and response body. + +A status code is a group of digits, ranging from 1\ *xx* to 5\ *xx*. It indicates the status of a request. For more information, see :ref:`Status Codes `. + +For the API to `obtain request authentication `__, if the status code **201** is returned after the API is called, the request is successful. + +Response Header +--------------- + +Similar to a request, a response also has a header, for example, **Content-Type**. + +:ref:`Figure 1 ` shows the response header fields for the API used to `obtain request authentication `__. The **x-subject-token** header field is the desired user token. This token can then be used to authenticate the calling of other APIs. + +.. _mrs_02_0010__en-us_topic_0170155703_fig4865141011511: + +.. figure:: /_static/images/en-us_image_0000001298246380.png + :alt: **Figure 1** Header fields of the response to the request for obtaining a user token + + **Figure 1** Header fields of the response to the request for obtaining a user token + +(Optional) Response Body +------------------------ + +This part is optional. The body of a response is often returned in structured format (for example, JSON or XML) as specified in the **Content-Type** header field. The response body transfers content except the response header. + +The following shows the response body for the API to `obtain request authentication `__. For the sake of space, only part of the content is displayed here. + +.. code-block:: + + { + "token": { + "expires_at": "2019-02-13T06:52:13.855000Z", + "methods": [ + "password" + ], + "catalog": [ + { + "endpoints": [ + { + "region_id": "aaa"//The region ID "aaa" is used as an example. + ... + +If an error occurs during API calling, an error code and a message will be displayed. The following shows an error response body. + +.. code-block:: + + { + "error_msg": "Invalid cluster name.", + "error_code": "12000002" + } + +In the response body, **error_code** is an error code, and **error_msg** provides information about the error. diff --git a/api-ref/source/change_history.rst b/api-ref/source/change_history.rst new file mode 100644 index 0000000..977dae5 --- /dev/null +++ b/api-ref/source/change_history.rst @@ -0,0 +1,126 @@ +:original_name: mrs_02_9003.html + +.. _mrs_02_9003: + +Change History +============== + ++-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Release Date | What's New | ++===================================+==============================================================================================================================================================================================================+ +| 2022-9-29 | Modified the following content: | +| | | +| | - Added MRS 1.9.2 and MRS 2.1.0 hybrid cluster components. For details, see :ref:`Creating Clusters `. | +| | - Add component lists for MRS 3.1.2-LTS.3 and 3.1.0-LTS.1. For details, see :ref:`Querying Cluster Details `. | ++-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 2022-07-05 | Modified the following content: | +| | | +| | - Added MRS 3.1.2-LTS.3. For details, see :ref:`Creating Clusters ` and :ref:`Creating a Cluster and Running a Job `. | ++-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 2021-06-30 | Modified the following content: | +| | | +| | Added MRS 3.1.0-LTS.1. For details, see :ref:`Creating Clusters ` and :ref:`Creating a Cluster and Running a Job `. | ++-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 2020-10-19 | Modified the following content: | +| | | +| | - Added the **cluster_master_secret** parameter is added in :ref:`Creating a Cluster and Running a Job `. | +| | - Changed the **cluster_id** parameter as a mandatory parameter in :ref:`Querying the exe Object List of Jobs `. | ++-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 2020-09-25 | Added the following APIs: | +| | | +| | :ref:`Creating Clusters ` | ++-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 2020-03-09 | Modified the following content: | +| | | +| | All components in MRS 2.1.0 are added. For details, see :ref:`Querying a Cluster List ` and :ref:`Querying Cluster Details `. | ++-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 2020-02-22 | Modified the following content: | +| | | +| | - Changed the **cluster_version** parameter to a mandatory parameter for creating a cluster. For details, see :ref:`Creating a Cluster and Running a Job `. | +| | - Added MRS 1.9.2 and MRS 2.1.0. For details, see :ref:`Creating a Cluster and Running a Job `. | +| | - Added C4 and M4 ECS specifications. For details, see :ref:`ECS Specifications Used by MRS `. | +| | - Added the V2 APIs. For details, see :ref:`Job Object APIs (V2) `. | ++-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 2019-12-06 | Modified the following content: | +| | | +| | :ref:`Creating a Cluster and Running a Job ` | ++-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 2019-07-17 | Modified the following content: | +| | | +| | :ref:`Querying a Cluster List ` | ++-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 2019-07-03 | Modified the following content: | +| | | +| | :ref:`Creating a Cluster and Running a Job ` | ++-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 2018-11-30 | Accepted in OTC 3.2. | ++-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 2018-10-26 | Modified the following content: | +| | | +| | - :ref:`Creating a Cluster and Running a Job `: The request examples for enabling and disabling cluster HA have been added, and the description about KVM flavors has been supplemented. | +| | - :ref:`Querying Cluster Details `: The description about the bootstrap action script parameter that needs to be entered for executing the **presto-install.sh** script has been supplemented. | ++-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 2018-09-10 | Modified the following content: | +| | | +| | :ref:`Creating a Cluster and Running a Job ` | ++-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 2018-08-30 | Modified the following content: | +| | | +| | - :ref:`Creating a Cluster and Running a Job ` | +| | - :ref:`Resizing a Cluster ` | +| | - :ref:`Adding a Tag to a Specified Cluster ` | +| | - :ref:`Deleting a Tag of a Specified Cluster ` | +| | - :ref:`Adding or Deleting Cluster Tags in Batches ` | ++-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 2018-05-29 | - Added the following content: | +| | | +| | - :ref:`MRS Manager API ` | +| | | +| | - Modified the following content: | +| | | +| | - :ref:`Creating a Cluster and Running a Job ` | +| | - :ref:`Querying a Cluster List ` | +| | - :ref:`Querying Cluster Details ` | ++-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 2018-03-16 | - Added the following content: | +| | | +| | :ref:`Querying a Host List ` | +| | | +| | - Modified the following content: | +| | | +| | :ref:`Resizing a Cluster ` | ++-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 2017-11-08 | - Added the following content: | +| | | +| | :ref:`Querying a Cluster List ` | +| | | +| | - Modified the following content: | +| | | +| | - :ref:`API Overview ` | +| | - :ref:`Creating a Cluster and Running a Job ` | +| | - :ref:`Querying Cluster Details ` | +| | - :ref:`Adding a Job and Executing the Job ` | +| | - :ref:`Querying the Job Object List ` | ++-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 2017-06-09 | - Added the following content: | +| | | +| | - :ref:`Data Source APIs ` | +| | - :ref:`Job Binary Object APIs ` | +| | - :ref:`Job Object APIs (V1, Not Recommended) ` | +| | - :ref:`Job Execution Object APIs (V1, Not Recommended) ` | +| | | +| | - Modified the following content: | +| | | +| | - :ref:`Creating a Cluster and Running a Job ` | +| | - :ref:`Adding a Job and Executing the Job ` | ++-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 2017-04-06 | - Added the following content: | +| | | +| | :ref:`Querying Cluster Details ` | +| | | +| | - Modified the following content: | +| | | +| | :ref:`Creating a Cluster and Running a Job ` | ++-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 2017-02-20 | This issue is the first official release. | ++-----------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ diff --git a/api-ref/source/index.rst b/api-ref/source/index.rst index fa7f760..2e2ef8f 100644 --- a/api-ref/source/index.rst +++ b/api-ref/source/index.rst @@ -2,3 +2,13 @@ Map Reduce Service - API Reference ================================== +.. toctree:: + :maxdepth: 1 + + before_you_start/index + api_overview + calling_apis/index + apis/index + mrs_manager_api/index + appendix/index + change_history diff --git a/api-ref/source/mrs_manager_api/api_usage_guide/api_calling_process.rst b/api-ref/source/mrs_manager_api/api_usage_guide/api_calling_process.rst new file mode 100644 index 0000000..035436c --- /dev/null +++ b/api-ref/source/mrs_manager_api/api_usage_guide/api_calling_process.rst @@ -0,0 +1,151 @@ +:original_name: mrs_02_1080.html + +.. _mrs_02_1080: + +API Calling Process +=================== + +The process for calling an MRS Manager API is as follows: + +#. :ref:`Obtaining Request Authentication Information ` + + Before you call an API, obtain request authentication information, and fill it in a request header. + +#. :ref:`Obtaining Request Authentication Information ` + + Configure request parameters to construct a request. + +#. :ref:`Sending a Request ` + +#. :ref:`Parsing a Response ` + +.. _mrs_02_1080__en-us_topic_0125376234_section1225494452418: + +Obtaining Request Authentication Information +-------------------------------------------- + +**Scenario** + +Currently, CAS can be used for login authentication when an API is called. + +After login authentication, obtain the JSESSIONID of a web request and check the current user using the JSESSIONID. + +**Procedure for Calling an API** (Security Cluster) + +#. Send the request **GET https://**\ **MRS Managerfloating IP**\ **:20009/cas/login** to obtain **casSessionId** and **loginTicket** from the CAS login information. + + The following example describes how to obtain **casSessionId** and **loginTicket** from the response object of the request. + +.. code-block:: + + // Obtain the CAS login page. + HttpResponse casLoginPageResponse = getCasLoginPage(casUrl, httpClient); + LOG.info("get cas login page request status is :{} , casLoginPageResponse is :{}.", casLoginPageResponse.getStatusLine(), casLoginPageResponse); + + // Obtain casSessionId and loginTicket. + String casSessionId = getCasSessionId(casLoginPageResponse); + String loginTicket = getLoginTicket(casLoginPageResponse); + LOG.info("casSessionId = {} , loginTicket = {}.", casSessionId, loginTicket); + +2. Send **POST https://**\ *MRS Manager floating IP*\ **:20009/cas/login?service= https://**\ *MRS Manager floating IP*\ **:28443/web/cas_security_check.htm** to initiate a CAS login authentication request. The request body contains the username, password, and the obtained **loginTicket**. The request header contains **casSessionId**. Obtain the authenticated ticket granting cookie (TGC) from the response header. + +.. code-block:: + + // Authenticate the username and password on the CAS server. + HttpResponse loginPostResponse = + loginCasServer(casUrl, webUrl, userName, password, httpClient, casSessionId, loginTicket, userTLSVersion); + LOG.info("the post response is: {}.", loginPostResponse); + + // Obtain the authenticated TGC. + String casTgc = getCASTGC(loginPostResponse); + LOG.info("casTgc = {}.", casTgc); + ... + + + /** + * Log in to the CAS server and verify user information. + * @param casUrl CAS server address + * @param webUrl Web application address + * @param userName Login user name + * @param password Login password + * @param casSessionId CAS session ID + * @param loginTicket CAS login ticket + * @return http client HTTP client + */ + private HttpResponse loginCasServer(String casUrl, String webUrl, String userName, String password, + HttpClient httpClient, String casSessionId, String loginTicket,String userTLSVersion) + { + if (ParamsValidUtil.isEmpty(casUrl, webUrl, userName, password, casSessionId, loginTicket)) + { + LOG.error("Invalid input param."); + } + String postUrl = generateCasLoginUrl(casUrl, webUrl); + LOG.info("login cas server URL is : {}.", postUrl); + + HttpPost httpPost = new HttpPost(postUrl); + // Parameters contained in the request body + List FormData = new ArrayList(); + FormData.add(new BasicNameValuePair("username", userName)); + FormData.add(new BasicNameValuePair("password", password)); + FormData.add(new BasicNameValuePair("lt", loginTicket)); + FormData.add(new BasicNameValuePair("_eventId", "submit")); + FormData.add(new BasicNameValuePair("submit", "Login")); + HttpResponse response = null; + BufferedReader bufferedReader = null; + // Parameters contained in the request header + httpPost.addHeader("Cookie", CAS_SESSION_ID_STRING + casSessionId); + ... + + + /** + * Generate a complete URL for logging in to CAS. + * After the login is successful, the specified CAS security check page is displayed. + * @param casUrl + * @param webUrl + * @return + */ + private String generateCasLoginUrl(String casUrl, String webUrl) + { + StringBuilder sb = new StringBuilder(); + sb.append(casUrl); + sb.append("?service="); + sb.append(webUrl); + sb.append("/cas_security_check.htm"); + return sb.toString(); + } + +3. Send **GET https://**\ *MRS Manager floating IP*\ **:28443/web/v1/access/login_check** to initiate a web login authentication request. The cookie in the request header contains two TGC obtained in the previous step. After the response is successful, obtain the JSESSIONID of the web request from the cookie in the response header. + +.. code-block:: + + /** + * Initiate a request for web application login authentication. + * @param webUrl Web application URL + * @param httpclient http client + * @return response Login verification response object + */ + private HttpResponse webLoginCheck(String webUrl, HttpClient httpclient) + { + //Web login authentication request path + HttpGet loginCheckHttpGet = new HttpGet(webUrl + "/v1/access/login_check"); + LOG.info("web login check URL is: {}.", (webUrl + "/v1/access/login_check")); + + HttpResponse response = null; + BufferedReader bufferedReader = null; + InputStream inputStream = null; + boolean flag = false; + try + { + response = httpclient.execute(loginCheckHttpGet); + + inputStream = response.getEntity().getContent(); + bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + String lineContent = ""; + lineContent = bufferedReader.readLine(); + LOG.info("response content is {} : " + lineContent); + String postResponseState = ""; + ... + +.. note:: + + For a non-security cluster, you can skip CAS authentication in step 1 and step 2 and directly send the **GET https://**\ **MRS Manager floating IP**\ **:28443/web/v1/access/login_check** web login authentication request. And then, you can obtain the **FISessionId** of the web request from the cookie of the response header of the response object. diff --git a/api-ref/source/mrs_manager_api/api_usage_guide/examples.rst b/api-ref/source/mrs_manager_api/api_usage_guide/examples.rst new file mode 100644 index 0000000..9f58534 --- /dev/null +++ b/api-ref/source/mrs_manager_api/api_usage_guide/examples.rst @@ -0,0 +1,870 @@ +:original_name: mrs_02_1081.html + +.. _mrs_02_1081: + +Examples +======== + +Invoke API demo code. + +Main.java +--------- + +This class is a running entry class for calling APIs. Before running this class, you need to set the following parameters: + +#. IP address of the cluster management node +#. Login username and password + +Before calling service APIs, call login authentication APIs for performing login authentication first. For details about how to call login authentication APIs, see **CASLogin.java**. + +The following example describes how to call the GET and POST APIs. + +#. GET request API + + This example describes how to call the API for querying the installed clusters (/web/v1/clusters). + + Before the service API is called, the IP address, port number, and the **/web** path are added to the webUrl. Therefore, you need to combine the webUrl with the request API path **/v1/clusters** in the operationUrl of the service API. + +#. POST request API + + This example describes how to call the API for starting a service (/web/v1/maintain/cluster/{cluster_id}/service/{service_name}/start). + + In the operationUrl of this API, you need to combine the webUrl with the request API path **v1/maintain/cluster/{cluster_id}/service/{service_name}/start**. In the request path URL, enter the current cluster ID and the name of the service to be started. + + According to the requirements of the API for starting a service, specified parameters need to be inputted in the request body. These parameters are written in the example **StartService.json** file in JSON format, and the file path is specified in **jsonFilePath**. + +You can view information about API calling in the generated **Demo.log** file. For details about log configurations, see **Log4j.properties**. + +.. code-block:: + + package com.MRS; + + import org.apache.http.client.HttpClient; + import org.slf4j.Logger; + import org.slf4j.LoggerFactory; + import com.MRS.login.CASLogin; + import com.MRS.operation.HttpManager; + + /** + * Program running entry + * + */ + public class Main + { + private static final Logger LOG = LoggerFactory.getLogger(Main.class); + + // IP address of the cluster management node + public static final String IP_Address = "xxx.xxx.xxx.xxx"; + + public static void main(String[] args) + { + //############# Step 1. Prepare for calling an API.############# + // Login username and password + String userName = "xxxxxx"; + String password = "xxxxxxxxx"; + HttpManager httpManager = new HttpManager(); + + // CAS and Web URLs + String casUrl = "https://" + IP_Address + ":20009/cas/login"; + String webUrl = "https://" + IP_Address + ":28443/web/"; + + // userTLSVersion is a mandatory parameter. It is an important parameter used for connecting a JDK 1.6 server to a JDK 1.8 server. If you use JDK 1.8, set this parameter to an empty character string. + String userTLSVersion = ""; + + //############# Step 2. Call an API to complete login authentication.############# + LOG.info("Begin to get httpclient and login cas."); + HttpClient httpClient = new CASLogin().login(casUrl, webUrl, userName, password, userTLSVersion); + + //############# Step 3. Call APIs based on the service.############# + + // Send a GET request to call the API for querying the installed clusters. + String operationUrl = webUrl + "/v1/clusters"; + httpManager.sendHttpGetRequest(httpClient, operationUrl); + + // Send a POST request to call the API for adding a user. + String jsonFilePath = "./conf/startService.json"; + String operationUrl = webUrl + "/v1/maintain/cluster/{cluster_id}/service/{service_name}/start"; + httpManager.sendHttpPostRequest(httpClient, operationUrl, jsonFilePath); + + //############# Step 4. Close the connection.############# + httpClient.getConnectionManager().shutdown(); + } + } + +CASLogin.java +------------- + +This class allows login authentication with a token. + +#. Build an HttpClient client object. + +#. Invoke the **getCasLoginPage()** method to obtain the CAS login page, input the casUrl and the HttpClient client object, and obtain the returned **casLoginPageResponse** response object. + + The method is to send a GET request to the cluster. The request path is https://*casUrl*/login. + +#. The HttpClient obtains the **casSessionId** and **loginTicket** from the **casLoginPageResponse** response object. + +#. Invoke the **loginCasServer()** method to obtain the username and password for CAS server authentication, input the casUrl, webUrl, username, password, HttpClient object, casSessionId, loginTicket, and userTLSVersion parameters to obtain the **loginPostResponse** response object. + + This method is to send a POST login authentication request to the cluster. The request path is https://*casUrl*/login?service= https://*webUrl*/ cas_security_check.htm. + +#. The HttpClient obtains the authenticated TGC from the **loginPostResponse** response object. + +#. Invoke the **webLoginCheck()** method to initiate a web application login verification request, input the webUrl and the HttpClient client object, and obtain the **webLoginCheck** response object. + + The method is to send a GET verification request to the cluster. The request path is https://*webUrl*/v1/access/login_check. + +#. The HttpClient obtains the JSESSIONID of the web request from the **webLoginCheck** response object. + +#. Return an available HttpClient client object. + +.. code-block:: + + package com.MRS.login; + + import java.io.BufferedReader; + import java.io.IOException; + import java.io.InputStream; + import java.io.InputStreamReader; + import java.util.ArrayList; + import java.util.List; + import org.apache.commons.lang.StringUtils; + import org.apache.http.Header; + import org.apache.http.HttpResponse; + import org.apache.http.client.HttpClient; + import org.apache.http.client.entity.UrlEncodedFormEntity; + import org.apache.http.client.methods.HttpGet; + import org.apache.http.client.methods.HttpPost; + import org.apache.http.impl.client.DefaultHttpClient; + import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; + import org.apache.http.message.BasicNameValuePair; + import org.slf4j.Logger; + import org.slf4j.LoggerFactory; + import com.MRS.operation.WebClientWrapper; + import com.MRS.utils.ParamsValidUtil; + + public class CASLogin + { + private static final Logger LOG = LoggerFactory.getLogger(CASLogin.class); + private static final String SET_COOKIE = "Set-Cookie"; + private static final String CAS_SESSION_ID_STRING = "casSessionId="; + private static final String CAS_TGC_STRING = "CASTGC="; + private static final String SEMICOLON_SEPARATOR = ";"; + private static final String DOUBLE_QUOTAYION = "\""; + private static final String LOGINTICKET_STRING = "name=\"lt\" value="; + private static final int LOGINTICKET_INDEX = 5; + private static final String WRONGPASSWORD = "The credentials you provided cannot be determined to be authentic"; + private static final String RESETPASSWORD = "modify_password.html"; + private static final String ENCODING = "UTF-8"; + public String tgc = ""; + + public HttpClient login(String casUrl, String webUrl, String userName, String password, String userTLSVersion) + { + if (ParamsValidUtil.isEmpty(casUrl, webUrl, userName, password)) + { + LOG.error("Invalid input param."); + return null; + } + if (userTLSVersion == null || userTLSVersion.isEmpty()) + { + userTLSVersion = "TLS"; + } + LOG.info("Get http client for sending https request, username is {}, casUrl is {}, webUrl is {}.", + userName, casUrl, webUrl); + + // Obtain the HttpClient. + HttpClient httpClient = getHttpClient(userTLSVersion); + + // Obtain the CAS login page. + HttpResponse casLoginPageResponse = getCasLoginPage(casUrl, httpClient); + LOG.info("get cas login page response is :{}.", casLoginPageResponse); + + // Obtain casSessionId and loginTicket. + String casSessionId = getCasSessionId(casLoginPageResponse); + String loginTicket = getLoginTicket(casLoginPageResponse); + LOG.info("casSessionId = {} , loginTicket = {}.", casSessionId, loginTicket); + if(StringUtils.isBlank(casSessionId) || StringUtils.isBlank(loginTicket)) + { + LOG.error("Invalid input param."); + return null; + } + + // Authenticate the username and password on the CAS server. + HttpResponse loginPostResponse = + loginCasServer(casUrl, webUrl, userName, password, httpClient, casSessionId, loginTicket, userTLSVersion); + LOG.info("the login post response is: {}.", loginPostResponse); + + // Obtain the authenticated TGC. + String casTgc = getCASTGC(loginPostResponse); + LOG.info("casTgc = {}.", casTgc); + + // Check the login. + HttpResponse webLoginCheck = webLoginCheck(webUrl, httpClient); + LOG.info("web login check response is: {}.", webLoginCheck); + + // If the login authentication is successful, the available HttpClient is returned. + return httpClient; + } + + /** + * Obtain the HttpClient. + * @return http client + */ + @SuppressWarnings("deprecation") + public HttpClient getHttpClient(String userTLSVersion) + { + ThreadSafeClientConnManager safeClientConnManager = new ThreadSafeClientConnManager(); + safeClientConnManager.setMaxTotal(100); + HttpClient httpclient = WebClientWrapper.wrapClient(new DefaultHttpClient(safeClientConnManager), userTLSVersion); + return httpclient; + } + + /** + * Obtain the CAS login page. + * @param casUrl CAS homepage address + * @param httpclient http client + * @return response Response of the request + */ + private HttpResponse getCasLoginPage(String casUrl, HttpClient httpclient) + { + LOG.info("Enter getCasLoginPage, the casUrl is: {}", casUrl); + HttpGet preLoginHttpGet = new HttpGet(casUrl); + HttpResponse httpResponse = null; + try + { + httpResponse = httpclient.execute(preLoginHttpGet); + } + catch (Exception e) + { + LOG.error("Execute cas login failed."); + } + return httpResponse; + } + + /** + * Obtain the CAS session ID from the returned login page response. + * @param preLoginResponse Response of the login page request + * @return session id Session ID + */ + private String getCasSessionId(HttpResponse preLoginResponse) + { + Header resHeader = preLoginResponse.getFirstHeader(SET_COOKIE); + String setCookie = resHeader == null ? "" : resHeader.getValue(); + String casSessionId = + setCookie.substring(CAS_SESSION_ID_STRING.length(), setCookie.indexOf(SEMICOLON_SEPARATOR)); + return casSessionId; + } + + /** + * Obtain the login ticket from the returned login page response. + * @param preLoginResponse Response of the login page request + * @return loginTicket Login authentication ticket + */ + private String getLoginTicket(HttpResponse preLoginResponse) + { + BufferedReader bufferedReader = null; + String loginTicket = ""; + try + { + InputStream inputStream = preLoginResponse.getEntity().getContent(); + + // When the http response is not empty, the context attribute is not null. + bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + String lineContent = ""; + while (null != lineContent) + { + lineContent = bufferedReader.readLine(); + if ((null != lineContent) && (lineContent.contains(LOGINTICKET_STRING))) + { + // Delete spaces at the beginning and end of the line. + lineContent = lineContent.trim(); + // If LOGINTICKET_STRING (name=\"loginTicket\" value=) exists, split it based on the double quotation marks. The array length cannot be less than 6. + loginTicket = lineContent.split(DOUBLE_QUOTAYION)[LOGINTICKET_INDEX]; + break; + } + } + } + catch (Exception e) + { + LOG.error("Get loginTicket failed."); + } + finally + { + if (bufferedReader != null) + { + try + { + bufferedReader.close(); + } + catch (IOException e) + { + LOG.warn("Close buffer reader failed."); + } + } + } + return loginTicket; + } + + /** + * Obtain the TGC from the response of the request for logging in to the CAS Server. + * @param loginPostResponse Response object + * @return TGC Authenticated ticket + */ + private String getCASTGC(HttpResponse loginPostResponse) + { + Header header = loginPostResponse.getLastHeader(SET_COOKIE); + String casTgcHeader = header == null ? "" : header.getValue(); + String tempCasTgc = casTgcHeader.split(SEMICOLON_SEPARATOR)[0]; + if (StringUtils.isEmpty(tempCasTgc)) + { + return ""; + } + String casTgc = tempCasTgc.substring(CAS_TGC_STRING.length()); + this.tgc = casTgc; + return casTgc; + } + + /** + * Log in to the CAS server and verify user information. + * @param casUrl CAS server address + * @param webUrl Web application address + * @param userName Login username + * @param password Login password + * @param casSessionId CAS session ID + * @param loginTicket CAS login ticket + * @return http client HTTP client + */ + private HttpResponse loginCasServer(String casUrl, String webUrl, String userName, String password, + HttpClient httpClient, String casSessionId, String loginTicket,String userTLSVersion) + { + if (ParamsValidUtil.isEmpty(casUrl, webUrl, userName, password, casSessionId, loginTicket)) + { + LOG.error("Invalid input param."); + return null; + } + String postUrl = generateCasLoginUrl(casUrl, webUrl); + LOG.info("login cas server URL is : {}.", postUrl); + + HttpPost httpPost = new HttpPost(postUrl); + List FormData = new ArrayList(); + FormData.add(new BasicNameValuePair("username", userName)); + FormData.add(new BasicNameValuePair("password", password)); + FormData.add(new BasicNameValuePair("lt", loginTicket)); + FormData.add(new BasicNameValuePair("_eventId", "submit")); + FormData.add(new BasicNameValuePair("submit", "Login")); + HttpResponse response = null; + BufferedReader bufferedReader = null; + httpPost.addHeader("Cookie", CAS_SESSION_ID_STRING + casSessionId); + + try + { + httpPost.setEntity(new UrlEncodedFormEntity(FormData, ENCODING)); + response = httpClient.execute(httpPost); + LOG.info("Login CasServer status is {}", response.getStatusLine()); + + InputStream inputStream = response.getEntity().getContent(); + bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + String lineContent = ""; + lineContent = bufferedReader.readLine(); + + // Performs corresponding operations based on the message returned. Currently, only two types of results are returned on the CAS login page in Java mode. + while (lineContent != null) + { + // Incorrect username or password + if (lineContent.contains(WRONGPASSWORD)) + { + LOG.error("The username or password is wrong"); + } + // Reset the password upon the first login. + if (lineContent.contains(RESETPASSWORD)) + { + LOG.warn("Login first time,please reset password."); + } + lineContent = bufferedReader.readLine(); + } + } + catch (Exception e) + { + LOG.error("Login cas server failed."); + } + finally + { + if (bufferedReader != null) + { + try + { + bufferedReader.close(); + } + catch (IOException e) + { + LOG.error("Login cas server failed because of IOException."); + } + } + } + return response; + } + + /** + * Generate a complete URL for logging in to CAS. + * After the login is successful, the specified CAS security check page is displayed. + * @param casUrl + * @param webUrl + * @return + */ + private String generateCasLoginUrl(String casUrl, String webUrl) + { + StringBuilder sb = new StringBuilder(); + sb.append(casUrl); + sb.append("?service="); + sb.append(webUrl); + sb.append("/cas_security_check.htm"); + return sb.toString(); + } + + /** + * Initiate a request for web application login verification. + * @param webUrl Web application URL + * @param httpclient http client + * @return response Login verification response object + */ + private HttpResponse webLoginCheck(String webUrl, HttpClient httpclient) + { + // Web login authentication request path + HttpGet loginCheckHttpGet = new HttpGet(webUrl + "/v1/access/login_check"); + LOG.info("web login check URL is: {}.", (webUrl + "/v1/access/login_check ")); + + HttpResponse response = null; + BufferedReader bufferedReader = null; + InputStream inputStream = null; + try + { + response = httpclient.execute(loginCheckHttpGet); + inputStream = response.getEntity().getContent(); + bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + String lineContent = ""; + lineContent = bufferedReader.readLine(); + LOG.info("response content is {} : " + lineContent); + } + catch (Exception e) + { + LOG.error("Get loginTicket failed."); + } + finally + { + if (bufferedReader != null) + { + try + { + bufferedReader.close(); + } + catch (IOException e) + { + LOG.warn("Close bufferedReader failed."); + } + } + if (inputStream != null) + { + try + { + inputStream.close(); + } + catch (IOException e) + { + LOG.warn("Close inputStream failed."); + } + } + } + return response; + } + } + +HttpManager.java +---------------- + +This class provides specific GET and POST request methods. + +.. code-block:: + + package com.MRS.operation; + + import java.io.BufferedReader; + import java.io.File; + import java.io.FileReader; + import java.io.IOException; + import java.io.InputStream; + import java.io.InputStreamReader; + import java.util.LinkedList; + import java.util.List; + import org.apache.http.HttpResponse; + import org.apache.http.client.HttpClient; + import org.apache.http.client.methods.HttpDelete; + import org.apache.http.client.methods.HttpGet; + import org.apache.http.client.methods.HttpPost; + import org.apache.http.entity.StringEntity; + import org.slf4j.Logger; + import org.slf4j.LoggerFactory; + + public class HttpManager + { + private static final String ENCODING = "UTF-8"; + private static final Logger LOG = LoggerFactory.getLogger(HttpManager.class); + + /** + * Send an httpGet request based on the input parameters such as httpclient and url. + * @param httpclient + * @param operationUrl + */ + public String sendHttpGetRequest(HttpClient httpClient, String operationUrl) + { + if (operationUrl == null || operationUrl.isEmpty()) + { + LOG.error("The operationUrl is emptey."); + return null; + } + LOG.info("The operationUrl is:{}", operationUrl); + + BufferedReader bufferedReader = null; + InputStream inputStream = null; + StringBuffer lineContent = new StringBuffer(); + try + { + HttpGet httpGet = new HttpGet(operationUrl); + HttpResponse rsp = httpClient.execute(httpGet); + LOG.info("Operation status is {}.", rsp.getStatusLine()); + inputStream = rsp.getEntity().getContent(); + bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + + String temp = bufferedReader.readLine(); + while (temp != null) + { + lineContent.append(temp); + temp = bufferedReader.readLine(); + } + bufferedReader.close(); + inputStream.close(); + LOG.info("The get response lineContent is {}.", lineContent); + } + catch (Exception e) + { + LOG.info("Send http get request field.."); + } + finally + { + if (bufferedReader != null) + { + try + { + bufferedReader.close(); + } + catch (IOException e) + { + LOG.info("Close bufferedReader failed."); + } + } + if (inputStream != null) + { + try + { + inputStream.close(); + } + catch (IOException e) + { + LOG.info("Close inputStream failed."); + } + } + } + LOG.info("SendHttpGetMessage completely."); + return lineContent.toString(); + } + + /** + * Send an httpPost request based on the input parameters such as httpclient, url, and jsonFilePath. + * @param httpclient + * @param operationUrl + * @param jsonFilePath + * @return Return the operation command ID. + */ + public void sendHttpPostRequest(HttpClient httpClient, String operationUrl, String jsonFilePath) + { + if (jsonFilePath == null || jsonFilePath.isEmpty()) + { + LOG.error("The jsonFilePath is emptey."); + } + + String filePath = jsonFilePath; + File jsonFile = null; + BufferedReader br = null; + InputStream inputStream = null; + BufferedReader bufferedReader = null; + try + { + jsonFile = new File(filePath); + List list = new LinkedList(); + br = new BufferedReader(new FileReader(jsonFile)); + String temp = br.readLine(); + // Add the request body in the JSON file to the list. Each line is a complete request. A request may be a line or multiple lines. Multiple HTTP requests need to be sent for multiple lines. + while (temp != null) + { + list.add(temp); + temp = br.readLine(); + } + br.close(); + + for (int line = 0; line < list.size(); line++) + { + String tempString = list.get(line); + String json = tempString; + + if (json == null || json.length() == 0) + { + break; + } + + HttpResponse response = null; + // Build a request header and a request body. + HttpPost httpPost = new HttpPost(operationUrl); + httpPost.addHeader("Content-Type", "application/json;charset=UTF-8"); + httpPost.setEntity(new StringEntity(json, "text/plain", ENCODING)); + // Send a POST request. + response = httpClient.execute(httpPost); + + String status = response.getStatusLine().toString(); + LOG.info("The status is :{} ", status); + + inputStream = response.getEntity().getContent(); + bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + String lineContent = ""; + lineContent = bufferedReader.readLine(); + LOG.info("the post response lineContent is {}.", lineContent); + + bufferedReader.close(); + inputStream.close(); + LOG.info("sendHttpPostRequest completely."); + } + } + catch (Exception e) + { + LOG.error("Send http post request field."); + } + finally + { + if (bufferedReader != null) + { + try + { + bufferedReader.close(); + } + catch (IOException e) + { + LOG.info("Close bufferedReader failed."); + } + } + if (inputStream != null) + { + try + { + inputStream.close(); + } + catch (IOException e) + { + LOG.info("Close inputStream failed."); + } + } + if (br != null) + { + try + { + br.close(); + } + catch (IOException e) + { + LOG.info("Close bufferedReader failed."); + } + } + } + } + } + +MRSSSLSocketFactory.java +------------------------ + +.. code-block:: + + package com.MRS.operation; + + import java.io.IOException; + import java.net.Socket; + import javax.net.ssl.SSLContext; + import javax.net.ssl.SSLSocket; + import org.apache.http.conn.ssl.SSLSocketFactory; + import org.apache.http.conn.ssl.X509HostnameVerifier; + import org.apache.http.params.HttpParams; + + /** + * Make the TLS version set by the user take effect. + * Inherit SSLSocketFactory. + */ + public class MRSSSLSocketFactory extends SSLSocketFactory + { + private static String[] enabelPro = {"TLS"}; + + public MRSSSLSocketFactory(SSLContext sslContext, X509HostnameVerifier hostnameVerifier,String userTLSVersion) + { + super(sslContext, hostnameVerifier); + enabelPro[0] = userTLSVersion; + } + + @Override + public Socket createSocket(HttpParams params) + throws IOException + { + Socket result = super.createSocket(params); + ((SSLSocket)result).setEnabledProtocols(enabelPro); + return result; + } + } + +WebClientWrapper.java +--------------------- + +.. code-block:: + + package com.MRS.operation; + + import java.security.KeyManagementException; + import java.security.NoSuchAlgorithmException; + import java.security.SecureRandom; + import java.security.cert.CertificateException; + import java.security.cert.X509Certificate; + import javax.net.ssl.SSLContext; + import javax.net.ssl.TrustManager; + import javax.net.ssl.X509TrustManager; + import org.apache.http.client.HttpClient; + import org.apache.http.conn.ClientConnectionManager; + import org.apache.http.conn.scheme.Scheme; + import org.apache.http.conn.scheme.SchemeRegistry; + import org.apache.http.conn.ssl.SSLSocketFactory; + import org.apache.http.impl.client.DefaultHttpClient; + + public class WebClientWrapper + { + /** + * Extend the HttpClient class to automatically accept all certificates. + * @param base + * @param userTLSVersion + * @return + */ + public static HttpClient wrapClient(HttpClient baseHttpClient, String userTLSVersion) + { + ClientConnectionManager clientConnectionManager; + SSLContext sslContext = null; + try { + sslContext = SSLContext.getInstance(userTLSVersion); + } + catch (NoSuchAlgorithmException e1) + { + e1.printStackTrace(); + } + + if (sslContext == null) + { + return null; + } + + X509TrustManager tm = new X509TrustManager() + { + public X509Certificate[] getAcceptedIssuers() + { + return null; + } + + public void checkClientTrusted(X509Certificate ax509certificate[], String s) throws CertificateException + { + } + + public void checkServerTrusted(X509Certificate ax509certificate[], String s) throws CertificateException + { + } + }; + + try + { + sslContext.init(null, new TrustManager[] {tm}, new SecureRandom()); + } + catch (KeyManagementException e) + { + e.printStackTrace(); + } + + SSLSocketFactory sslSocketFactory = null; + if(userTLSVersion == null || userTLSVersion.isEmpty() || userTLSVersion.equals("TLS")) + { + sslSocketFactory = new SSLSocketFactory(sslContext, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); + } + else + { + sslSocketFactory = new MRSSSLSocketFactory(sslContext, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER,userTLSVersion); + } + + clientConnectionManager = baseHttpClient.getConnectionManager(); + SchemeRegistry schemeRegistry = clientConnectionManager.getSchemeRegistry(); + schemeRegistry.register(new Scheme("https", 443, sslSocketFactory)); + return new DefaultHttpClient(clientConnectionManager, baseHttpClient.getParams()); + } + } + +ParamsValidUtil.java +-------------------- + +.. code-block:: + + package com.MRS.utils; + + import org.apache.commons.lang.StringUtils; + + public class ParamsValidUtil { + /** + * Check whether there are null parameters. + * @param obj Input parameter set + * @return Whether there are null parameters. + */ + public static boolean isEmpty(String... obj) + { + for (int i = 0; i < obj.length; i++) + { + if (StringUtils.isEmpty(obj[i])) + { + return true; + } + } + return false; + } + } + +S\ **tartService.json** +----------------------- + +.. code-block:: + + {"only_self":true} + +L\ **og4j.properties** +---------------------- + +.. code-block:: + + ##set log4j DEBUG < INFO < WARN < ERROR < FATAL + log4j.logger.com.MRS=INFO,A1,A2_plus + log4j.logger.org.apache.http=INFO,A1,A2_plus + #print to the console?A1 + log4j.appender.A1=org.apache.log4j.ConsoleAppender + log4j.appender.A1.layout=org.apache.log4j.PatternLayout + log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%t] %m %l%n + + #A2_plus the size of the rest.log < 10M, delete cyclicly + log4j.appender.A2_plus=org.wcc.framework.log.SizeRollingZipFileATimeAppender + log4j.appender.A2_plus.File=./conf/Demo.log + log4j.appender.A2_plus.MaxFileSize=10MB + log4j.appender.A2_plus.MaxBackupIndex=20 + log4j.appender.A2_plus.layout=org.apache.log4j.PatternLayout + log4j.appender.A2_plus.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%t] %m %l%n diff --git a/api-ref/source/mrs_manager_api/api_usage_guide/index.rst b/api-ref/source/mrs_manager_api/api_usage_guide/index.rst new file mode 100644 index 0000000..5d81ec3 --- /dev/null +++ b/api-ref/source/mrs_manager_api/api_usage_guide/index.rst @@ -0,0 +1,18 @@ +:original_name: mrs_02_1018.html + +.. _mrs_02_1018: + +API Usage Guide +=============== + +- :ref:`Introduction to MRS Manager APIs ` +- :ref:`API Calling Process ` +- :ref:`Examples ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + introduction_to_mrs_manager_apis + api_calling_process + examples diff --git a/api-ref/source/mrs_manager_api/api_usage_guide/introduction_to_mrs_manager_apis.rst b/api-ref/source/mrs_manager_api/api_usage_guide/introduction_to_mrs_manager_apis.rst new file mode 100644 index 0000000..f4841ac --- /dev/null +++ b/api-ref/source/mrs_manager_api/api_usage_guide/introduction_to_mrs_manager_apis.rst @@ -0,0 +1,158 @@ +:original_name: mrs_02_1019.html + +.. _mrs_02_1019: + +Introduction to MRS Manager APIs +================================ + +MRS Manager APIs are provided for you to query basic information about MRS clusters and monitoring status, as well as start and stop services. + +MRS Manager APIs can be accessed by only nodes in the same VPC as the cluster. + +Clusters with Kerberos authentication disabled can directly call MRS Manager APIs in the same VPC for access. However, clusters with Kerberos authentication enabled must obtain authentication information before calling MRS Manager APIs. + +An MRS Manager API request/response consists of the following six parts: + +- Request URI +- Request mode +- Request header +- Request body +- Response header +- Response body + +Request URI +----------- + +A request URI is in the following format: + +**{URI-scheme} :// {MRS Manager floating IP address} :{MRS Manager port}/ {resource-path} ? {query-string}** + +Although the request URI is included in the request header, most languages or frameworks require that it be transmitted separately from the request message. Therefore, the request URI is listed independently. + +.. table:: **Table 1** URI parameter description + + +-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Description | + +===================================+=============================================================================================================================================================================================================================================================================================================================================================================================================================+ + | URI-scheme | Protocol used to transmit requests. HTTPS must be used in MRS APIs. | + +-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | MRS Manager floating IP address | IP address for logging in to MRS Manager. | + | | | + | | For clusters that support Kerberos authentication (security clusters), the floating IP address (cluster console address) of the cluster is displayed on the basic cluster information page. | + | | | + | | For a non-security cluster that does not support Kerberos authentication, you can log in to the Master2 node of the cluster `using VNC `__ and run the **ifconfig** command to view the floating IP address of the cluster. **eth0:wsom** indicates the floating IP address of MRS Manager. The value of the **inet** parameter is the floating IP address. | + | | | + | | .. note:: | + | | | + | | If the floating IP address of MRS Manager cannot be queried on the Master2 node, switch to the Master1 node to query and record the floating IP address. | + +-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | MRS Manager port | Port number for logging in to the MRS Manager. The default value is **28443**. | + +-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | resource-path | The path for accessing an API. Obtain the value from the URI of the API, for example, **v3/auth/tokens**. | + +-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Query string | Optional. For example, API version or resource selection criterion. | + +-----------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Request Mode +------------ + +HTTP-based request methods, which are also called operations or actions, specify the type of operations that you are requesting. + +.. table:: **Table 2** HTTP method + + +-----------------------------------+----------------------------------------------------------------------------+ + | Method | Description | + +===================================+============================================================================+ + | GET | Requests the server to return specified resources. | + +-----------------------------------+----------------------------------------------------------------------------+ + | PUT | Requests the server to update specified resources. | + +-----------------------------------+----------------------------------------------------------------------------+ + | POST | Requests the server to add resources or perform special operations. | + +-----------------------------------+----------------------------------------------------------------------------+ + | DELETE | Requests the server to delete specified resources, for example, an object. | + +-----------------------------------+----------------------------------------------------------------------------+ + | HEAD | Same as GET except that the server must return only the response header. | + +-----------------------------------+----------------------------------------------------------------------------+ + | PATCH | Requests the server to update partial content of a specified resource. | + | | | + | | If the resource does not exist, a new resource will be created. | + +-----------------------------------+----------------------------------------------------------------------------+ + +Request Header +-------------- + +A request header consists of several header fields. Each header field consists of a field name, a colon (:), and a field value. + +Optional additional request header field, such as the field required by a specified URI and HTTP method. :ref:`Table 3 ` lists common MRS request headers. For details about the request authentication information, see :ref:`Authentication `. + +.. _mrs_02_1019__en-us_topic_0125376273_tb3f5c5f3dfb84fce8aa08057e60545ac: + +.. table:: **Table 3** Common request header fields + + +-----------------+-------------------------------------------------------------+---------------------------------------------------------------------------------------------+------------------+ + | Name | Description | Mandatory | Example | + +=================+=============================================================+=============================================================================================+==================+ + | Content-type | Specifies the request body MIME type. | Yes | application/json | + +-----------------+-------------------------------------------------------------+---------------------------------------------------------------------------------------------+------------------+ + | Content-Length | Specifies the length of the request body. The unit is byte. | This field is mandatory for POST and PUT requests, but must be left blank for GET requests. | 3495 | + +-----------------+-------------------------------------------------------------+---------------------------------------------------------------------------------------------+------------------+ + | X-Language | Request language. The options are as follows: | No | en-us | + | | | | | + | | **en-us**: English | | | + +-----------------+-------------------------------------------------------------+---------------------------------------------------------------------------------------------+------------------+ + +.. note:: + + For details about other headers, see the HTTP protocol. + +Request Body +------------ + +A request body is generally sent in a structured format (for example, JSON or XML). It corresponds to **Content-type** in the request header and is used to transfer content other than the request header. + +Response Header +--------------- + +A response header contains the following parts: + +- HTTP status code, which consists of three digits (2\ *xx* to 5\ *xx*). 2\ *xx* indicates a success response. 4\ *xx* or 5\ *xx* indicates a failure response; Alternatively, a service-defined status code may be returned, as described in this document. + +- Optional additional header fields to support the request's response, such as **Content-type**. For details about common message headers, see :ref:`Table 4 `. + + .. _mrs_02_1019__en-us_topic_0125376273_ta1929fc30fc14e1ebf1cf848648c76d8: + + .. table:: **Table 4** Common response headers + + +----------------+----------------------------------------------------------------------------------------------+-----------+-------------------------------+ + | Parameter | Description | Mandatory | Examples | + +================+==============================================================================================+===========+===============================+ + | Date | (Standard HTTP header). The time when a response is sent, whose format follows RFC 822. | Yes | Mon, 12 Nov 2007 15:55:01 GMT | + +----------------+----------------------------------------------------------------------------------------------+-----------+-------------------------------+ + | Server | (Standard HTTP header). The software information that the server uses to process the request | Yes | Apache | + +----------------+----------------------------------------------------------------------------------------------+-----------+-------------------------------+ + | Content-Length | (Standard HTTP header). The size of a message body in decimal number of bytes | No | xxx | + +----------------+----------------------------------------------------------------------------------------------+-----------+-------------------------------+ + | Content-type | (Standard HTTP header) Media type of the message body sent to a receiver | Yes | application/json | + +----------------+----------------------------------------------------------------------------------------------+-----------+-------------------------------+ + +Response Body +------------- + +A response body is generally returned in a structured format (for example, JSON or XML). It corresponds to **Content-type** in the response header and is used to transfer content other than the response header. + +Initiating a Request +-------------------- + +You can initiate a request based on the constructed request message using any of the following: + +- cURL + + cURL is a command-line tool used to perform URL operations and transmit information. It serves as an HTTP client that can send HTTP requests to the server and receive response messages. cURL is applicable to API debugging. For more information about cURL, visit https://curl.haxx.se/. + +- Encoding + + You can call APIs using code to assemble, send, and process request messages. + +- REST client + + Both Mozilla Firefox and Google Chrome provide a graphical browser plug-in, that is, REST client, to send and process requests. For Mozilla Firefox, see `Firefox REST Client `__. For Google Chrome, see `Chrome REST Client `__. diff --git a/api-ref/source/mrs_manager_api/index.rst b/api-ref/source/mrs_manager_api/index.rst new file mode 100644 index 0000000..902d5c8 --- /dev/null +++ b/api-ref/source/mrs_manager_api/index.rst @@ -0,0 +1,18 @@ +:original_name: mrs_02_1082.html + +.. _mrs_02_1082: + +MRS Manager API +=============== + +- :ref:`API Usage Guide ` +- :ref:`MRS Manager CAS APIs ` +- :ref:`MRS Manager Web APIs ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + api_usage_guide/index + mrs_manager_cas_apis/index + mrs_manager_web_apis/index diff --git a/api-ref/source/mrs_manager_api/mrs_manager_cas_apis/index.rst b/api-ref/source/mrs_manager_api/mrs_manager_cas_apis/index.rst new file mode 100644 index 0000000..271c73b --- /dev/null +++ b/api-ref/source/mrs_manager_api/mrs_manager_cas_apis/index.rst @@ -0,0 +1,16 @@ +:original_name: mrs_02_1083.html + +.. _mrs_02_1083: + +MRS Manager CAS APIs +==================== + +- :ref:`Logging In to the CAS ` +- :ref:`Logging Out of the CAS ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + logging_in_to_the_cas + logging_out_of_the_cas diff --git a/api-ref/source/mrs_manager_api/mrs_manager_cas_apis/logging_in_to_the_cas.rst b/api-ref/source/mrs_manager_api/mrs_manager_cas_apis/logging_in_to_the_cas.rst new file mode 100644 index 0000000..ba53818 --- /dev/null +++ b/api-ref/source/mrs_manager_api/mrs_manager_cas_apis/logging_in_to_the_cas.rst @@ -0,0 +1,78 @@ +:original_name: mrs_02_1084.html + +.. _mrs_02_1084: + +Logging In to the CAS +===================== + +Function +-------- + +This API is used to submit a CAS login request. This API can be used only by security clusters that support Kerberos authentication. + +URI +--- + +POST /cas/login + +Request +------- + +- Example: + +.. code-block:: text + + POST /cas/login HTTP/1.1 + Host: example.com + Content-Type: application/json + Accept:application/json + username: String + password: String + lt: String + _eventId: String + Submit: String + +- Parameter description + ++-----------+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Parameter | Mandatory or Not | Description | ++===========+==================+===================================================================================================================================================================================================================+ +| username | Yes | User name | ++-----------+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| password | Yes | Password | ++-----------+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| lt | Yes | Login ticket. Follow instructions in step 1 in the **Obtaining Request Authentication Information** part of the section :ref:`API Calling Process ` to send a GET request to obtain **loginTicket**. | ++-----------+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| \_eventId | Yes | Event type. The default value is **submit**. | ++-----------+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| submit | Yes | Submission type. The default value is **Login**. | ++-----------+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Response +-------- + +- Example + + .. code-block:: + + HTTP/1.1 200 OK + Data:Wed,02 May 2018 10:10:01 GMT + Server: example-server + Content-Type: application/json + +- Parameter description + + None + +Status Code +----------- + +.. table:: **Table 1** Status code + + =========== ======================== + Status Code Description + =========== ======================== + 200 The login is successful. + =========== ======================== + +For details about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/mrs_manager_api/mrs_manager_cas_apis/logging_out_of_the_cas.rst b/api-ref/source/mrs_manager_api/mrs_manager_cas_apis/logging_out_of_the_cas.rst new file mode 100644 index 0000000..2d49477 --- /dev/null +++ b/api-ref/source/mrs_manager_api/mrs_manager_cas_apis/logging_out_of_the_cas.rst @@ -0,0 +1,59 @@ +:original_name: mrs_02_1085.html + +.. _mrs_02_1085: + +Logging Out of the CAS +====================== + +Function +-------- + +This API is used to destruct the CAS single sign-on (SSO) session of a client. This API can be used only by security clusters that support Kerberos authentication. + +URI +--- + +POST /cas/logout + +Request +------- + +- Example: + + .. code-block:: text + + POST /cas/logout HTTP/1.1 + Host: example.com + Content-Type: application/json + Accept:application/json + +- Parameter description + + None + +Response +-------- + +- Example: + + .. code-block:: + + HTTP/1.1 200 OK + Data:Wed,02 May 2018 10:10:01 GMT + Server: example-server + Content-Type: application/json + +- Parameter description + + None + +Status Code +----------- + +=========== ========================= +Status Code Description +=========== ========================= +200 The logout is successful. +=========== ========================= + +For details about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/mrs_manager_api/mrs_manager_web_apis/checking_the_login.rst b/api-ref/source/mrs_manager_api/mrs_manager_web_apis/checking_the_login.rst new file mode 100644 index 0000000..8b3b7f8 --- /dev/null +++ b/api-ref/source/mrs_manager_api/mrs_manager_web_apis/checking_the_login.rst @@ -0,0 +1,93 @@ +:original_name: mrs_02_1087.html + +.. _mrs_02_1087: + +Checking the Login +================== + +Function +-------- + +This API is used to check the login after a login request is submitted. + +URI +--- + +GET /web/v1/access/login_check + +Request +------- + +- Example: + + .. code-block:: text + + GET /web/v1/access/login_check HTTP/1.1 + Host: example.com + Content-Type: application/json + Accept:application/json + +- Parameter description + + None + +Response +-------- + +- Example: + + .. code-block:: + + HTTP/1.1 200 OK + Data:Wed,02 May 2018 10:10:01 GMT + Server: example-server + Content-Type: application/json + { + "id": 0, + "state": "NEW", + "error_code": 0, + "error_description": "string", + "total_progress": 0, + "modify_pwd": true, + "exist_cluster": true, + "remind_pwd": true, + "ref_URL": "string" + "token": "string" + } + +- Response parameter description + ++-------------------+------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Parameter | Mandatory or Not | Type | Description | ++===================+==================+=========+===================================================================================================================================================================+ +| id | No | LONG | Asynchronous task ID (meaningless in other scenarios). The default value is **-1**. | ++-------------------+------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| state | No | STRING | Cluster status. The value **FAILED** indicates that the command fails to be executed. The value **COMPLETE** indicates that the command is successfully executed. | ++-------------------+------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| error_code | No | INTEGER | Error code returned | ++-------------------+------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| error_description | No | STRING | Error code description | ++-------------------+------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| total_progress | No | FLOAT | Total progress | ++-------------------+------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| modify_pwd | No | BOOLEAN | Whether to change the password. The password does not need to be changed by default. | ++-------------------+------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| exist_cluster | No | BOOLEAN | Whether a cluster exists | ++-------------------+------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| remind_pwd | No | BOOLEAN | Whether to remind the user to change the password | ++-------------------+------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ref_URL | No | STRING | URL to be redirected | ++-------------------+------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| token | No | STRING | Token that is responded after login and check | ++-------------------+------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Status Code +----------- + +=========== ============================ +Status Code Description +=========== ============================ +200 The operation is successful. +=========== ============================ + +For details about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/mrs_manager_api/mrs_manager_web_apis/index.rst b/api-ref/source/mrs_manager_api/mrs_manager_web_apis/index.rst new file mode 100644 index 0000000..fc70cfd --- /dev/null +++ b/api-ref/source/mrs_manager_api/mrs_manager_web_apis/index.rst @@ -0,0 +1,34 @@ +:original_name: mrs_02_1086.html + +.. _mrs_02_1086: + +MRS Manager Web APIs +==================== + +- :ref:`Checking the Login ` +- :ref:`Modifying the Password of the Current Login User ` +- :ref:`Querying the Health Status of a Specified Cluster ` +- :ref:`Querying Basic Information About a Specified Cluster ` +- :ref:`Querying the Command Execution Progress ` +- :ref:`Saving Configurations ` +- :ref:`Logging Out Of a Session ` +- :ref:`Starting a Service ` +- :ref:`Stopping a Service ` +- :ref:`Querying Monitoring Data ` +- :ref:`Querying Summary of a Specified Service ` + +.. toctree:: + :maxdepth: 1 + :hidden: + + checking_the_login + modifying_the_password_of_the_current_login_user + querying_the_health_status_of_a_specified_cluster + querying_basic_information_about_a_specified_cluster + querying_the_command_execution_progress + saving_configurations + logging_out_of_a_session + starting_a_service + stopping_a_service + querying_monitoring_data + querying_summary_of_a_specified_service diff --git a/api-ref/source/mrs_manager_api/mrs_manager_web_apis/logging_out_of_a_session.rst b/api-ref/source/mrs_manager_api/mrs_manager_web_apis/logging_out_of_a_session.rst new file mode 100644 index 0000000..242fc53 --- /dev/null +++ b/api-ref/source/mrs_manager_api/mrs_manager_web_apis/logging_out_of_a_session.rst @@ -0,0 +1,79 @@ +:original_name: mrs_02_1093.html + +.. _mrs_02_1093: + +Logging Out Of a Session +======================== + +Function +-------- + +This API is used to return a temporary redirection, that is, a URL for logging out of the CAS, when you log out of the MapReduce Service system. This API can be used only by security clusters that support Kerberos authentication. + +URI +--- + +- Format + +GET /web/v1/logout_action + +- Parameter description + +.. table:: **Table 1** URI parameter description + + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory or Not | Description | + +=======================+=======================+=============================================================================================================================================================================+ + | is_timeout_logout | No | Whether to exit due to page timeout. This parameter is optional. Different audit logs are recorded in the background when a user logs out manually or exits due to timeout. | + | | | | + | | | Possible values are as follows: | + | | | | + | | | **true**: Logout due to timeout | + | | | | + | | | **false**: Manual logout | + | | | | + | | | The default value is **false**. | + +-----------------------+-----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Request +------- + +- Example: + + .. code-block:: text + + GET /web/v1/logout_action?is_timeout_logout=null HTTP/1.1 + Host: example.com + Content-Type: application/json + Accept:application/json + +- Parameter description + + None + +Response +-------- + +- Example: + + .. code-block:: + + HTTP/1.1 200 OK + Data:Wed,02 May 2018 10:10:01 GMT + Server: example-server + Content-Type: application/json + +- Parameter description + + None + +Status Code +----------- + +=========== ============================ +Status Code Description +=========== ============================ +200 The operation is successful. +=========== ============================ + +For details about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/mrs_manager_api/mrs_manager_web_apis/modifying_the_password_of_the_current_login_user.rst b/api-ref/source/mrs_manager_api/mrs_manager_web_apis/modifying_the_password_of_the_current_login_user.rst new file mode 100644 index 0000000..468d00e --- /dev/null +++ b/api-ref/source/mrs_manager_api/mrs_manager_web_apis/modifying_the_password_of_the_current_login_user.rst @@ -0,0 +1,81 @@ +:original_name: mrs_02_1088.html + +.. _mrs_02_1088: + +Modifying the Password of the Current Login User +================================================ + +Function +-------- + +This API is used to change the password of the current login user. This API can be used only by security clusters that support Kerberos authentication. + +URI +--- + +- Format + +POST /web/v1/access/modify_self_password + +- Parameter description + +================ ================ ================ +Parameter Mandatory or Not Description +================ ================ ================ +old_password Yes Old password +new_password Yes New password +confirm_password Yes Confirm password +================ ================ ================ + +Request +------- + +- Example: + + .. code-block:: text + + POST /web/v1/access/modify_self_password?old_password=null&new_password=null& confirm_password=null HTTP/1.1 + Host: example.com + Content-Type: application/json + Accept:application/json + +- Parameter description + + None + +Response +-------- + +- Example: + + .. code-block:: + + HTTP/1.1 200 OK + Data:Wed,02 May 2018 10:10:01 GMT + Server: example-server + Content-Type: application/json + { + "int_result_code": 0, + "result_desc": "string" + } + +- Parameter description + ++-----------------+------------------+---------+----------------------------------+ +| Parameter | Mandatory or Not | Type | Description | ++=================+==================+=========+==================================+ +| int_result_code | No | INTEGER | Code of the return result | ++-----------------+------------------+---------+----------------------------------+ +| result_desc | No | STRING | Description of the return result | ++-----------------+------------------+---------+----------------------------------+ + +Status Code +----------- + +=========== ============================ +Status Code Description +=========== ============================ +200 The operation is successful. +=========== ============================ + +For details about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/mrs_manager_api/mrs_manager_web_apis/querying_basic_information_about_a_specified_cluster.rst b/api-ref/source/mrs_manager_api/mrs_manager_web_apis/querying_basic_information_about_a_specified_cluster.rst new file mode 100644 index 0000000..2b15285 --- /dev/null +++ b/api-ref/source/mrs_manager_api/mrs_manager_web_apis/querying_basic_information_about_a_specified_cluster.rst @@ -0,0 +1,134 @@ +:original_name: mrs_02_1090.html + +.. _mrs_02_1090: + +Querying Basic Information About a Specified Cluster +==================================================== + +Function +-------- + +This API is used to query basic information about a specified cluster. + +URI +--- + +GET /web/v1/clusters + +Request +------- + +- Example: + + .. code-block:: text + + GET /web/v1/clusters HTTP/1.1 + Host: example.com + Content-Type: application/json + Accept:application/json + +- Parameter description + + None + +Response +-------- + +- Example: + + .. code-block:: + + HTTP/1.1 200 OK + Data:Wed,02 May 2018 10:10:01 GMT + Server: example-server + Content-Type: application/json + { + "id": 0, + "state": "COMPLETE", + "error_code": 0, + "error_description": "string", + "total_progress": 0, + "res_obj": { + "clusters": [ + { + "stack": "string", + "id": 0, + "name": "string", + "description": "string", + "version": "string", + "cluster_state": "string", + "stack_model": "string", + "lic_state": "string" + } + ] + } + } + +- Parameter description + +.. table:: **Table 1** Response parameter description + + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory or Not | Type | Description | + +===================+==================+===========+===================================================================================================================================================================+ + | id | No | LONG | Asynchronous task ID (meaningless in other scenarios). The default value is **-1**. | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | state | No | STRING | Cluster status. The value **FAILED** indicates that the command fails to be executed. The value **COMPLETE** indicates that the command is successfully executed. | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | error_code | No | INTEGER | Error code returned | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | error_description | No | STRING | Error code description | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | total_progress | No | FLOAT | Total progress | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | res_obj | No | REFERENCE | Response object | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. table:: **Table 2** **res_obj** parameter description + + +-----------+------------------+-----------------+-------------------------------------------+ + | Parameter | Mandatory or Not | Type | Description | + +===========+==================+=================+===========================================+ + | clusters | No | ARRAY_REFERENCE | Records all installed clusters in arrays. | + +-----------+------------------+-----------------+-------------------------------------------+ + +.. table:: **Table 3** **clusters** parameter description + + +-----------------+------------------+-----------------+-------------------------------------------------------------+ + | Parameter | Mandatory or Not | Type | Description | + +=================+==================+=================+=============================================================+ + | stack | No | STRING | Cluster version information | + +-----------------+------------------+-----------------+-------------------------------------------------------------+ + | id | No | INTEGER | Cluster ID | + +-----------------+------------------+-----------------+-------------------------------------------------------------+ + | name | No | STRING | Cluster name | + +-----------------+------------------+-----------------+-------------------------------------------------------------+ + | description | No | STRING | Cluster description | + +-----------------+------------------+-----------------+-------------------------------------------------------------+ + | version | No | STRING | Cluster version | + +-----------------+------------------+-----------------+-------------------------------------------------------------+ + | cluster_state | No | STRING | Cluster status. Possible values are as follows: | + | | | | | + | | | | **Null**: There is no special status. | + | | | | | + | | | | **installingPatch**: The patch is being installed. | + +-----------------+------------------+-----------------+-------------------------------------------------------------+ + | stack_model | No | STRING | Security mode of a cluster. Possible values are as follows: | + | | | | | + | | | | NoSec: Normal mode | + | | | | | + | | | | Sec: Security mode | + +-----------------+------------------+-----------------+-------------------------------------------------------------+ + | lic_state | No | STRING | License status | + +-----------------+------------------+-----------------+-------------------------------------------------------------+ + +Status Code +----------- + +=========== ============================ +Status Code Description +=========== ============================ +200 The operation is successful. +=========== ============================ + +For details about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/mrs_manager_api/mrs_manager_web_apis/querying_monitoring_data.rst b/api-ref/source/mrs_manager_api/mrs_manager_web_apis/querying_monitoring_data.rst new file mode 100644 index 0000000..21e04c2 --- /dev/null +++ b/api-ref/source/mrs_manager_api/mrs_manager_web_apis/querying_monitoring_data.rst @@ -0,0 +1,152 @@ +:original_name: mrs_02_1096.html + +.. _mrs_02_1096: + +Querying Monitoring Data +======================== + +Function +-------- + +This API is used to query performance monitoring items supported by a specified host. + +URI +--- + +- Format + +GET /web/v1/monitor/metrics_info + +- Parameter description + ++-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Parameter | Mandatory or Not | Description | ++=======================+=======================+=========================================================================================================================================================================+ +| metric_names | Yes | Monitoring metric name. Use commas (,) to separate metric names. You can enter a maximum of 10 metric names at a time. | +| | | | +| | | Example metric names are as follows: | +| | | | +| | | - **hm_cpu_used**: CPU usage | +| | | - **hm_cpu_core_num**: Number of CPU cores | ++-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| metric_period | No | Metric period, which can be real time, 5 minutes, 30 minutes, or 60 minutes | ++-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| start_time | No | Start time, expressed in milliseconds. The data type is Long. The default value is the earliest system time. | ++-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| end_time | No | End time, expressed in milliseconds. The data type is Long. The default value is the latest system time. | ++-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| hosts | No | List of host names to be queried. Use commas (,) to separate host names. You can enter a maximum of 50 host names to meet the input length requirements of the browser. | ++-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| host_group | No | Name of the host group created by a user. This function is not available in the current version. | ++-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| metric_node_type | No | You can set this parameter to obtain the monitoring metrics of a node. The possible values are as follows: | +| | | | +| | | - **active**: Indicates that you can obtain monitoring metrics of the active node. | +| | | - **standby**: Indicates that you can obtain monitoring metrics of the standby node. | +| | | - **all**: Indicates that you can obtain monitoring metrics of all nodes. | ++-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| extend | No | Metric extended field, which records information about small metrics | ++-----------------------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Request +------- + +- Example: + + .. code-block:: text + + GET /web/v1/monitor/metrics_info?metric_names=null&metric_period=null&start_time=null&end_time=null&hosts=null&host_group=null&metric_node_type=null&extend=null HTTP/1.1 + Host: example.com + Content-Type: application/json + Accept:application/json + +- Parameter description + + None + +Response +-------- + +- Example: + +.. code-block:: + + HTTP/1.1 200 OK + Data:Wed,02 May 2018 10:10:01 GMT + Server: example-server + Content-Type: application/json + { + "id": 0, + "state": "COMPLETE", + "error_code": 0, + "error_description": "string", + "total_progress": 0, + "res_obj": { + "metric_datas": { + "additionalProp1": [ + { + "time": 0, + "value": "string", + "node": "string" + } + ] + } + } + } + +- Request parameter description + +.. table:: **Table 1** Response parameter description + + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory or Not | Type | Description | + +===================+==================+===========+===================================================================================================================================================================+ + | id | No | LONG | Asynchronous task ID (meaningless in other scenarios). The default value is **-1**. | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | state | No | STRING | Cluster status. The value **FAILED** indicates that the command fails to be executed. The value **COMPLETE** indicates that the command is successfully executed. | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | error_code | No | INTEGER | Error code returned | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | error_description | No | STRING | Error code description | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | total_progress | No | FLOAT | Total progress | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | res_obj | No | REFERENCE | Response object | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. table:: **Table 2** **res_obj** parameter description + + +-----------------+------------------+-----------------+----------------------------------------------------------------+ + | Parameter | Mandatory or Not | Type | Description | + +=================+==================+=================+================================================================+ + | metric_datas | No | MAP | Monitoring data. | + | | | | | + | | | | Key indicates the name of a monitoring item. | + | | | | | + | | | | Value indicates a list of monitored metric parameters queried. | + +-----------------+------------------+-----------------+----------------------------------------------------------------+ + +.. table:: **Table 3** **metricDataBean** parameter description + + +-----------+------------------+------------+----------------------------------------------------------------------+ + | Parameter | Mandatory or Not | Type | Description | + +===========+==================+============+======================================================================+ + | time | No | BIGDECIMAL | Time when monitoring metric value is collected | + +-----------+------------------+------------+----------------------------------------------------------------------+ + | value | No | STRING | Monitoring metric value | + +-----------+------------------+------------+----------------------------------------------------------------------+ + | node | No | STRING | Node where the monitoring metric is collected | + +-----------+------------------+------------+----------------------------------------------------------------------+ + | extend | No | STRING | Metric extended field, which records information about small metrics | + +-----------+------------------+------------+----------------------------------------------------------------------+ + +Status Code +----------- + +=========== ============================ +Status Code Description +=========== ============================ +200 The operation is successful. +=========== ============================ + +For details about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/mrs_manager_api/mrs_manager_web_apis/querying_summary_of_a_specified_service.rst b/api-ref/source/mrs_manager_api/mrs_manager_web_apis/querying_summary_of_a_specified_service.rst new file mode 100644 index 0000000..4b57853 --- /dev/null +++ b/api-ref/source/mrs_manager_api/mrs_manager_web_apis/querying_summary_of_a_specified_service.rst @@ -0,0 +1,122 @@ +:original_name: mrs_02_1097.html + +.. _mrs_02_1097: + +Querying Summary of a Specified Service +======================================= + +Function +-------- + +This API is used to query summary of a specified service in a cluster. + +URI +--- + +- Format + +GET /web/v1/cluster/{cluster_id}/services/{service_name} + +- URI parameter description + ++-----------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Parameter | Mandatory or Not | Description | ++=======================+=======================+======================================================================================================================================================+ +| cluster_id | Yes | Cluster ID that is displayed on MRS Manager. The default cluster ID is **1**, because MRS Manager supports management of only one cluster currently. | ++-----------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+ +| service_name | Yes | Name of the service to be queried. | +| | | | +| | | For example, the service name is HBase, HDFS, or Spark. | ++-----------------------+-----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Request +------- + +- Example: + + .. code-block:: text + + GET /web/v1/cluster/{cluster_id}/services/{service_name} HTTP/1.1 + Host: example.com + Content-Type: application/json + Accept:application/json + +- Parameter description + + None + +Response +-------- + +- Example: + + .. code-block:: + + HTTP/1.1 200 OK + Data:Wed,02 May 2018 10:10:01 GMT + Server: example-server + Content-Type: application/json { + "id": 0, + "state": "NEW", + "error_code": 0, + "error_description": "string", + "total_progress": 0, + "res_obj": { + "key_property": [ + { + "name": "string", + "value": {}, + "type": "TEXT" + } + ] + } + } + +- Parameter description + + .. table:: **Table 1** Response parameter description + + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory or Not | Type | Description | + +===================+==================+===========+===================================================================================================================================================================+ + | id | No | LONG | Asynchronous task ID (meaningless in other scenarios). The default value is **-1**. | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | state | No | STRING | Cluster status. The value **FAILED** indicates that the command fails to be executed. The value **COMPLETE** indicates that the command is successfully executed. | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | error_code | No | INTEGER | Error code returned | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | error_description | No | STRING | Error code description | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | total_progress | No | FLOAT | Total progress | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | res_obj | No | REFERENCE | Response object | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + + .. table:: **Table 2** **res_obj** parameter description + + +-----------------+------------------+-----------------+----------------------+ + | Parameter | Mandatory or Not | Type | Description | + +=================+==================+=================+======================+ + | name | No | STRING | Property name | + +-----------------+------------------+-----------------+----------------------+ + | value | No | | Property value | + +-----------------+------------------+-----------------+----------------------+ + | type | No | ENUM | Property type | + | | | | | + | | | | Possible values are: | + | | | | | + | | | | **STATUS** | + | | | | | + | | | | **TEXT** | + +-----------------+------------------+-----------------+----------------------+ + +Status Code +----------- + +=========== ============================ +Status Code Description +=========== ============================ +200 The operation is successful. +=========== ============================ + +For details about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/mrs_manager_api/mrs_manager_web_apis/querying_the_command_execution_progress.rst b/api-ref/source/mrs_manager_api/mrs_manager_web_apis/querying_the_command_execution_progress.rst new file mode 100644 index 0000000..add1b47 --- /dev/null +++ b/api-ref/source/mrs_manager_api/mrs_manager_web_apis/querying_the_command_execution_progress.rst @@ -0,0 +1,142 @@ +:original_name: mrs_02_1091.html + +.. _mrs_02_1091: + +Querying the Command Execution Progress +======================================= + +Function +-------- + +This API is used to query the command execution progress by command ID, including the total progress and the detailed progress of each step. + +URI +--- + +- Format + +GET /web/v1/common/command/{command_id}/progress + +- URI parameter description + ++-----------------------+-----------------------+------------------------------------------------------------------------------------------------------+ +| Parameter | Mandatory or Not | Description | ++=======================+=======================+======================================================================================================+ +| command_id | Yes | Command ID, which can be obtained from the response of the asynchronous request | +| | | | +| | | Asynchronous requests include requests for saving configurations and starting and stopping services. | ++-----------------------+-----------------------+------------------------------------------------------------------------------------------------------+ + +Request +------- + +- Example: + + .. code-block:: text + + GET /web/v1/common/command/{command_id}/progress HTTP/1.1 + Host: example.com + Content-Type: application/json + Accept:application/json + +- Parameter description + + None + +Response +-------- + +- Example: + + .. code-block:: + + HTTP/1.1 200 OK + Data:Wed,02 May 2018 10:10:01 GMT + Server: example-server + Content-Type: application/json + { + "id": 0, + "state": "COMPLETE", + "error_code": 0, + "error_description": "string", + "total_progress": 0, + "res_obj": { + "cluster_id": 0, + "step_list": [ + { + "name": "string", + "description": "string" + } + ], + "fail_entity_list": [ + { + "fail_entity": "string", + "operation_type": "string" + } + ], + "total_step_size": 0 + } + } + +- Parameter description + +.. table:: **Table 1** Response parameter description + + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory or Not | Type | Description | + +===================+==================+===========+===================================================================================================================================================================+ + | id | No | LONG | Asynchronous task ID (meaningless in other scenarios). The default value is **-1**. | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | state | No | STRING | Cluster status. The value **FAILED** indicates that the command fails to be executed. The value **COMPLETE** indicates that the command is successfully executed. | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | error_code | No | INTEGER | Error code returned | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | error_description | No | STRING | Error code description | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | total_progress | No | FLOAT | Total progress | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | res_obj | No | REFERENCE | Response object | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. table:: **Table 2** **res_obj** parameter description + + +------------------+------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory or Not | Type | Description | + +==================+==================+=================+=======================================================================================================================================================================================+ + | cluster_id | No | INTEGER | Cluster ID | + +------------------+------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | step_list | Yes | ARRAY_REFERENCE | Records the progress of each step in an array. A command may be divided into multiple steps for execution. | + +------------------+------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | fail_entity_list | No | ARRAY_REFERENCE | List of failed operations. Currently, this function is supported for starting, stopping, and restarting the service. Other operations are not supported (an empty array is returned). | + +------------------+------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | total_step_size | Yes | INTEGER | Total command execution progress. The value ranges from 0 to 100. | + +------------------+------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. table:: **Table 3** **step_list** parameter description + + =========== ================ ====== ============== + Parameter Mandatory or Not Type Description + =========== ================ ====== ============== + name No STRING Partition name + description No STRING Description + =========== ================ ====== ============== + +.. table:: **Table 4** **fail_entity_list** parameter description + + ============== ================ ====== ============================= + Parameter Mandatory or Not Type Description + ============== ================ ====== ============================= + fail_entity No STRING Failed instance + operation_type No STRING Operation type: STOP or START + ============== ================ ====== ============================= + +Status Code +----------- + +=========== ============================ +Status Code Description +=========== ============================ +200 The operation is successful. +=========== ============================ + +For details about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/mrs_manager_api/mrs_manager_web_apis/querying_the_health_status_of_a_specified_cluster.rst b/api-ref/source/mrs_manager_api/mrs_manager_web_apis/querying_the_health_status_of_a_specified_cluster.rst new file mode 100644 index 0000000..685fe94 --- /dev/null +++ b/api-ref/source/mrs_manager_api/mrs_manager_web_apis/querying_the_health_status_of_a_specified_cluster.rst @@ -0,0 +1,107 @@ +:original_name: mrs_02_1089.html + +.. _mrs_02_1089: + +Querying the Health Status of a Specified Cluster +================================================= + +Function +-------- + +This API is used to query the health status of a specified cluster. If any component is unavailable, the abnormal cluster health status is returned. + +URI +--- + +- Format + +GET /web/v1/cluster/{cluster_id}/status + +- Parameter description + ++------------+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Parameter | Mandatory or Not | Description | ++============+==================+======================================================================================================================================================+ +| cluster_id | Yes | Cluster ID that is displayed on MRS Manager. The default cluster ID is **1**, because MRS Manager supports management of only one cluster currently. | ++------------+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Request +------- + +- Example: + + .. code-block:: text + + GET /web/v1/cluster/{cluster_id}/status HTTP/1.1 + Host: example.com + Content-Type: application/json + Accept:application/json + +- Parameter description + + None + +Response +-------- + +- Example: + + .. code-block:: + + HTTP/1.1 200 OK + Data:Wed,02 May 2018 10:10:01 GMT + Server: example-server + Content-Type: application/json + { + "id": 0, + "state": "COMPLETE", + "error_code": 0, + "error_description": "string", + "total_progress": 0, + "res_obj": { + "state": "GOOD" + } + } + +- Parameter description + +.. table:: **Table 1** Response parameter description + + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory or Not | Type | Description | + +===================+==================+===========+===================================================================================================================================================================+ + | id | No | LONG | Asynchronous task ID (meaningless in other scenarios). The default value is **-1**. | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | state | No | STRING | Cluster status. The value **FAILED** indicates that the command fails to be executed. The value **COMPLETE** indicates that the command is successfully executed. | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | error_code | No | INTEGER | Error code returned | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | error_description | No | STRING | Error code description | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | total_progress | No | FLOAT | Total progress | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | res_obj | No | REFERENCE | Response object | + +-------------------+------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. table:: **Table 2** **res_obj** parameter description + + +-----------------+------------------+-----------------+------------------------------------+ + | Parameter | Mandatory or Not | Type | Description | + +=================+==================+=================+====================================+ + | state | Yes | STRING | Cluster health status | + | | | | | + | | | | **Good**: The cluster is healthy. | + | | | | | + | | | | **Bad**: The cluster is unhealthy. | + +-----------------+------------------+-----------------+------------------------------------+ + +Status Code +----------- + +=========== ============================ +Status Code Description +=========== ============================ +200 The operation is successful. +=========== ============================ + +For details about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/mrs_manager_api/mrs_manager_web_apis/saving_configurations.rst b/api-ref/source/mrs_manager_api/mrs_manager_web_apis/saving_configurations.rst new file mode 100644 index 0000000..631b3bb --- /dev/null +++ b/api-ref/source/mrs_manager_api/mrs_manager_web_apis/saving_configurations.rst @@ -0,0 +1,283 @@ +:original_name: mrs_02_1092.html + +.. _mrs_02_1092: + +Saving Configurations +===================== + +Function +-------- + +This API is used to save configurations of services, roles, and instances. This API allows you to perform the following operations: + +- Modify multiple configuration items at a time. + +- Modify multiple configuration items at service, role, and instance levels at a time. + +URI +--- + +- Format + +POST /web/v1/config/cluster/{cluster_id}/save + +- Parameter description + ++------------+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Parameter | Mandatory or Not | Description | ++============+==================+======================================================================================================================================================+ +| cluster_id | Yes | Cluster ID that is displayed on MRS Manager. The default cluster ID is **1**, because MRS Manager supports management of only one cluster currently. | ++------------+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Request +------- + +- Example: + +.. code-block:: text + + POST /web/v1/config/cluster/{cluster_id}/save HTTP/1.1 + Host: example.com + Content-Type: application/json + Accept:application/json + { + "id": 0, + "user_password": "string", + "configurations_summary": { + "restart_affected_components": true, + "components": [ + { + "component_name": "string", + "configurations": [ + { + "name": "string", + "value": "string", + "default_value": "string", + "description": "string", + "type": "string", + "config_group_type": "string", + "config_group": "string", + "item_type": "string", + "item_conf": "string", + "item_event": "string", + "weak_reference": "string" + } + ], + "children": [ + { + "role_name": "string", + "configurations": [], + "children": [ + { + "node": { + "id": 0, + "name": "string", + "description": "string", + "controller_id": "string", + "ip_address": "string", + "business_ip_address": "string", + "rack": "string", + "host_name": "string", + "total_memory": "string", + "available_memory": "string", + "total_hard_disk_space": "string", + "available_hard_disk_space": "string", + "no_of_CPUs": "string", + "available_swap_memory": "string", + "total_swap_memory": "string", + "cpu_usage": "string", + "disk_usage": "string", + "health_status": "GOOD", + "memory_usage": "string", + "swap_memory_usage": "string", + "files_info": [ + { + "name": "string", + "description": "string" + } + ], + "operational_status": "STARTED", + "network_read": "string", + "network_write": "string", + "instances": [ + { + "name": "string", + "id": "string", + "operational_status": "STARTED", + "health_status": "GOOD", + "ha_status": "ACTIVE", + "config_status": { + "level": "string", + "status": "UNKNOWN", + "description": "string" + }, + "role_name": "string", + "service_name": "string", + "web_UI_address": "string", + "is_service_role": true, + "pair_name": "string", + "support_decom": true + } + ], + "is_OMS_node": true + }, + "configurations": [] + } + ], + "classification": [ + { + "name": "string", + "description": "string" + } + ] + } + ], + "classification": [ + { + "name": "string", + "description": "string" + } + ] + } + ] + } + } + +- Parameter description + +.. table:: **Table 1** Request parameter description + + +------------------------+------------------+-----------+-------------------------------------------------------------------------------------+ + | Parameter | Mandatory or Not | Type | Description | + +========================+==================+===========+=====================================================================================+ + | id | No | LONG | Asynchronous task ID (meaningless in other scenarios). The default value is **-1**. | + +------------------------+------------------+-----------+-------------------------------------------------------------------------------------+ + | user_password | No | STRING | User password | + +------------------------+------------------+-----------+-------------------------------------------------------------------------------------+ + | configurations_summary | Yes | REFERENCE | Configures a description object. | + +------------------------+------------------+-----------+-------------------------------------------------------------------------------------+ + +.. table:: **Table 2** **configurations_summary** parameter description + + +-----------------------------+------------------+-----------------+--------------------------------------------+ + | Parameter | Mandatory or Not | Type | Description | + +=============================+==================+=================+============================================+ + | restart_affected_components | No | BOOLEAN | Whether to restart the affected components | + | | | | | + | | | | **true**: Restart | + | | | | | + | | | | **false**: Do not restart | + +-----------------------------+------------------+-----------------+--------------------------------------------+ + | components | No | ARRAY_REFERENCE | Service list | + +-----------------------------+------------------+-----------------+--------------------------------------------+ + +.. table:: **Table 3** **components** parameter description + + +----------------+------------------+-----------------+------------------------------------------------------------------------+ + | Parameter | Mandatory or Not | Type | Description | + +================+==================+=================+========================================================================+ + | component_name | No | STRING | Service name | + +----------------+------------------+-----------------+------------------------------------------------------------------------+ + | configurations | No | ARRAY_REFERENCE | Description of the service, role, or instance level. | + +----------------+------------------+-----------------+------------------------------------------------------------------------+ + | children | No | ARRAY_REFERENCE | Sublevel description array. The sublevel of the service level is role. | + +----------------+------------------+-----------------+------------------------------------------------------------------------+ + | classification | No | ARRAY_REFERENCE | Configuration definition information | + +----------------+------------------+-----------------+------------------------------------------------------------------------+ + +.. table:: **Table 4** **children** parameter description + + +----------------+------------------+-----------------+-------------------------------------------------------------------------------+ + | Parameter | Mandatory or Not | Type | Description | + +================+==================+=================+===============================================================================+ + | role_name | No | STRING | Role name | + +----------------+------------------+-----------------+-------------------------------------------------------------------------------+ + | configurations | No | ARRAY_REFERENCE | Configuration item description array: Service level/role level/instance level | + +----------------+------------------+-----------------+-------------------------------------------------------------------------------+ + | children | No | ARRAY_REFERENCE | Sublevel description array. The sublevel of the role level is instance. | + +----------------+------------------+-----------------+-------------------------------------------------------------------------------+ + | classification | No | ARRAY_REFERENCE | Configuration definition information | + +----------------+------------------+-----------------+-------------------------------------------------------------------------------+ + +.. table:: **Table 5** **configurations** parameter description of services, roles, and instances + + +-------------------+------------------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory or Not | Type | Description | + +===================+==================+========+=========================================================================================================================================================================================================================================================+ + | name | No | STRING | Name of the configuration item to be saved | + +-------------------+------------------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | value | No | STRING | Value to be saved | + +-------------------+------------------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | default_value | No | STRING | Default value | + +-------------------+------------------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | description | No | STRING | Configuration item description | + +-------------------+------------------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | type | No | STRING | Configuration item type | + +-------------------+------------------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | config_group_type | No | STRING | Configuration group type | + +-------------------+------------------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | config_group | No | STRING | Configuration group | + +-------------------+------------------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | item_type | No | STRING | Type of the configuration item value to be saved | + +-------------------+------------------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | item_conf | No | STRING | Configuration item value validity check | + +-------------------+------------------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | item_event | No | STRING | Event type of a configuration item. Currently, only **hide-show** is supported. | + +-------------------+------------------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | weak_reference | No | STRING | Whether a configuration item is a weak reference. If the configuration item is a weak reference, the configuration parsing is passed even though the configuration item name or role name does not exist, and the value will be set to an empty string. | + +-------------------+------------------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +.. table:: **Table 6** **classification** parameter description + + =========== ================ ====== =========== + Parameter Mandatory or Not Type Description + =========== ================ ====== =========== + name No STRING Name + description No STRING Description + =========== ================ ====== =========== + +Response +-------- + +- Example: + + .. code-block:: + + HTTP/1.1 200 OK + Data:Wed,02 May 2018 10:10:01 GMT + Server: example-server + Content-Type: application/json + { + "id": 0, + "state": "COMPLETE", + "error_code": 0, + "error_description": "string", + "total_progress": 0 + } + +- Response parameter description + ++-------------------+------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Parameter | Mandatory or Not | Type | Description | ++===================+==================+=========+===================================================================================================================================================================+ +| id | No | LONG | Asynchronous task ID (meaningless in other scenarios). The default value is **-1**. | ++-------------------+------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| state | No | STRING | Cluster status. The value **FAILED** indicates that the command fails to be executed. The value **COMPLETE** indicates that the command is successfully executed. | ++-------------------+------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| error_code | No | INTEGER | Error code returned | ++-------------------+------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| error_description | No | STRING | Error code description | ++-------------------+------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| total_progress | No | FLOAT | Total progress | ++-------------------+------------------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Status Code +----------- + +=========== ============================ +Status Code Description +=========== ============================ +200 The operation is successful. +=========== ============================ + +For details about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/mrs_manager_api/mrs_manager_web_apis/starting_a_service.rst b/api-ref/source/mrs_manager_api/mrs_manager_web_apis/starting_a_service.rst new file mode 100644 index 0000000..062a08a --- /dev/null +++ b/api-ref/source/mrs_manager_api/mrs_manager_web_apis/starting_a_service.rst @@ -0,0 +1,110 @@ +:original_name: mrs_02_1094.html + +.. _mrs_02_1094: + +Starting a Service +================== + +Function +-------- + +This API is used to start a specified service. + +URI +--- + +- Format + +POST /web/v1/maintain/cluster/{cluster_id}/service/{service_name}/start + +- URI parameter description + ++--------------+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Parameter | Mandatory or Not | Description | ++==============+==================+======================================================================================================================================================+ +| service_name | Yes | Name of the service to be started | ++--------------+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+ +| cluster_id | Yes | Cluster ID that is displayed on MRS Manager. The default cluster ID is **1**, because MRS Manager supports management of only one cluster currently. | ++--------------+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Request +------- + +- Example: + + .. code-block:: text + + POST /web/v1/maintain/cluster/{cluster_id}/service/{service_name}/start HTTP/1.1 + Host: example.com + Content-Type: application/json + Accept:application/json + { + "user_password": "string", + "only_self": true + } + +- Parameter description + +.. table:: **Table 1** Request parameter description + + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory or Not | Description | + +=======================+=======================+========================================================================================================================================================================================+ + | user_password | No | Password of the login user. This parameter is used for secondary authentication. You do not need to enter a specific value when starting the service. The parameter value can be null. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | only_self | No | Whether to operate only the specified service | + | | | | + | | | **false**: The services on which the service depends are also started. | + | | | | + | | | **true**: Only the specified service is started. | + +-----------------------+-----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Response +-------- + +- Example: + + .. code-block:: + + HTTP/1.1 200 OK + Data:Wed,02 May 2018 10:10:01 GMT + Server: example-server + Content-Type: application/json + { + "id": 0, + "state": "COMPLETE", + "error_code": 0, + "error_description": "string", + "total_progress": 0 + } + +- Response parameter description + ++-------------------+------------------+-----------------+-------------------------------------------------------------------------------------+ +| Parameter | Mandatory or Not | Type | Description | ++===================+==================+=================+=====================================================================================+ +| id | No | LONG | Asynchronous task ID (meaningless in other scenarios). The default value is **-1**. | ++-------------------+------------------+-----------------+-------------------------------------------------------------------------------------+ +| state | No | STRING | Cluster status | +| | | | | +| | | | - **FAILED**: The command failed to be executed. | +| | | | - **COMPLETE**: The command is executed successfully. | +| | | | - IN_PROGRESS: The command is being executed. | ++-------------------+------------------+-----------------+-------------------------------------------------------------------------------------+ +| error_code | No | INTEGER | Error code returned | ++-------------------+------------------+-----------------+-------------------------------------------------------------------------------------+ +| error_description | No | STRING | Error code description | ++-------------------+------------------+-----------------+-------------------------------------------------------------------------------------+ +| total_progress | No | FLOAT | Total progress | ++-------------------+------------------+-----------------+-------------------------------------------------------------------------------------+ + +Status Code +----------- + +=========== ============================ +Status Code Description +=========== ============================ +200 The operation is successful. +=========== ============================ + +For details about error status codes, see :ref:`Status Codes `. diff --git a/api-ref/source/mrs_manager_api/mrs_manager_web_apis/stopping_a_service.rst b/api-ref/source/mrs_manager_api/mrs_manager_web_apis/stopping_a_service.rst new file mode 100644 index 0000000..db2c4d2 --- /dev/null +++ b/api-ref/source/mrs_manager_api/mrs_manager_web_apis/stopping_a_service.rst @@ -0,0 +1,112 @@ +:original_name: mrs_02_1095.html + +.. _mrs_02_1095: + +Stopping a Service +================== + +Function +-------- + +This API is used to stop a specified service. + +URI +--- + +- Format + +POST /web/v1/maintain/cluster/{cluster_id}/service/{service_name}/stop + +- URI parameter description + ++--------------+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+ +| Parameter | Mandatory or Not | Description | ++==============+==================+======================================================================================================================================================+ +| service_name | Yes | Name of the service to be stopped | ++--------------+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+ +| cluster_id | Yes | Cluster ID that is displayed on MRS Manager. The default cluster ID is **1**, because MRS Manager supports management of only one cluster currently. | ++--------------+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Request +------- + +- Example: + + .. code-block:: text + + POST /web/v1/maintain/cluster/{cluster_id}/service/{service_name}/stop HTTP/1.1 + Host: example.com + Content-Type: application/json + Accept:application/json + { + "user_password": "string", + "only_self": true + } + +- Request parameter description + +.. table:: **Table 1** Request parameter description + + +-----------------+------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | Parameter | Mandatory or Not | Type | Description | + +=================+==================+=================+=============================================================================================================================================================================================+ + | user_password | No | STRING | Password of the login user. This parameter is used for secondary authentication. If you call REST APIs, secondary authentication is not required and you do not need to set this parameter. | + +-----------------+------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + | only_self | No | BOOLEAN | Whether to operate only the specified service | + | | | | | + | | | | **false**: The services depending on the service are also stopped. | + | | | | | + | | | | **true**: Only the specified service is stopped. | + | | | | | + | | | | If you call REST APIs, secondary authentication is not required and you do not need to set this parameter. | + +-----------------+------------------+-----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Response +-------- + +- Example: + + .. code-block:: + + HTTP/1.1 200 OK + Data:Wed,02 May 2018 10:10:01 GMT + Server: example-server + Content-Type: application/json + { + "id": 0, + "state": "COMPLETE", + "error_code": 0, + "error_description": "string", + "total_progress": 0 + } + +- Response parameter description + ++-----------------------+-----------------------+-------------------------------------------------------------------------------------+ +| Parameter | Mandatory or Not | Description | ++=======================+=======================+=====================================================================================+ +| id | No | Asynchronous task ID (meaningless in other scenarios). The default value is **-1**. | ++-----------------------+-----------------------+-------------------------------------------------------------------------------------+ +| state | No | Cluster status | +| | | | +| | | - **FAILED**: The command failed to be executed. | +| | | - **COMPLETE**: The command is executed successfully. | +| | | - IN_PROGRESS: The command is being executed. | ++-----------------------+-----------------------+-------------------------------------------------------------------------------------+ +| error_code | No | Error code returned | ++-----------------------+-----------------------+-------------------------------------------------------------------------------------+ +| error_description | No | Error code description | ++-----------------------+-----------------------+-------------------------------------------------------------------------------------+ +| total_progress | No | Total progress | ++-----------------------+-----------------------+-------------------------------------------------------------------------------------+ + +Status Code +----------- + +=========== ============================ +Status Code Description +=========== ============================ +200 The operation is successful. +=========== ============================ + +For details about error status codes, see :ref:`Status Codes `.