はじめに
Jupyter初心者なので、AWS EC2上の環境構築方法、簡単な使い方を半年後の自分用にチラシの裏しておきます。
細かい設定はさておき、手っ取り早くEC2上にJupyter環境を構築し、Jupyter上で簡単なPython scriptを動かして、JupyterのUI操作方法の初歩を覚える所までを目標とします。Linux戦闘力が低いので、極力コピペで手順がなぞれる様に心がけます。
なお、Amazon EMRを使ってSpark Cluster上にJupyterを作りたい場合にはこちらを参照下さい。また、Jupyter Notebookは次期VersionよりJuypter Labとなり大きくUI/機能が変わる予定です。Jupyter Labの環境構築方法はこちらを参照下さい。
Jupyter環境構築
まずは、Jupyter環境を構築する手順です。
EC2の作成
Jupyterを動かすEC2を起動して、sshでloginします。
-
- Ubuntu 16.04を前提 (Amazon Linuxを使う場合には、aptをyum等に置き換えて下さい)
-
- EC2はm4.largeぐらいは合った方が良い
- EC2のSecurity GroupでPort 8080を開けておく
必要なmoduleのinstall
atp-getで必要なmoduleを入れて、pipをupdateして、ipython[notebook]をinstallします。 export LC_ALL=Cはssh login時にWARNING! Your environment specifies an invalid locale.みたいなメッセージが表示されたら追加してください。
$ export LC_ALL=C
$ sudo apt-get update
$ sudo apt-get install -y python-pip libpq-dev python-dev libpng12-dev libjpeg8-dev libfreetype6-dev libxft-dev
$ sudo pip install -U pip
$ sudo pip install numpy pandas matplotlib seaborn scikit-learn plotly ipython[notebook]
Jupyterの設定
以下のコマンドを実行すると、Jupyterの設定ファイルの雛形(~/.jupyter/jupyter_notebook_config.py)を作成してくれます。
$ jupyter notebook --generate-config
続いて、~/.jupyter/jupyter_notebook_config.pyを編集します。全て#でComment outされたデカイfileなので、fileの先頭など好きな場所に以下5行を入れて保存します(以下の設定は、誰でもそのJupyter serverにアクセスできる設定となります、ご注意ください)。
c = get_config()
c.NotebookApp.ip = '0.0.0.0'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8080
c.NotebookApp.token = ''
Jupyter LoginにPasswordをかけたい場合
最近のJupyterからSecurity対策としてpasswordかtokenでのLoginが必須になっています。↑の例では、c.NotebookApp.token = ”でtoken無しのアクセスを許可しています。
Login passwordを設定したい場合には、Passwordのhash文字列を事前に調べておく必要が有ります。以下のコマンドを実行するとPasswordを入れるPromptがでるので、設定したいPasswordを入力します。
$ python -c "import IPython;print(IPython.lib.passwd())"
するとsha1:3be1549bb425:1500071094720b33gf8f0feg474931dc5e43dfedの様なsha1:で始まるhash文字列を返してくれるのでCopyしておきます。
そして、↑で編集した~/.jupyter/jupyter_notebook_config.pyの内容を、以下のようにします。c.NotebookApp.passwordの後のhash文字列は、上で事前に調べたhash文字列に置き換えて下さい
c = get_config()
c.NotebookApp.ip = '0.0.0.0'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8080
c.NotebookApp.password = u'sha1:3be1549bb425:1500071094720b33gf8f0feg474931dc5e43dfed'
Jupyterの起動
以下のコマンドを実行すると、Jupyterが起動します。
$ jupyter notebook
Browser上でec2-53-239-93-85.ap-northeast-1.compute.amazonaws.com:8080など、EC2にアクセスに行きます。portの8080をお忘れ無く。 Jupyterのlogin画面が出て、上のほうで設定したpasswordを入力してloginが出来たら成功です。Background実行させたければ、nohup jupyter notebook > /dev/null 2>&1 &としておくと、sshを切断してもJupyterが動き続けます。
Jupyterの自動起動の設定
start_jupyter.shというscriptを作成し、それを/etc/rc.localに登録して、EC2起動時に、BackgroundでJupyterが実行される様に設定します。
-
- touch ~/start_jupyter.sh
start_jupyter.shを編集し、中に/usr/local/bin/jupyter notebook、と書いておく
chmod 777 ~/start_jupyter.sh
root権限で/etc/rc.localを編集し、su – ubuntu /home/ubuntu/start_jupyter.sh &の1行をexit 0の前に入れる
root権限でshutdown -r nowでEC2を再起動させる
Browserから、EC2にアクセスに行き、jupyterのlogin画面が出たら成功です
Jupyterの使い方
超簡単ですが、Jupyterの使い方をチラ裏します。
Jupyter notebookを作成する
Loginしたら、NewからPython2を選択し、Python2のnotebookを作成します。

