cmlutils(명령어 cmlutil)는 Cloudera 가 GitHub 에 공개한 CDSW/CML(Cloudera AI) 프로젝트 마이그레이션 CLI 다. 소스 워크벤치와 타깃 워크벤치 양쪽에 네트워크로 연결된 제3의 호스트(bastion) 에서 export → import 순으로 프로젝트 파일, 설정, 모델, Job, Application 을 옮긴다. CML 1.5.2 → 1.5.5 SP3 처럼 워크벤치 간 프로젝트 이관에도 같은 도구를 쓴다. 워크벤치 전체를 통째로 옮기는 Backup & Restore 와는 목적이 다르며, 프로젝트 단위로 골라 옮길 때 이 도구를 쓴다. cmlutils 의 export 산출물(프로젝트 파일 + Job/Model/Application 메타데이터 JSON)이 곧 프로젝트 단위 백업본이 된다. 별도의 Job/Application 백업 명령은 없다.
rsync(3.x 권장) 설치. RHEL 8 의 기본 Python 3.6/3.8 로는 pip 이 Requires-Python >=3.10 검사에서 거부한다. setup.py install(easy_install) 은 이 검사를 건너뛰어 성공한 것처럼 보이지만 실행되지 않는다.cloudera/ml-runtime-workbench-python3.9-standard-rsync) 등록. 폐쇄망이면 내부 레지스트리(Harbor 등)로 미러링한다.인터넷이 되는 스테이징(동일 el8/x86_64, python3.11)에서 wheelhouse 를 만들고 대상에서 오프라인 설치한다. 릴리스 아카이브는 https://github.com/cloudera/cmlutils/archive/refs/tags/<tag>.tar.gz 형식이며, Cloudera 문서에 적힌 @v1.0.0 태그는 실제 릴리스 목록에 없다(1.3.0 등 v 없는 태그를 쓴다).
# 스테이징
dnf install -y python3.11
python3.11 -m venv /tmp/buildenv && source /tmp/buildenv/bin/activate
pip install --upgrade pip wheel
cd cmlutils-main && rm -rf build dist *.egg-info
mkdir -p ~/cml-offline/wheelhouse
pip wheel . -w ~/cml-offline/wheelhouse
dnf download --resolve --alldeps --destdir ~/cml-offline/rpms rsync
cd ~/cml-offline && sha256sum wheelhouse/* rpms/* > SHA256SUMS
# 폐쇄망 대상
sha256sum -c SHA256SUMS
dnf install ./rpms/*.rpm # rsync 가 없을 때만
python3.11 -m venv ~/cmlenv && source ~/cmlenv/bin/activate
pip install --no-index --find-links=./wheelhouse cmlutils
cmlutil --help && cmlutil project --help
반입물은 Python 3.11 RPM 번들(대상에 없을 때), cmlutils wheelhouse, rsync RPM 세 가지다. charset_normalizer 만 cp311 바이너리 휠이라 Python 버전·아키텍처가 대상과 같아야 한다.
설정 파일 위치는 ~/.cmlutils/export-config.ini 와 ~/.cmlutils/import-config.ini 로 고정이며, 실행 계정의 홈을 기준으로 찾는다. export 와 import 는 같은 계정으로 실행한다. 섹션명은 -p 로 넘기는 프로젝트명과 정확히 일치해야 한다.
[DEFAULT]
url=https://<workspace-url>
output_dir=/root/cml-temp
ca_path=/root/certs/workspace-ca.pem
[<PROJECT_NAME>]
username=<프로젝트 소유자>
apiv1_key=${LEGACY_API_KEY}
chmod 700 ~/.cmlutils; chmod 600 ~/.cmlutils/*.ini 로 권한을 제한한다. ca_path 는 절대경로로 적는다. 지원 키는 username, url, apiv1_key, output_dir, ca_path, skip_tls_verification 정도이며 전송용 런타임을 바꾸는 옵션은 없다.
cmlutil project export -p "<PROJECT_NAME>" # 소스 → output_dir
cmlutil project import -p "<PROJECT_NAME>" -v # output_dir → 타깃, -v 는 --verify
cmlutil project validate-migration -p "<PROJECT_NAME>"
export/validate 의 -v 는 verbose 이지만 import 의 -v 는 --verify 다. verbose 는 --verbose 로 따로 준다. 배치 마이그레이션용 Python 래퍼 스크립트가 export/import 각각 제공되며 BatchSize 로 동시 처리 개수를 조절한다. export/import 세션 하나가 워크벤치에서 1 CPU / 0.5 GB 를 쓴다. cmlutil helpers populate_engine_runtimes_mapping 은 레거시 엔진 → ML Runtime 매핑 파일(~/.cmlutils/legacy_engine_runtime_constants.json)을 만든다.
[SSL: CERTIFICATE_VERIFY_FAILED] 가 나면 ca_path 로 CA 번들을 지정하거나 시스템 신뢰 저장소에 등록한다.x509: certificate signed by unknown authority / Cdswctl login failed 가 나면 ca_path 는 무시된다. OS 신뢰 저장소에 넣어야 한다.cp <CA_PEM> /etc/pki/ca-trust/source/anchors/workspace-ca.crt
update-ca-trust extract
openssl s_client -connect <workspace-host>:443 -servername <workspace-host> </dev/null 2>/dev/null | grep 'verify return code'
시스템 신뢰 저장소 등록이 두 층을 한 번에 해결하므로 소스·타깃 CA 를 모두 등록해 둔다.
Internal job report recipients may not get migrated).--verbose 로그에는 URL·헤더·토큰이 남는다. 공유 전에 호스트명·계정·키를 마스킹한다.pip uninstall 이 안 되므로 wheelhouse 로 다시 설치한다.