ambari REST API 사용하기

Apache Ambari는 손쉬운 웹 UI 및 REST API를 제공하여 Hadoop 클러스터의 관리 및 모니터링을 간소화합니다. 본 가이드에서는 Ambari REST API를 사용하는 방법에 대해 설명합니다. Ambari REST API의 더 자세한 정보는 Ambari API 참조 v1을 참고합니다.

Ambari REST API의 URI

Ambari REST API의 URI는 API를 수행하는 서버가 네이버 클라우드 플랫폼 내부 서버인지, 외부 서버인지에 따라서 달라집니다. 요청을 보내는 환경에따라 Ambari REST API의 URI를 작성합니다.

  • API를 수행하는 서버가 네이버 클라우드 플랫폼 내부 서버이면 Private IP 주소 사용(마스터 노드)
  • API를 수행하는 서버가 네이버 클라우드 플랫폼 외부 서버이면 DNS 사용

네이버 클라우드 플랫폼 내부망에서는 서버끼리 사설 IP 주소를 통해 통신이 가능하고, 내부 통신은 과금 대상에서 제외됩니다. DNS 를 통한 통신은 과금 대상이니 꼭 필요한 경우에만 사용합니다.

http://<AMBARI-ADDRESS>:8080/api/v1/clusters/<CLUSTER-NAME>

AMBARI-ADDESS에는 상황에 맞게 클러스터 Private IP 또는 를 사용합니다. CLUSTER-NAME은 클러스터의 이름입니다.클러스터 이름은 대소문자를 구문하기 때문에, 꼭 확인해주시기 바랍니다.

Ambari REST API 요청 보내기

curl을 이용해 Ambari REST API에 GET 요청을 수행합니다. 여기서 Ambari의 관리자계정은 suewoon/pass123!@#입니다.

curl -u 'suewoon:pass123!@#' -G "http://pri-12h1e.hadoop.fin-ntruss.com:8080/api/v1/clusters/test-spark"

위 클러스터 정보를 사용하여 REST API를 실행하면 아래와 같은 JSON 문서가 반환됩니다.

# curl 수행
curl -u obj -G "http://pri-12h1e.hadoop.fin-ntruss.com:8080/api/v1/clusters/test-spark"
{
  "href" : "http://pri-12h1e.hadoop.fin-ntruss.com:8080/api/v1/clusters/test-spark",
  "Clusters" : {
    "cluster_id" : 2,
    "cluster_name" : "SPARK",
    "health_report" : {
      "Host/stale_config" : 0,
      "Host/maintenance_state" : 0,
      "Host/host_state/HEALTHY" : 3,
      "Host/host_state/UNHEALTHY" : 0,
      "Host/host_state/HEARTBEAT_LOST" : 0,
      "Host/host_state/INIT" : 0,
      "Host/host_status/HEALTHY" : 3,
      "Host/host_status/UNHEALTHY" : 0,
      "Host/host_status/UNKNOWN" : 0,
      "Host/host_status/ALERT" : 0
....

jq 명령어로 리턴값 파싱하기

jq를 이용하여 REST API 결과로 반환되는 JSON 문서를 일부 필터링하거나 변환할 수 있습니다. 아래는 jq를 통해 JSON 결과 중 Clusters의 health_report 정보만 필터링하는 예입니다.

curl -u 'suewoon:pass123!@#' -G "http://pri-12h1e.hadoop.fin-ntruss.com:8080/api/v1/clusters/test-spark" | jq '.Clusters.health_report'
{
  "Host/stale_config": 0,
  "Host/maintenance_state": 0,
  "Host/host_state/HEALTHY": 4,
  "Host/host_state/UNHEALTHY": 0,
  "Host/host_state/HEARTBEAT_LOST": 0,
  "Host/host_state/INIT": 0,
  "Host/host_status/HEALTHY": 4,
  "Host/host_status/UNHEALTHY": 0,
  "Host/host_status/UNKNOWN": 0,
  "Host/host_status/ALERT": 0
}

사용 예시

모든 노드 FQDN(정규화된 도메인 이름) 구하기

curl -u 'suewoon:pass123!@#' -G "http://pri-12h1e.hadoop.fin-ntruss.com:8080/api/v1/clusters/test-spark/hosts" | jq '.items[].Hosts.host_name'

마스터 노드 FQDN 구하기

curl -u 'suewoon:pass123!@#' -G "http://pri-12h1e.hadoop.fin-ntruss.com:8080/api/v1/clusters/test-spark/services/HDFS/components/NAMENODE" | jq '.host_components[].HostRoles.host_name'

작업자 노드 FQDN 구하기

curl -u 'suewoon:pass123!@#' -G "http://pri-12h1e.hadoop.fin-ntruss.com:8080/api/v1/clusters/test-spark/services/HDFS/components/DATANODE" | jq '.host_components[].HostRoles.host_name'

클러스터 노드 내부 IP 주소 구하기

IP 주소를 찾으려면 클러스터 노드의 내부 FQDN을 알아야 합니다. 먼저 Ambari를 쿼리하여 호스트 노드의 FQDN을 알아낸 다음 다시 Ambari를 쿼리하여 각 호스트의 IP 주소를 알아냅니다.

curl -u 'suewoon:pass123!@#' -G "http://pri-12h1e.hadoop.fin-ntruss.com:8080/api/v1/clusters/test-spark/hosts/d-002-test-spark-36m-hd" | jq '.Hosts.ip'

defalt.FS 구하기

Cloud Hadoop은 기본 저장소로 Object Storage를 사용하고 있으며, 해당 API의 결과값은 hdfs://<클러스터명(namespace명)>으로 나옵니다.

curl -u 'suewoon:pass123!@#' -G "http://pri-12h1e.hadoop.fin-ntruss.com:8080/api/v1/clusters/test-spark/configurations/service_config_versions?service_name=HDFS&service_config_version=1" | ./jq-linux64 '.items[].configurations[].properties["fs.defaultFS"] | select(. != null)'

""에 대한 건이 검색되었습니다.

    ""에 대한 검색 결과가 없습니다.

    처리중...