Skip to Content
Data Engineering폐쇄망(Offline) 환경에서의 Jupyter Hub 완벽 설치 가이드 (CentOS)
📊 Data Engineering2018년 1월 23일

폐쇄망(Offline) 환경에서의 Jupyter Hub 완벽 설치 가이드 (CentOS)

#jupyter#centos#offline#yum#pip#data-engineering#flamingo

과거 사내 빅데이터 모니터링 플랫폼 및 빅데이터 플랫폼 구축 TF 팀으로 일하며 대한민국 주요 제1금융권과 공공기관들의 하둡(Hadoop) 클러스터 사업을 여럿 수주했습니다.

하지만 엔지니어들을 가장 괴롭히는 요소는 거대한 파일 크기가 아닌 망 분리 환경이었습니다. 인터넷 선이 단 한 가닥도 꽂혀있지 않은 서버실 안쪽(Local Intranet)으로 노트북 하나 들고 들어가서, 파이썬 기반의 거대한 Jupyter Hub 생태계를 하나하나 조립해야 했습니다.

이 가이드는 인터넷 연결이 가능한 외부 Bastion(점프 스테이션)에서 CentOS용 rpm, Node.js tar, Python whl(Wheel) 파일들을 전부 싹쓸이 다운로드한 뒤, USB나 반입망을 거쳐 내부 서버로 들고 들어가 수동으로 Local Repo를 잡고 풀어버리는 “밀키트(Meal-kit)” 설치 방식의 기록입니다.


1. Local Yum Repository 설정

오프라인 서버 공간에 폴더(/root/repo)를 하나 만들고, 외부망에서 다운받아 온 수백 개의 의존성 rpm 패키지(파이썬 코어, C컴파일러 등)들을 전부 때려 넣습니다. 그리고 OS가 외부 인터넷 URL이 아닌 이 로컬 폴더를 바라보게 만듭니다.

shell
$ cd /etc/yum.repos.d/ $ mkdir bak && mv *.repo bak/ # 2. 로컬 리포지토리 지시자 생성 $ vi /etc/yum.repos.d/local.repo

local.repo 내용:

ini
[local-repo] name=Local Repository baseurl=file:///root/repo enabled=1 gpgcheck=0

2. 필수 OS 패키지 설치

이제 yum install을 치면 에러 대신 우리가 올려둔 폴더 안의 파일들을 긁어와서 의존성 트리를 맞춥니다. Jupyter 구동을 위한 최신 Python 버전 패키지와, Node.js 기반 프록시를 돌리기 위한 Node 코어 패키지를 설치합니다.

shell
# 캐시를 비우고 로컬 리포지토리 목록을 잘 쥐었는지 확인 $ yum clean all && yum repolist # 로컬에 다운로드 해둔 Node.js와 Python 일괄 설치 $ yum install python36u* nodejs-8.9.4

3. Configurable HTTP Proxy 수동 패키징 설치

Jupyter Hub는 유저들의 멀티 세션을 라우팅해주기 위해 Node.js 세계의 프록시 툴에 의존성을 가집니다. npm install 역시 오프라인에선 동작하지 않으므로, 외부에서 통째로 묶은 패키지 단일 바이너리 tarball을 들고 와서 풀어줍니다.

shell
$ mkdir -p /usr/lib/node_modules/configurable-http-proxy # 미리 외부망 npm pack으로 뽑아온 패키지 압축 풀기 $ tar zxf configurable-http-proxy-3.1.1.tar.gz -C /usr/lib/node_modules/configurable-http-proxy/ # OS 글로벌 bin 경로에서 바로 호출할 수 있게 심볼릭 링크 연결 $ ln -s /usr/lib/node_modules/configurable-http-proxy/bin/configurable-http-proxy /usr/bin/configurable-http-proxy

4. Python 라이브러리 (Pip Offline) 무더기 설치

대망의 핵심 애플리케이션 설치 구역입니다. 외부망에서 pip download jupyterhub 명령으로 싹싹 긁어 모아온 구슬 같은 .whl(Wheel 컴파일본) 파일들과 .tar.gz 소스들을 한 폴더에 모아둡니다. 그리고 pip 설치 명령어의 타겟을 파일경로 와일드카드(*)로 던져서 스스로 연쇄 조립되게 만듭니다.

shell
# 기본 Jupyter 관련 의존성 휠 설치 $ cd /root/packages/jupyter && pip3.6 install * # Hub 관련 휠 설치 (버전에 맞게 알아서 tar.gz 압축도 풀며 사이트 패키지에 들어갑니다) $ cd /root/packages/jupyter_hub && pip3.6 install *.tar.gz *.whl

이 모든 과정에 단 한번의 의존성 누락(Missing Dependency Error)이라도 생기면, 짐을 싸서 다시 서버실 밖으로 나가 인터넷 PC에서 1MB짜리 파일을 구해 재반입 결재를 받아야 하는 지옥이 펄쳐졌습니다. 엔지니어들에게 Air-gapped 딜리버리의 치밀함을 가르쳐 준 훌륭한 학교였습니다.

Last updated on