Details
-
Bug
-
Status: Resolved
-
Critical
-
Resolution: Fixed
-
None
Description
BACKGROUND:
Given that in Ambari, we refer components of a services in 2 ways:
- 1. One from the Service component APIs :
http://<AmbariServerHost>:8080/api/v1/clusters/<clusterName>/services/<ServiceName>/components/<componentName>
- *2.*From the host component APIs (which tell us the host on which the current component is resides)
http://<AmbariServerHost>:8080/api/v1/clusters/<clusterName>/hosts/<hostName>/host_components/<hostComponentName>
Note that, we of now, we are referring both 1and 2 using the component names
But in the multi-component world for Ambari, we will come up with a situation like this, as shown below:
- A. If core Service Group has its HDFS_CLIENT type component named as HDFS_CLIENT
Core -> HDFS -> HDFS_CLIENT - B. And at the same time, we have edw Service Group having its HDFS_CLIENT type component named as HDFS_CLIENT :
edw -> HDFS -> HDFS_CLIENT
There is no good way to distinguish a given host component in A and B, if we continue to refer them with the component name end point (No. 2 API call).
However, No. 1 call is still fine as we will not allow 2 names for the same component within a given service, thus making it unique and allowing us to continue using the component names endpoint.
****************************************************************WORK DONE :******************************************************************
In order to support multi-instance for components of a given service, we need to enhance the Host Components API so that they can distinguish one component instance of a service from another component instance of a service with the same Name.
The way to achieve this is to move Host Components API to be ID (number) based end point, compared to earlier being a name based endpoint. This will allow us to distinguish Core -> HDFS -> HDFS_CLIENT from edw -> HDFS -> HDFS_CLIENT, as an example.
Thus, following changes are required:
- New field : component_type (eg: HDFS_CLIENT, HIVE_SERVER, ZOOKEEPER_SERVER etc)
- Existing field : component_name will now hold the actual name given for the component at the time of install. For example:
- HDFS_CLIENT_EDW for component_type HDFS_CLIENT
- HIVE_SERVER FOR component_type HIVE_SERVER (name can be same as type also)
- HIVE_SERVER1 for component_type HIVE_SERVER
- ZOOKEEPER_SERVER_FOR_KAFKA for component_type ZOOKEEPER_SERVER, and so forth.
- A way to identify the HOST component uniquely via API calls, by way of referring them by ID instead of name.
MODIFIED API CALLs:
1. POST SERVICE COMPONENT API call
- CHANGE : New field component_type
- POST http://AmbariServer:8080/api/v1/clusters/<clusterName>/servicegroups/core/services/HDFS/components
Body :
[{"ServiceComponentInfo":{"component_name":"HDFS_CLIENT2","component_type":"HDFS_CLIENT"}}]
Response:
{ "resources" : [ { "href" : "http://{{AmbariServer}}:8080/api/v1/clusters/<clusterName>/servicegroups/core/services/HDFS/components/HDFS_CLIENT2", "ServiceComponentInfo" : { "category" : null, "cluster_id" : 2, "cluster_name" : "c1", "component_name" : "HDFS_CLIENT2", "component_type" : "HDFS_CLIENT", "desired_stack" : "HDP-2.6", "desired_version" : "NOT_REQUIRED", "display_name" : "HDFS Client", "id" : 51, "recovery_enabled" : false, "service_group_id" : 2, "service_group_name" : "core", "service_id" : 3, "service_name" : "HDFS", "service_type" : "HDFS", "state" : "STARTED", "total_count" : { "installFailedCount" : 0, "unknownCount" : 0, "installedCount" : 0, "initCount" : 0, "installedAndMaintenanceOffCount" : 0, "startedCount" : 0, "totalCount" : 0 } } } ] }
2. POST HOST COMPONENT API call
- CHANGE : New field component_type
- POST http://AmbariServer:8080/api/v1/clusters/<clusterName>/hosts/<host1>/host_components
Body{"HostRoles":{"cluster_name": "c1","component_name":"HDFS_CLIENT2","component_type":"HDFS_CLIENT"}}
- Response:
{ "resources" : [ { "href" : "http://{{AmbariServer}}:8080/api/v1/clusters/<clusterName>/hosts/<host1>/host_components/51", "HostRoles" : { "actual_configs" : { }, "cluster_id" : 2, "cluster_name" : "c1", "component_name" : "HDFS_CLIENT2", "component_type" : "HDFS_CLIENT", "desired_admin_state" : null, "desired_repository_version" : "2.6.4.0-91", "desired_stack_id" : "HDP-2.6", "display_name" : "HDFS_CLIENT2", "host_name" : "<host1>", "id" : 51, "maintenance_state" : null, "public_host_name" : "<host1>", "service_group_id" : 2, "service_group_name" : "core", "service_id" : 3, "service_name" : "HDFS", "service_type" : "HDFS", "stale_configs" : false, "state" : "INIT", "upgrade_state" : "NONE", "version" : "UNKNOWN" }, "host" : { "href" : "http://{{AmbariServer}}:8080/api/v1/clusters/<clusterName>/hosts/<host1>" } } ] }
3. GET SERVICE COMPONENT:
- CHANGE: host_components sub-resource will be referenced with end point as ID one.
- GET http://AmbariServer:8080/api/v1/clusters/<clusterName>/servicegroups/core/services/HDFS/components/HDFS_CLIENT2
- Response:
{ "href" : "http://{{AmbariServer}}:8080/api/v1/clusters/<clusterName>/servicegroups/core/services/HDFS/components/HDFS_CLIENT2", "ServiceComponentInfo" : { "category" : null, "cluster_id" : 2, "cluster_name" : "c1", "component_name" : "HDFS_CLIENT2", "component_type" : "HDFS_CLIENT", "desired_stack" : "HDP-2.6", "desired_version" : "2.6.4.0-91", "display_name" : "HDFS Client", "id" : 51, "init_count" : 1, "install_failed_count" : 0, "installed_and_maintenance_off_count" : 0, "installed_count" : 0, "recovery_enabled" : "false", "repository_state" : "NOT_REQUIRED", "service_group_id" : 2, "service_group_name" : "core", "service_id" : 3, "service_name" : "HDFS", "service_type" : "HDFS", "started_count" : 0, "state" : "STARTED", "total_count" : 1, "unknown_count" : 0 }, "host_components" : [ { "href" : "http://{{AmbariServer}}:8080/api/v1/clusters/<clusterName>/hosts/<host1>/host_components/51", "HostRoles" : { "cluster_name" : "c1", "component_name" : "HDFS_CLIENT2", "host_name" : "<host1>", "id" : 51, "service_group_name" : "core", "service_name" : "HDFS" } } ] }
4. GET HOST COMPONENT:
- CHANGE: Called with ID based end point
- GET http://AmbariServer:8080/api/v1/clusters/<clusterName>/hosts/<host1>/host_components/51
- Response:
{ "href" : "http://{{AmbariServer}}:8080/api/v1/clusters/<clusterName>/hosts/<host1>/host_components/51", "HostRoles" : { "cluster_name" : "c1", "component_name" : "HDFS_CLIENT2", "component_type" : "HDFS_CLIENT", "desired_repository_version" : "2.6.4.0-91", "desired_stack_id" : "HDP-2.6", "desired_state" : "INIT", "display_name" : "HDFS_CLIENT2", "host_name" : "<host1>", "id" : 51, "maintenance_state" : "OFF", "public_host_name" : "<host1>", "reload_configs" : false, "service_group_name" : "core", "service_name" : "HDFS", "stale_configs" : false, "state" : "INIT", "upgrade_state" : "NONE", "version" : "UNKNOWN", "actual_configs" : { } }, "host" : { "href" : "http://{{AmbariServer}}:8080/api/v1/clusters/<clusterName>/hosts/<host1>" }, "processes" : [ ], "component" : [ { "href" : "http://{{AmbariServer}}:8080/api/v1/clusters/<clusterName>/servicegroups/core/services/HDFS/components/HDFS_CLIENT2", "ServiceComponentInfo" : { "cluster_name" : "c1", "component_name" : "HDFS_CLIENT2", "service_group_name" : "core", "service_name" : "HDFS" } } ] }
5. UPDATE SERVICE COMPONENTS
- NO CHANGE
6. UPDATE HOST COMPONENTS
- CHANGE: API end point is ID based now.
7. DELETE SERVICE COMPONENT:
- No CHANGE
8. DELETE HOST COMPONENT:
- CHANGE: API end point is ID based now.