各種iconについて
Jupyterは、Cellという箱(?)の中に、Codeや説明(Markdown)を記載していき、順次実行させる事で動かします。各種iconの機能は以下の通り
+アイコンがCellの追加(Insert > Insert Cell AboveかInsert Cell BelowでもCell追加可能)
はさみアイコンがCellの削除
上下の矢印アイコンがFocusが当たっているCellの位置の上下移動
Pulldownで追加するCellの種類の選択
Codeは、PythonなどのCodeの入力時に選択
Markdownは、Markdown言語を使い(Codeや処理結果への)説明をつける時に選択。Mathjaxを使い数式の表記も可能
Raw NBConvertは、Latexで数式を入力する時に選択
Headingは、Markdownと似た用途らしい(将来的にはなくなる予定)

Python code入力してみる
以下のPython codeをCellに入力してみます。現在の時刻を1秒おきに10回printするだけのcodeです。
import datetime, time
def main():
for count in range(0, 10):
print_current_time()
time.sleep(1)
def print_current_time():
print (datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S'))
if __name__ == '__main__':
main()
以下の様に4つのCodeのCellに、上記Python codeを入力してみて下さい。
-
- 入力が終わったら、Cell > Run All を実行すると、実行されます
- Cellの処理の順番がぐちゃぐちゃになったら、Kernel > Restart でClear all outputs & restartを選択後、再度Cell > Run All を実行すると上から順番に処理されます

コメントを入力してみる
以下の様にMarkdownのCellを追加して、中にMarkdownでコメントを入力してみて下さい。Cell > Run All を実行すると、MarkdownはRenderingされた状態で上から順番に処理されます。

2D Chartを作成してみる
2D Chartの作成にはmatplotlibを使うのが一般的です。以下のCodeをJupyter上で実行させればChartが作成/表示されます。%matplotlib inlineはmatplotlibの出力ChartをJupyter上に表示させる為に必要なオマジナイで、そのNotebook上のどこかで1回宣言/実行されていればOKです。
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
x = np.random.randint(0, 100, 10000)
plt.hist(x, bins=20)
plt.plot()
np.random.randint(0, 100, 10000)で、0-99の範囲の乱数intを10,000個作り、その乱数の分布を柱の数を20個のヒストグラムとして表示します。

なお、matplotlibは昔からある2D Chart 作成Libraryで、細かい設定ができる反面、パラメータの設定方法がやや複雑という意見あり、seabornという短いCodeで今風のデザインのChartが作成可能なLibraryもあります(ここら辺を参考)。ただし、matplotlibはサポートだけどseabornはサポートされていないChartがあったりもするので要注意です。
3D Chartを作成してみる
3DのChartはplotlyというLibraryを使うと作成可能です。機械学習等で3Dのデータ分布を確認したい時などに有効で、3DだとScatter, Surface, Meshがサポートされています。以下のCodeをJupyter上で実行すれば、こんな感じで3D Scatter Chartが表示されます。DragやPinch in/outで視点変更や拡縮できる事をお楽しみください。
np.random.multivariate_normal([0,0,0], [[0.1, 0, 0], [0, 1, 0], [0, 0, 2]], 1000).Tは、平均が[0,0,0]で、分散がそれぞれ[0.1, 1, 2]である3次元正規分布な乱数を1000個作る関数です。
import plotly
import numpy as np
plotly.offline.init_notebook_mode()
x1, y1, z1 = np.random.multivariate_normal([3,3,3], [[0.5, 0, 0], [0, 0.5, 0], [0, 0, 0.5]], 1000).T
trace1 = plotly.graph_objs.Scatter3d(x=x1, y=y1, z=z1, mode='markers', marker=dict(size=1, line=dict(color='b')))
x2, y2, z2 = np.random.multivariate_normal([0,0,0], [[0.1, 0, 0], [0, 1, 0], [0, 0, 2]], 1000).T
trace2 = plotly.graph_objs.Scatter3d(x=x2, y=y2, z=z2, mode='markers', marker=dict(size=1, line=dict(color='r')))
fig = plotly.graph_objs.Figure(data=[trace1, trace2])
plotly.offline.iplot(fig, show_link=False)
数式を入力してみる
Jupyter上で数式を表現する方法は幾つかあります。
Raw NBConvertのCell上でLatexで記載する
MarkdownのCell上でMathjax(Latex等の数式をBrowserで表示するlibrary)で記載する
ここでは、Markdown上でMathjaxを使って記載してみます。
$$r=\frac{1}{f}$$
$$\left(x + y\right)^{5}$$
Markdown Cellに上記を入力しそのCellを実行させ、以下の様にRenderingされればOKです。

Jupyter上でMathjaxを使った数式のサンプルはこの記事や、この記事にあります。また、Mathjaxの文法はこの記事(英語)が纏まって居ます。
notebookを保存してみる
file > renameで、作成したnotebookに名前を付け、file > Download asで*.ipynb形式で保存が可能です。
その他Jupyter機能
Jupyter上でshell scriptの実行
使っていてShell commandを実行したい、というケースはちょいちょいあります。Pythonのlibraryを追加したい、や、wgetで別のserverからfileを持ってきたい、など。
Master nodeにsshで入ってScriptを実行しても良いのですが、以下のいずれかの方法で、Jupyter上で直接shell scriptの実行も可能です。Jupyterを起動したuser権限でScriptが実行されます。
commandsを使う
commandsというpython libraryは、python上でshell scriptを実行してくれます。
import commands
commands.getoutput("date")
commands.getoutput("curl yahoo.co.jp")
Jupyterの!を使う
Jupyter固有の機能として、!の後にshell scriptを書くと実行してくれます。
!date
!curl yahoo.co.jp
以下の様にsudoしてshell scriptの実行も可能ですが、script実行後にJupyterがずっと処理中になるので、Interrupt等で復旧させる必要が有ります。
!sudo su
!find / -name 'hoge.txt'
Jupyter notebook extensions
Jupyter/IPythonのextensionと言うのが、(Jupyterの本家開発teamとは別で)開発されています。どんな機能があるかは、こちらの記事がとても良く纏まって居ます。
ExtensionのInstall方法は、上記のjupyterの設定で~/.jupyter/jupyter_notebook_config.pyを編集後、jupyter notebookでJupyterを起動させる前に、以下の2行を実行させればOKです。
mkdir -p ~/.local/share/jupyter
sudo pip install https://github.com/ipython-contrib/IPython-notebook-extensions/archive/master.zip
白状するとExtensionは自分は正直使っていません…。ExecuteTimeは便利ですが。
Jupyter Magic Commands
Jupyter/IPythonには、Magic Commandsという専用機能があります。ipython magic commandでググるといろいろ出てきますが、以下の様な物が有名です。
%whoで、宣言されている変数一覧の表示
%whosで、宣言されている変数一覧の詳細表示(型と値)
%%timeitで、Cellの処理に要した時間の計測
object名+?で、Objectの型と値の表示
%quickrefで、サポートされるMagic Commandの一覧の表示
Cellに%whosと入力した状態でそのCellを実行すると、Magic commandが実行されます。が、白状するとMagic Commandは自分は正直使っていません…。%whosは便利なのでたまに使いますが。
最後に
良いJupyter生活を!