Hadoop Eco Open API
시작하기 전에
Hadoop Eco Open API는 신규 클러스터 생성, 클러스터 조회, 클러스터 삭 제 및 증설 등의 일반적인 클러스터의 생성 및 관리를 수행합니다. Hadoop Eco Open API 사용 시, Open API Key의 발급은 필요하지 않습니다.
Hadoop Eco Open API 사용 방법은 다음과 같습니다.
API 사용 준비
Hadoop Eco Open API를 호출하기 위해서는 액세스 키를 발급받아야 합니다.
API 엔드포인트
API 요청을 위한 Hadoop Eco API 엔드포인트 URL은 다음과 같습니다.
- kr-central-1
- kr-central-2
https://hadoop-eco.kr-central-1.kakaoi.io
https://hadoop-eco.kr-central-2.kakaocloud.com
Base64 변환 방법
Open API 사용 시 일부 값들 은 Base64로 인코딩 후 해당 값을 입력해야 합니다. 인코딩 방법은 아래와 같습니다.
1. Linux: echo "hello" | base64
2. OS X: echo "hello" | base64
3. Windows: echo hello > input.txt
certutil -encode "input.txt" "output.txt"
type output.txt
클러스터 생성
Open API를 통해 클러스터를 생성합니다. 엔드포인트는 다음과 같습니다.
- kr-central-1
- kr-central-2
curl -X POST 'https://hadoop-eco.kr-central-1.kakaoi.io/v2/hadoop-eco/clusters' \
--header 'Credential-ID: {credential-id}' \
--header 'Credential-Secret: {credential-secret}' \
--header 'Content-Type: application/json' \
--data-raw '{Body}'
curl -X POST 'https://hadoop-eco.kr-central-2.kakaocloud.com/v2/hadoop-eco/clusters' \
--header 'Credential-ID: {credential-id}' \
--header 'Credential-Secret: {credential-secret}' \
--header 'Content-Type: application/json' \
--data-raw '{Body}'
Request
Request Header
키 | 값 |
---|---|
Content-Type* | application/json 으로 고정 |
{credential-id} * | 사용자의 액세스 키 ID - 카카오클라우드 콘솔 > 우측 상단 프로필 > 액세스 키에서 조회 가능 |
{credential-secret} * | 사용자의 보안 액세스 키 - 액세스 키 생성 시에만 확인 가능 - 보안 액세스 키 분실 시, 신규 액세스 키를 발급 필요 |
Request Body
기본 정보 입력
클러스터 이름, 유형, 버전, 네트워크 정보, 가용성 여부 등 기본적인 정보를 입력합니다.
{
"name": "string",
"clusterType": "string",
"clusterVersion": "string",
"isHa": true | false,
"keypairName": "string",
"masterFlavorName": "string",
"masterVolumeSize": integer,
"workerCnt": integer,
"workerFlavorName": "string",
"workerVolumeSize": integer,
"monitoring": true,
"securityGroupIds": ["string"],
"securityGroupName": "string",
"vpcId": "string",
"subnetId": "string",
"adminInfo": {
"userId": "string",
"userPw": "string"
},
"config": {
"hdfsReplication": integer,
"hdfsBlockSize": integer,
"configText": "string",
"fileUrl": "string",
"userScript": "string"
}
}
구분 | 유형 | 설명 |
---|---|---|
name* | String | 클러스터 이름 |
clusterType* | String | 클러스터 유형 |
clusterVersion* | String | 클러스터 버전 |
isHa* | Boolean | 고가용성 여부 - true : 고가용성 - false : 고가용성이 아님 |
keypairName* | String | 클러스터를 구성하는 Virtual Machine에서 사용할 키 페어 이름 |
masterFlavorName* | String | 마스터 노드의 플레이버 유형 이름 - ex) m2a.xlarge |
masterVolumeSize* | Integer | 마스터 노드의 볼륨 크기 (GB) |
workerCnt* | Integer | 워커 노드 개수, HDFS 복제 개수(config.hdfsReplication) 보다 크거나 같아야 함 |
workerFlavorName* | String | 워커 노드의 플레이버 유형 이름 - ex) m2a.xlarge |
workerVolumeSize* | Integer | 워커 노드의 볼륨 크기 (GB) |
monitoring* | Boolean | 모니터링 에이전트 설치 여부 |
securityGroupIds, securityGroupName | String | 보안 그룹 ID와 보안 그룹 이름으로, 두 필드 중 한 개는 필수로 입력 - 기존에 생성해 둔 보안 그룹을 재사용할 경우 securityGroupIds 에 보안 그룹 ID를 입력 - 클러스터 생성 시 자동으로 생성하는 보안 그룹을 사용하고자 할 경우, securityGroupName 에 보안 그룹 이름을 입력 |
vpcId* | String | 클러스터를 설치할 VPC ID를 입력 |
subnetId* | String | 클러스터를 설치할 서브넷의 ID를 입력 |
adminInfo.userId | String | Hue, Superset에서 사용할 계 정 정보(ID) 설정 - 입력하지 않는 경우 IAM 계정 ID로 설정 |
adminInfo.userPw | String | Hue, Superset에서 사용할 계정 정보(PW) 설정 - 입력하지 않는 경우 IAM 계정 비밀번호로 설정 - 별도 설정을 원할 경우 Base64로 인코딩된 문자열 입력 |
config.hdfsReplication* | Integer | 복제 개수 - 워커 노드 개수(workerCnt)보다 적거나 같아야 함 |
config.BlockSize* | Integer | 블록 사이즈(mb) |
config.configText | String | 주입할 클러스터 설정 정보 - JSON 형태의 문자열로 작성 후, String으로 변환 후 Base64로 인코딩하여 입력 - fileUrl configText 에 설정 정보 주입 예시 참고 |
config.fileUrl | String | Object Storage 파일의 URL 주소를 입력 - Base64로 인코딩은 불필요 예시) https://objectstorage.{리전명}.kakaocloud.com/v1/<프로젝트 ID>/<버킷명>/<경로>/<파일명> - fileUrl configText 에 설정 정보 주입 예시 참고 |
config.userScript | String | Virtual Machine이 생성될 때 실행하고 싶은 사용자 스크립트를 입력 - 실행할 Bash shell 문자열을 Base64 인코딩한 문자열로 입력 - userScript 에 사용자 스크립트 입력 예시 참고 |
fileUrl
configText
에 설정 정보 주입 예시
fileUrl
, configText
를 통해 클러스터의 설정 정보 입력 시, JSON 문자열 혹은 Object Storage에 존재하는 파일로 입력할 수 있습니다.
예를 들어, 아래와 같은 설정 정보를 주입하고자 할 경우, 먼저 JSON 형식으로 작성한 후 설정 정보 주입을 참고하여 입력합니다.
- 설정 정보 예시
- 설정 정보 JSON 작성
<configuration>
... (생략) ...
<property>
<name>io.file.buffer.size</name>
<value>65536</value>
</property>
... (생략) ...
</configuration>
<configuration>
... (생략) ...
<property>
<name>mapred.max.split.size</name>
<value>128000000</value>
</property>
... (생략) ...
</configuration>
... (생략) ...
export HADOOP_HEAPSIZE="3001"
export HADOOP_NAMENODE_INIT_HEAPSIZE="-Xmx3002m"
... (생략) ...
... (생략) ...
spark.driver.memory 4000M
spark.network.timeout 800s
... (생략) ...
입력하고 싶은 설정 정보를 아래와 같이 JSON 형태로 작성합니다.
{
"configurations": [
{
"classification": "core-site",
"properties": {
"io.file.buffer.size": "65536"
}
},
{
"classification": "hive-site",
"properties": {
"mapred.max.split.size": "128000000"
}
},
{
"classification": "hadoop-env",
"properties": {
"hadoop_env_hadoop_heapsize": 3001,
"hadoop_env_hadoop_namenode_heapsize": "-Xmx3002m"
}
},
{
"classification": "spark-defaults",
"properties": {
"spark.driver.memory": "4000M",
"spark.network.timeout": "800s"
}
}
]
}
설정 정보 주입
JSON이 준비되었다면 클러스터 생성 시 설정을 주입하는 두 가지 방법이 있습니다.
첫 번째 방법
첫 번째는 JSON을 Base64 인코딩하여 configText
에 주입하는 방법입니다.
-
JSON 설정 파일 Base64로 인코딩하기 위해 다음 명령어를 실행합니다.
echo | cat config.json | base64
-
Base64 문자열을
configText
필드에 입력합니다.ewogICJjb25maWd1cmF0aW9ucyI6IFsKICAgIHsKICAgICAgImNsYXNzaWZpY2F0aW9uIjogImNvcmUtc2l0ZSIsCiAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICJpby5maWxlLmJ1ZmZlci5zaXplIjogIjY1NTM2IgogICAgICB9CiAgICB9LAogICAgewogICAgICAiY2xhc3NpZmljYXRpb24iOiAiaGl2ZS1zaXRlIiwKICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgIm1hcHJlZC5tYXguc3BsaXQuc2l6ZSI6ICIxMjgwMDAwMDAiCiAgICAgIH0KICAgIH0sCgl7CiAgICAgICJjbGFzc2lmaWNhdGlvbiI6ICJoYWRvb3AtZW52IiwKICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgImhhZG9vcF9lbnZfaGFkb29wX2hlYXBzaXplIjogMzAwMSwKICAgICAgICAiaGFkb29wX2Vudl9oYWRvb3BfbmFtZW5vZGVfaGVhcHNpemUiOiAiLVhteDMwMDJtIgogICAgICB9CiAgICB9LAogICAgewogICAgICAiY2xhc3NpZmljYXRpb24iOiAic3BhcmstZGVmYXVsdHMiLAogICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAic3BhcmsuZHJpdmVyLm1lbW9yeSI6ICI0MDAwTSIsCiAgICAgICAgInNwYXJrLm5ldHdvcmsudGltZW91dCI6ICI4MDBzIgogICAgICB9CiAgICB9CiAgXQp9Cg==
두 번째 방법
두 번째는 Object Storage에 파일 형태로 업로드 후, fileUrl
에 해당 파일의 객체 URL을 주입하는 방법입니다.
- Object Storage에 JSON 파일을 업로드합니다.
- 업로드한 파일의 [더 보기] 버튼을 누르고, '객체 URL 복사'를 클릭합니다.
- 올바르게 복사했다면 다음과 같은 형태의 URL을 확인하실 수 있습니다.
https://objectstorage.{리전명}.kakaocloud.com/v1/{프로젝트 ID}/{버킷명}/{경로}/{파일명}
- 복사한 URL을
fileUrl
에 주입합니다.
userScript
에 사용자 스크립트 입력 예시
-
사용자 스크립트 파일을 준비합니다.
사용자 스크립트#!/bin/bash
function print(){
msg=$1
echo "${msg}"
}
print "hello world!" -
스크립트 내용을 Base64로 인코딩하기 위해 다음 명령어를 실행합니다.
echo | cat script.sh | base64
-
Base64 문자열을 userScript 필드에 입력합니다.
IyEvYmluL2Jhc2gKCmZ1bmN0aW9uIHByaW50KCl7CiAgICBtc2c9JDEKICAgIGVjaG8gIiR7bXNnfSIKfQoKcHJpbnQgImhlbGxvIHdvcmxkISIK
(선택) 클러스터 설치 후 작업 스케줄링을 실행하고 싶은 경우 하위에 userTask
를 입력합니다.
"userTask": {
"type": "hive|spark",
"terminationPolicy": "never|onSuccess|always",
"fileUrl": "string",
"hiveQuery": "string",
"deployMode": "cluster|client",
"execOpts": "string",
"execParams": "string",
"logBucketName": "string"
}
구분 | 설명 |
---|---|
type* | 작업의 종류를 입력 - hive , spark 지원 |
terminationPolicy* | 작업 스케줄링이 끝난 후 클러스터의 동작을 입력 - never : 클러스터를 종료하지 않음 - onSuccess : 작업 스케줄링이 성공했을 때만 클러스터를 종료 - always : 클러스터를 항상 종료함 |
hiveQuery | (Hive 작업의 경우) 실행할 hive 쿼리 문자열 |
fileUrl | (Hive 작 업의 경우) 실행할 hive 쿼리 파일이 위치하는 Object Storage URL을 입력 (Spark 작업의 경우) 실행할 jar 파일이 위치하는 Object Storage URL을 입력 |
deployMode | (Spark 작업의 경우) spark 작업 배포 모드로 클러스터 혹은 클라이언트를 지원 |
execOpts | (Hive 작업의 경우) hive 작업 실행 시 사용할 hive 옵션 정보를 문자열로 입력 (Spark 작업의 경우) spark 작업 실행 시 사용할 spark 옵션 정보를 문자열로 입력 |
execParams | (Spark 작업의 경우) spark 작업 실행 시 넘겨줄 파라미터 정보를 문자열로 입력 |
logBucketName | 작업 스케줄링 로그를 저장할 Object Storage 버킷 명을 입력 logBucketName을 설정하면 <logBucketName>/HadoopEco/<클러스터 이름> 하위에 로그 파일이 저장 |
(선택) Hive 메타스토어로 MySQL을 연동하고자 할 경우 하위에 hiveDbInfo 오브젝트를 같이 입력합니다.
"hiveDbInfo": {
"objectId": "string",
"dbName": "string",
"userId": "string",
"userPw": "string"
}
구분 | 설명 |
---|---|
objectId* | 연동할 MySQL의 오브젝트 ID 입력 |
dbName*, userId*, userPw* | 각각 MySQL의 데이터베이스 이름, MySQL에 접근할 계정의 ID와 비밀번호를 입력 - 단, 비밀번호는 Base64로 인코딩된 문자열이어야 함 |
(선택) 데이터 카탈로그를 연동하고자 할 경우 dataCatalogInfo 오브젝트를 같이 입력합니다.
"dataCatalogInfo": {
"catalogId": "string"
}