CDE 는 Kubernetes 기반이라 로그와 메타데이터를 DEX Storage 라고 부르는 외부 스토리지에 둔다. Private Cloud 에서는 보통 Ozone(ofs://)이며, 데이터 레이크가 HDFS 여도 CDE 플랫폼 내부 산출물은 Ozone 에 쌓이는 경우가 많다.
| 항목 | 저장 위치 |
|---|---|
| Job 정의 · Run 이력 메타데이터 | CDE Service 내부 Postgres (Kubernetes 안) |
| Spark Event Log (History Server) | DEX Storage 의 eventlog/ |
| Spark driver · executor stdout/stderr | Pod 로그 → DEX Storage 로 수집 |
| Airflow DAG · Task 로그 | VC PVC + DEX Storage |
DEX Storage 경로는 CDE Service 생성 시점에 정해지고 사후 변경이 사실상 불가능하다. Job 단위로 spark.eventLog.dir 를 덮어써도 History Server 가 읽는 위치는 그대로다.
VC 네임스페이스의 ConfigMap 에서 확인한다. ConfigMap 이름은 버전에 따라 dex-app-<VC-ID>-spark-defaults 또는 spark-defaults-conf-config-map-dex-app-<...> 형태다.
kubectl get ns | grep dex-app
kubectl get configmap -n dex-app-<VC-ID> | grep -i spark-defaults
kubectl get configmap <configmap-name> -n dex-app-<VC-ID> -o jsonpath='{.data}' | head -c 500
kubectl get configmap <configmap-name> -n dex-app-<VC-ID> \
-o jsonpath='{.data.spark-defaults\.conf}' \
| grep -E "eventLog|history\.fs|history\.store|fs\.defaultFS"
spark.history.store.path 가 /tmp/... 인 것은 History Server 가 파싱 결과를 캐시하는 로컬 경로이지 이벤트 로그 위치가 아니다. 봐야 할 값은 spark.eventLog.dir 와 spark.history.fs.logDirectory 이고, 스킴이 ofs:// 인지 hdfs:// 인지 file:// 인지가 핵심이다.
ConfigMap 에 없으면 History Server Pod 에서 직접 본다.
kubectl get pods -n dex-app-<VC-ID> | grep shs
kubectl describe pod <shs-pod> -n dex-app-<VC-ID> | grep -A 30 "Args"
kubectl exec -n dex-app-<VC-ID> <shs-pod> -- cat /opt/spark/conf/spark-defaults.conf
로그 원본을 옮기는 대신, CDE REST API 로 Run 메타데이터를 주기적으로 긁어 Kudu · Iceberg 테이블에 적재하는 편이 실용적이다. 수집 주체는 Airflow DAG 하나를 따로 두거나 외부 스케줄러로 돌린다.
CREATE TABLE IF NOT EXISTS audit.cde_job_run (
vc_id STRING,
job_name STRING,
run_id STRING,
job_type STRING, -- spark / airflow
dag_id STRING,
status STRING, -- succeeded / failed / killed
submitted_ts STRING,
started_ts STRING,
ended_ts STRING,
duration_sec INT,
user_name STRING,
spark_app_id STRING,
log_url STRING,
collected_ts STRING,
PRIMARY KEY (vc_id, job_name, run_id)
)
PARTITION BY HASH (vc_id, job_name) PARTITIONS 4
STORED AS KUDU;
수집은 GET ${CDE_JOB_URL}/job-runs?limit=...&offset=... 로 목록을 받고, 필요한 Run 의 로그는 GET ${CDE_JOB_URL}/job-runs/<id>/logs?type=driver/stdout 로 받아 HDFS 에 날짜별로 떨군다. Run 이력 자체는 CDE 내부 DB 의 보관 주기에 따라 사라지므로, audit 테이블이 사실상의 장기 보관본이 된다.