Cloudera CDP 의 Atlas 를 curl 로 조회하는 방법과, Atlas 에 Kudu 테이블을 올리는 경로를 정리한다. Atlas 에는 Kudu 전용 훅이 없어 HMS 를 경유하는 것이 표준이다.
자격 증명을 명령줄에 남기지 않도록 환경변수로 주입한다.
# CDP Public Cloud (Knox 경유)
export ATLAS_URL="https://<knox-gateway-host>/<datalake-name>/cdp-proxy-api/atlas"
# CDP Private Cloud Base
# export ATLAS_URL="https://<atlas-host>:31443"
export ATLAS_USER="<workload-user>"
read -rs ATLAS_PASS && export ATLAS_PASS
curl -sS -u "$ATLAS_USER:$ATLAS_PASS" \
-X POST "$ATLAS_URL/api/atlas/v2/search/basic" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"typeName": "hive_table",
"query": "mt_sha*",
"excludeDeletedEntities": true,
"includeSubTypes": true,
"limit": 100,
"offset": 0,
"attributes": ["qualifiedName", "name", "owner", "createTime"]
}' | jq -r '.entities[] | [.guid, .attributes.qualifiedName] | @tsv'
query 는 free-text 검색이라 와일드카드가 그대로 동작한다. 테이블 이름으로만 정확히 필터링하려면 entityFilters 를 쓰는 편이 정확하다.
"entityFilters": {
"condition": "AND",
"criterion": [
{ "attributeName": "name", "operator": "startsWith", "attributeValue": "mt_sha" }
]
}
GET 방식도 가능하다.
curl -sS -u "$ATLAS_USER:$ATLAS_PASS" -G "$ATLAS_URL/api/atlas/v2/search/basic" \
--data-urlencode "typeName=hive_table" \
--data-urlencode "query=mt_sha*" \
--data-urlencode "excludeDeletedEntities=true" \
--data-urlencode "limit=100"
qualifiedName 은 <db>.<table>@<clusterName> 형식이며 클러스터명은 환경마다 다르므로 검색 결과의 값을 그대로 쓴다.
export TBL_QN="<db>.<table>@<cluster>"
curl -sS -u "$ATLAS_USER:$ATLAS_PASS" -G \
"$ATLAS_URL/api/atlas/v2/entity/uniqueAttribute/type/hive_table" \
--data-urlencode "attr:qualifiedName=$TBL_QN" \
--data-urlencode "minExtInfo=false" \
--data-urlencode "ignoreRelationships=false" \
-H 'Accept: application/json' \
| jq -r '
.referredEntities
| to_entries[]
| select(.value.typeName == "hive_column")
| [ (.value.attributes.position|tostring),
.value.attributes.name,
.value.attributes.type,
(.value.attributes.comment // "") ]
| @tsv' | sort -n
GUID 로도 조회할 수 있다. 컬럼 정보는 응답의 entity.relationshipAttributes.columns 와 referredEntities 에 들어 있다.
curl -sS -u "$ATLAS_USER:$ATLAS_PASS" \
"$ATLAS_URL/api/atlas/v2/entity/guid/<guid>?minExtInfo=false&ignoreRelationships=false" \
-H 'Accept: application/json'
Atlas 에는 Kudu 전용 훅이 없다. HMS 를 경유해 hive_table 엔티티로 등록하는 것이 표준이고, Kudu 고유 속성까지 담으려면 커스텀 타입을 정의해야 한다.
Kudu 마스터에서 HMS 동기화를 켜면 Kudu 테이블이 HMS 카탈로그에 자동 등록된다.
--hive_metastore_uris=thrift://<hms-host>:9083
--hive_metastore_sasl_enabled=true
켜기 전 대소문자만 다른 중복 테이블명이 있으면 마스터가 기동에 실패하므로 kudu hms check 로 점검하고 kudu hms fix 로 정리한다. 자동 동기화 대상은 internal(managed) 테이블뿐이며, Spark 나 Kudu API 로 만든 테이블은 Impala 에서 CREATE EXTERNAL TABLE ... STORED AS KUDU 로 매핑해야 Atlas 에 보인다.
기존 테이블을 일괄 적재할 때는 Atlas 의 bin/import-hive.sh 를 실행한다. 이후 변경분은 Hive Hook 과 Impala Hook 이 ATLAS_HOOK 카프카 토픽으로 자동 전송하며, Impala 로 DDL·DML 을 실행하면 impala_process 리니지도 함께 생성된다.
hive_table 에는 해시 파티션이나 복제 수 같은 Kudu 메타데이터가 담기지 않는다. 이를 관리하려면 커스텀 타입을 정의하고 엔티티를 직접 넣는다.
curl -u "$ATLAS_USER:$ATLAS_PASS" -X POST \
-H 'Content-Type: application/json' \
"$ATLAS_URL/api/atlas/v2/types/typedefs" -d @kudu_typedef.json
# 이후 /api/atlas/v2/entity/bulk 로 엔티티 등록
kudu CLI 나 클라이언트로 테이블 목록을 뽑아 주기적으로 push 하는 배치를 붙이면 된다.
-u 대신 --negotiate -u : 를 쓰고 사전에 kinit 한다.--cacert /path/to/ca.pem 을 추가한다. -k 는 검증을 무력화하므로 운영에서는 쓰지 않는다.