[Ambari] Изменение параметров конфигурации сервисов через Ambari REST API

Предположим, что используется только Ambari-server (без web UI) и необходимо через API обновить некоторые параметры конфигурации ряда сервисов.

Предположим, что на кластере установлено HDFS, YARN, MapReduce2. И надо обновить парочку параметров для HDFS и YARN.

Для начала необходимо получить список актуальных «desired configs». Отправляет GET-запрос на:

http://host/api/v1/clusters/{clusterName}?fields=Clusters/desired_configs

Ответ будет вида:

{
  "href" : "http://host/api/v1/clusters/tdk?fields=Clusters/desired_configs",
  "Clusters" : {
    "cluster_name" : "tdk",
    "version" : "HDP-2.0.6",
    "desired_configs" : {
      "capacity-scheduler" : {
        "user" : "admin",
        "tag" : "version1"
      },
      "core-site" : {
        "user" : "admin",
        "tag" : "version1"
      },
      "global" : {
        "user" : "admin",
        "tag" : "version1386247193430"
      },
      "hdfs-site" : {
        "user" : "admin",
        "tag" : "version1"
      },
      "mapred-site" : {
        "user" : "admin",
        "tag" : "version1386258794781"
      },
      "yarn-site" : {
        "user" : "admin",
        "tag" : "version1"
      }
    }
  }
}

Тут нас интересуют:

// data - response JSON
data.Clusters.desired_configs['core-site'].tag
data.Clusters.desired_configs['webhcat-site'].tag

Ссылка на запрос параметров конфигурации будет иметь вид:

http://host/api/v1/clusters/{clusterName}/configurations?(type=core-site&tag=version1)|(type=yarn-site&tag=version1)

Тут version1 для двух сервисов — это значения, полученные из предыдущего запроса. Ответ будет приблизительно такое:

{
  "href" : "http://host/api/v1/clusters/tdk/configurations?(type=core-site&tag=version1)|(type=yarn-site&tag=version1)",
  "items" : [
    {
      "href" : "http://host/api/v1/clusters/tdk/configurations?type=core-site&tag=version1",
      "tag" : "version1",
      "type" : "core-site",
      "Config" : {
        "cluster_name" : "tdk"
      },
      "properties" : {
        .............
      }
    },
    {
      "href" : "http://host/api/v1/clusters/tdk/configurations?type=yarn-site&tag=version1",
      "tag" : "version1",
      "type" : "yarn-site",
      "Config" : {
        "cluster_name" : "tdk"
      },
      "properties" : {
        ..............
      }
    }
  ]
}

У каждого элемента items берем properties. Важно! Надо брать все параметры (хоть изменить надо всего парочку) и отправлять на сервер надо так-же все. Потому что на сервере происходит не «поштучное» обновление каждого параметра, а просто перезатирание старой пачки параметров на новую (так что, если отправить не все параметры, то часть из них просто потеряется).

Считаем, что данные обновлены и надо их отправить на сервер снова. Для этого делается PUT-запрос по адресу (для каждого «набора параметров» свой запрос):

http://host/api/v1/clusters/{clusterName}

В теле запроса передается такое:

data: JSON.stringify({
  Clusters: {
    desired_config: {
      "type": site,
      "tag": 'version' + (new Date).getTime(),
      "properties": properties
    }
  }
});

Тут site — это core-site или yarn-site, tag — это метка для новой версии параметров (то, что выдавалось по первому запросу в начале этой заметки), properties — это объект с обновленными параметрами.

После того, как отправлены все эти запросы, перезапускаем необходимые сервисы и готово.

,

Оставить комментарий

Top ↑ | Main page | Back