Data Preprocessing - Jupyter notebook 실습환경 만들기

Jupyter notebook을 이용한 실습 환경 만들기

  1. docker image ‘continuumio/miniconda3’ 로 jupyter notebook 실습 환경을 만든다.
  2. 실습에 필요한 jupyter notebook 단축키를 익힌다.
  3. Data preprocessing 실습에 필요한 python module을 추가 설치한다.


Jupyter notebook 도커 컨테이너로 실행하기

miniconda image를 사용한다.

$ docker pull continuumio/miniconda3

도커 이미지를 pull 했으면 적절한 옵션을 주고 실행하면 된다. 아래와 같이 실행한다.

docker run -i -t -v $(pwd)/notebooks:/opt/notebooks \
--name jupyter_notebook \
-p 8888:8888 continuumio/miniconda3 /bin/bash \
-c "/opt/conda/bin/conda install jupyter -y --quiet && mkdir -p \
/opt/notebooks && /opt/conda/bin/jupyter notebook \
--notebook-dir=/opt/notebooks --ip='*' --port=8888 \
--no-browser --allow-root"

위 명령으로 docker container가 실행되면 아래와 같은 화면을 볼 수 있다.

Preparing transaction: ...working... done
Verifying transaction: ...working... done
Executing transaction: ...working... done
[I 10:49:00.169 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret
[W 10:49:00.498 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.
[I 10:49:00.509 NotebookApp] Serving notebooks from local directory: /opt/notebooks
[I 10:49:00.509 NotebookApp] Jupyter Notebook 6.4.8 is running at:
[I 10:49:00.509 NotebookApp] http://9024eec70122:8888/?token=898dksie8dkfow9ekskdfheys8dif9eosju08df97a6f072888
[I 10:49:00.510 NotebookApp]  or http://127.0.0.1:8888/?token=898dksie8dkfow9ekskdfheys8dif9eosju08df97a6f072888
[I 10:49:00.510 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 10:49:00.515 NotebookApp]

    To access the notebook, open this file in a browser:
        file:///root/.local/share/jupyter/runtime/nbserver-1-open.html
    Or copy and paste one of these URLs:
        http://98765soei928342:8888/?token=898dksie8dkfow9ekskdfheys8dif9eosju08df97a6f072888
     or http://127.0.0.1:8888/?token=898dksie8dkfow9ekskdfheys8dif9eosju08df97a6f072888

위 상태가 되었다면 docker container로 jupyter notebook이 실행된 것이다.

Ctrl + p + q 키를 누르면 docker container를 계속 실행하게 두고 화면에서 빠져나와docker container detached 원래 shell로 돌아간다.

원래 shell로 돌아왔다면, 아래와 같이 docker container에 interactive 모드로 shell 다이빙을 한다.

$ docker exec -it jupyter_notebook /bin/bash

shell 다이빙이 되면 아래와 같은 모습을 볼 수 있다.

(base) root@90cc0896776d:/#

앞으로 쓰게 될테니, 우선 vim을 설치해 두도록 한다.

(base) root@90cc0896776d:/# apt-get update && apt-get install vim


Jupyter notebook password 설정

우선 jupyter notebook이 설치된 docker container 에 root로 접속되어shell 다이빙 되어 있는 현재 상태에서 jupyter notebook config 파일을 생성한다.

(base) root@90cc0896776d:/# jupyter notebook --generate-config

아래 위치에 config 파일이 생성된다.

(base) root@90cc0896776d:/# ls -al ~/.jupyter/jupyter_notebook_config.py
-rw-r--r-- 1 root root 54275 Feb 19 03:24 /root/.jupyter/jupyter_notebook_config.py

config 파일을 생성해 두고, 다음으로 jupyter notebook에 password를 설정한다.

(base) root@90cc0896776d:/# jupyter notebook password
Enter password:
Verify password:
[NotebookPasswordApp] Wrote hashed password to /root/.jupyter/jupyter_notebook_config.json

Password가 설정되면 위와 같이 jupyter_notebook_config.json 파일에 hashed password가 기록되었다는 메시지를 볼 수 있다.

jupyter_notebook_config.json 파일을 읽어보면 아래와 같이 hashed password가 적혀 있음을 볼 수 있다.

# cat /root/.jupyter/jupyter_notebook_config.json
{
  "NotebookApp": {
    "password": "argon2:$argon2id$v=19$m=10240,t=10,p=8$9dksiwldoe8rt7djskejfidhqyei348d9ckf3HexTIXygI4tQITxFjYt2qad0MXqpWARIUI"
  }
}(base) root@90cc0896776d:/#

위 예제에서 argon2: 로 시작해서 ARIUI로 끝나는 문자열 전체가 hashed password 다.

이 hashed password는 암호를 분실했거나 또는 암호가 유출되었다고 판단될때 비밀번호를 변경하고 로그인 되어 있는 기존 모든 세션을 무효화 시키는데 사용할 수 있다.

암호를 분실했을때 사용할 수 있는 위 hashed password 말고, jupyter notebook config에 설정할 hashed password를 추가로 만들 수 있다. 아래와 같이 만든다.

(base) root@90cc0896776d:/# ipython
In [1]: from notebook.auth import passwd

In [2]: passwd()
Enter password:
Verify password:
Out[2]: 'argon2:$argon2id$v=19$m=10240,t=10,p=8$n10SX9cuiKI1qCPXFJAVTw$lydrwJg0APOWVMN3muP9bO/dqA9EJInsyHT9YNe5u98'

In [3]:exit
(base) root@90cc0896776d:/#

위와 같이 passwd() 로 새로운 password를 준비할 수 있다. 역시 argon2로 시작되는 문자열 전체가 hashed password 값이다.

위에서 두번에 걸쳐서 hashed password를 만들어냈는데, 우선 처음 $ jupyter notebook password 로 만들어서 jupyter_notebook_config.json 파일에 저장된 hashed password는 암호를 분실했을때 등을 대비한 만약의 경우에 대한 파일이라고 생각하면 된다.

그리고 두번째 notebook.authpasswd()를 이용해서 생성해 낸 hashed password는 이제 jupyter notebook에 로그인할 때 사용할 password 이며, 이 password는 아래 config 파일에 설정한다.

(base) root@90cc0896776d:/# vi ~/.jupyter/jupyter_notebook_config.py

jupyter_notebook_config.py 파일을 보면 #c.NotebookApp.password = '' 와 같이 주석처리된 부분이 있다. 여기에 passwd()로 생성해 낸 hashed password 값을 적어 준다. 아래 예제와 같다.

c.NotebookApp.password = 'argon2:$argon2id$v=19$m=10240,t=10,p=8$n10SX9cuiKI1qCPXFJAVTw$lydrwJg0APOWVMN3muP9bO/dqA9EJInsyHT9YNe5u98'

이제 2개의 파일에 hashed password가 적혀 있는 상태가 되었다.

첫번째는 암호 분실시에 사용할 수 있는 jupyter_notebook_config.json 파일에 기록되어 있는 hashed password 이고, 두번째는 jupyter_notebook_config.py 파일에 기록한 hashed password 값이 있다.

이제 jupyter notebook에 로그인할때 두번째 hashed password 문자열을 생성해 낼때 입력했던 password 를 사용하면 된다.

그런데, 이렇게 하고 jupyter notebook에 로그인 하려고 하면 로그인이 안될 수 있다.

jupyter notebook doc을 보면 Json(jupyter_notebook_config.json) 파일에 password가 기록되어 있으면 jupyter_notebook_config.py 에도 기록한 암호가 동작하지 않을 수 있다고 설명되어 있다.

https://jupyter-notebook.readthedocs.io/en/stable/public_server.html

Automatic password setup will store the hash in jupyter_notebook_config.json while this method stores the hash in jupyter_notebook_config.py. The .json configuration options take precedence over the .py one, thus the manual password may not take effect if the Json file has a password set.

위와 같은 이유로, jupyter_notebook_config.json 파일을 이름을 변경해서 저장해 놓기로 한다.

(base) root@90cc0896776d:/# cd ~/.jupyter/
(base) root@90cc0896776d:~/.jupyter# mv jupyter_notebook_config.json jupyter_notebook_config.json.bak

이제 .py 파일에 설정된두번째로 생성했던 password로 jupyter notebook에 로그인이 될 것이다.

설정이 끝났으니, jupyter notebook을 재시작한다. Ctrl + p + q 로 docker container에서 빠져나간 후 아래와 같이 container를 재시작 한다.

$ docker restart jupyter_notebook

Jupyter notebook 실행을 8888번 포트로 시켜 놓았다. localhost 혹은 Jupyter notebook이 실행중인 서버에 8888 포트로 접속하면 Jupyter notebook을 볼 수 있다.


Jupyter notebook 기본적인 단축키 아래와 같은 기본적인 단축키를 외워두자.

단축키   내용
a : 현재 선택된 셀 위에 새로운 실행 셀을 만든다
b : 현재 선택된 셀 아래에 새로운 실행 셀을 만든다
x : 현재 선택된 셀을 삭제한다
m : 현재 선택된 셀을 markdown 모드로 변경한다
y : 현재 선택된 셀을 python 입력 셀로 변경한다
Ctrl+Enter : 현재 선택된 셀의 내용 실행

이 정도만 외우고 있으면 Jupyter notebook에서 실습을 하는데 불편함이 없을 것 같다.


추가 설치할 package

Jupyter notebook의 실행 셀에서 !를 붙이고 명령어를 입력하면 Jupyter notebook이 실행되고 있는 서버에 shell 명령으로 전달된다.

예를 들면 !ls -al ~/.jupyter 와 같이 입력하면 아래와 같은 화면을 볼 수 있다.


이제 Jupyter notebook에서 !명령어를 입력해서 아래와 같이 몇개의 package를 더 설치하자.

!apt-get update
!pip install bs4
!pip install seaborn
!pip install folium
!pip install openpyxl
!pip install matplotlib
!pip install --upgrade pandas

!pip install pandas_datareader
!apt-get install -y fonts-nanum

이제 Data Preprocessing 실습을 위한 환경이 모두 갖춰졌다.