엔터프라이즈 환경에서 R
을 기반으로 분석 환경을 구축할때 가장 문제가 되는 점이 CRAN
을 폐쇄된 내부 환경에서 어떻게 접근하느냐 이다. 물론 CRAN
접속 없이 소스파일만으로도 설치가 가능하지만 대부분의 유명 패키지의 경우 다른 패키지와 의존관계를 보이고 있고 그러한 의존관계를 가지고 있는 패키지들이 타 패키지들과 의존관계를 가지고 있는 경우가 많아 CRAN
없이 하나의 패키지를 설치하기 위해서 많은 불편함이 존재하고 있다.
필자의 경우 http://cran.nexr.com
을 구축한 경험이 있어 내부 로컬 저장소를 구축하는데 어려움은 없으나 좀더 간단하게 설정을 하고 싶은 욕구가 있었다. 일반적인 CRAN
미러링 서버의 경우 rsync
로 외부 소스 CRAN
과 주기적 싱크를 하게 되는 로직으로 동작하는데, 자신의 선택한 버전과 패키지들에 대한 경량 저장소를 만드는것 매우 까다로운 작업이다. 이러한 이유는 내부의 분석 환경은 거의 동질적인 환경으로 설정되어서 같은 패키지에 대해서 여러 버전을 가지고 있을 필요가 없기 때문이다. 물론 이 부분정도는 rsync
설정으로 가능하지만 불편하다. 또한 웹서버를 하나 둬야 되는 단점도 존재한다. 물론 웹서버 설정이 그렇게 어려운것도 아니지만 요 하나만으로 apache
같은 웹서버를 쓰는건 다소 부담스럽다.
필자가 사용한 방법은 miniCRAN패키지와 경량 웹서버를 이용한 방법이다.
여기서 가정하고 있는 환경은 외부망 <==> 내부 저장소 <= 내부 분석 환경
이러한 환경을 기반으로 한다고 가정한다. 이 환경의 장점은 내부 저장소에서는 외부망을 접근할 수 있지만 내부 저장소에서 내부의 어떠한 다른 서버에 전혀 접근할 수 없고 내부 분석 환경에서는 내부 저장소에 접근 가능한 형태이다. 최소 이러한 환경 정도는 있어야 보안적인 측면과 편리함을 동시에 추구할 수 있다.
내부 저장소
에 진입해서 특정 디렉토리에 진입해 miniCRAN
패키지를 설치하고 아래와 같은 명령어를 수행해 모든 소스 패키지를 다운받는다(주석 처리된 두 라인을 주석 해제하고 그 아래 두라인을 주석으로 처리하면 된다).
#모든 소스 패키지 백업
library(miniCRAN)
repo <- 'http://cran.nexr.com'
dir.create(pth <- file.path('local_cran'))
#avail_pkgs <- pkgAvail(repos= repo, type='source')[,1]
#makeRepo(avail_pkgs, path=pth, repos=repo)
dep_pkgs <- pkgDep('quantreg', repos=repo, type = "source")
makeRepo(dep_pkgs, path=pth, repos=repo)
테스트로 quantile 회귀를 수행할 수 있는 quantreg
패키지만 백업했는데, 무려 15개의 의존성을 가진 패키지가 자동으로 로컬 저장소로 저장 되었다.
local_cran 디렉토리 아래의 구조는 아래와 같을 것이다.
- src/contrib
- PACKAGES
- PACKAGES.gz
- quantreg..
- …
참고로 source
만 백업한 이유는 UNIX계열의 R환경은 모두 소스기반으로 패키지를 직접 빌드를 하기 때문이다.
이렇게 구축된 로컬 R 저장소를 서비스 하도록 해보자!
역시 이 부분도 R
로 수행이 가능하지만, 간단하게 Python
경량 웹 서버를 이용한다. 이 명령어는 local_cran
디렉토리에서 수행한다. 경량 웹서버를 사용하는 이유는 닭잡는데 소잡는 칼을 쓸 필요가 없기 때문이다.
python -m SimpleHTTPServer 5000
경량 웹서버를 실행하고 아래와 같은 명령어로 quantreg
패키지를 설치해 보자! 물론 실제 환경이라면 이 부분은 R분석 환경에서 실행되는 명령어고 위 웹 서버 명령어는 로컬 저장소 서버에서 실행될 명령어다.
install.packages('quantreg', repos="http://127.0.0.1:5000", type='source')
아래는 출력 로그이다. 필자의 랩톱이 맥북이라 환경에 맞게 컴파일 된다.
R > install.packages('quantreg', repos="http://127.0.0.1:5000", type='source')
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0100 1677k 100 1677k 0 0 299M 0 --:--:-- --:--:-- --:--:-- 327M
* installing *source* package ‘quantreg’ ...
** package ‘quantreg’ successfully unpacked and MD5 sums checked
** libs
gfortran-4.8 -fPIC -g -O2 -c akj.f -o akj.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
gfortran-4.8 -fPIC -g -O2 -c boot.f -o boot.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
gfortran-4.8 -fPIC -g -O2 -c brute.f -o brute.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
clang -I/Library/Frameworks/R.framework/Resources/include -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include -fPIC -Wall -mtune=core2 -g -O2 -c chlfct.c -o chlfct.o
gfortran-4.8 -fPIC -g -O2 -c cholesky.f -o cholesky.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
gfortran-4.8 -fPIC -g -O2 -c combos.f -o combos.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
gfortran-4.8 -fPIC -g -O2 -c crq.f -o crq.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
gfortran-4.8 -fPIC -g -O2 -c crqfnb.f -o crqfnb.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
gfortran-4.8 -fPIC -g -O2 -c dsel05.f -o dsel05.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
gfortran-4.8 -fPIC -g -O2 -c etime.f -o etime.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
gfortran-4.8 -fPIC -g -O2 -c extract.f -o extract.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
gfortran-4.8 -fPIC -g -O2 -c idmin.f -o idmin.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
gfortran-4.8 -fPIC -g -O2 -c iswap.f -o iswap.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
gfortran-4.8 -fPIC -g -O2 -c kuantile.f -o kuantile.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
clang -I/Library/Frameworks/R.framework/Resources/include -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include -fPIC -Wall -mtune=core2 -g -O2 -c mcmb.c -o mcmb.o
gfortran-4.8 -fPIC -g -O2 -c penalty.f -o penalty.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
gfortran-4.8 -fPIC -g -O2 -c powell.f -o powell.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
gfortran-4.8 -fPIC -g -O2 -c rls.f -o rls.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
gfortran-4.8 -fPIC -g -O2 -c rq0.f -o rq0.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
gfortran-4.8 -fPIC -g -O2 -c rq1.f -o rq1.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
gfortran-4.8 -fPIC -g -O2 -c rqbr.f -o rqbr.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
gfortran-4.8 -fPIC -g -O2 -c rqfn.f -o rqfn.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
gfortran-4.8 -fPIC -g -O2 -c rqfnb.f -o rqfnb.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
gfortran-4.8 -fPIC -g -O2 -c rqfnc.f -o rqfnc.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
gfortran-4.8 -fPIC -g -O2 -c rqs.f -o rqs.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
gfortran-4.8 -fPIC -g -O2 -c sparskit2.f -o sparskit2.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
clang -I/Library/Frameworks/R.framework/Resources/include -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include -fPIC -Wall -mtune=core2 -g -O2 -c srqfn.c -o srqfn.o
clang -I/Library/Frameworks/R.framework/Resources/include -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include -fPIC -Wall -mtune=core2 -g -O2 -c srqfnc.c -o srqfnc.o
gfortran-4.8 -fPIC -g -O2 -c srtpai.f -o srtpai.o
gfortran-4.8: warning: couldn’t understand kern.osversion ‘15.0.0
clang -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/lib -o quantreg.so akj.o boot.o brute.o chlfct.o cholesky.o combos.o crq.o crqfnb.o dsel05.o etime.o extract.o idmin.o iswap.o kuantile.o mcmb.o penalty.o powell.o rls.o rq0.o rq1.o rqbr.o rqfn.o rqfnb.o rqfnc.o rqs.o sparskit2.o srqfn.o srqfnc.o srtpai.o -L/Library/Frameworks/R.framework/Resources/lib -lRlapack -L/Library/Frameworks/R.framework/Resources/lib -lRblas -L/usr/local/lib/gcc/x86_64-apple-darwin13.0.0/4.8.2 -lgfortran -lquadmath -lm -L/usr/local/lib/gcc/x86_64-apple-darwin13.0.0/4.8.2 -lgfortran -lquadmath -lm -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation
installing to /Library/Frameworks/R.framework/Versions/3.2/Resources/library/quantreg/libs
** R
** data
** demo
** inst
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** installing vignettes
** testing if installed package can be loaded
* DONE (quantreg)
The downloaded source packages are in
‘/private/var/folders/32/j84wlpn91z7f48xmxys_07jc0000gn/T/RtmpafWFHz/downloaded_packages’
몇가지 경고 메시지가 있지만 패키지와 OS마다 상이한 경고인데 일단 잘 설치가 되었으니 무시하도록 한다.
아주 간략하게 컨셉만 설명했는데, 완벽하게 잘 구성된 환경을 구축하기 위해서는 웹서버 프로세스를 데몬화하는 과정이 필수이고 글에 첨부되어 있지는 않지만 패키지를 주기적으로 업데이트 하는 cron잡 역시 관리되어야 될 대상이며, 새로 추가되는 패키지들의 경우에도 주기적으로 로컬 저장소에 저장되는 잡이 추가 되어야 된다. 요런 시스템 관련 작업은 포스팅 주제에 크게 벗어나는 주제니 필요한 분들은 관련 내용을 리서치 해보길 바란다.
엔터프라이즈 환경에서 R Local Repository 구축하기 by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.