CentOS + Python3 + Jupyter NotebookでRDBMSに対する分析環境を作る
Jupyter Notebook環境構築エントリとか、世の中に溢れかえっているのは承知の上なんで、ほぼ自分用の備忘です。
未来の自分に語りかけてます。この手順、絶対忘れる。。。
皆さんよく使うゴリゴリのPython+pandasなど各種ライブラリではなく、「RDBMSの中身を見やすい形で出力しつつ、その出力結果を残したまま継続作業をする」ための環境がほしかった、というのがきっかけですね。
あわよくば、今までExcelにコピペしてからグラフ作ってたりしたのを、Jupyter Notebook上で済ませたい、というくらい。
なお、あえて使い慣れたCentOS6ですが、CentOS7でも、下準備で止めるサービスとか以外は大差ないですね。
下準備
CentOS6をminimal install後、以下を実施
# yum -y update # chkconfig iptables off # chkconfig ip6tables off # service iptables stop # service ip6tables stop
あと、SELinuxの無効化もやっておきます。
/etc/selinux/config で「enfocing」を「disabled」に書き換えて再起動。
Python3系のインストール
# yum install -y https://centos6.iuscommunity.org/ius-release.rpm # yum install -y python36* # pip3.6 install --upgrade pip
3.7系出てるけど、yumで取れるのが3.6までだったので、それで。
そこまで厳密に新しいものがほしいわけではないので。
念の為、こんな感じに入りました。
# which python3.6 /usr/bin/python3.6 # which pip3.6 /usr/bin/pip3.6 # python3.6 -V Python 3.6.8 # pip3.6 -V pip 19.1.1 from /usr/lib/python3.6/site-packages/pip (python 3.6)
virtualenv のインストール
VirtualBoxにコレ専用のゲストマシンを立てる運用なので、さらに仮想環境作らなくてもよいのだけど、念の為。
# pip3.6 install virtualenv
これで環境準備完了。
# python3.6 -m virtualenv 仮想環境へのパス
で、仮想環境を示すディレクトリがカレントの下に生成されます。
source 仮想環境へのパス/bin/activate
で仮想環境の中に入り
(venv_rdbms) # deactivate
で仮想環境の外へでます。
今回は「venv_rdbms」という環境で作業します。
Jupyter Notebookをインストール
(venv_rdbms) # pip install jupyter (venv_rdbms) # jupyter notebook --allow-root --no-browser --ip=0.0.0.0
仮想環境(venv_rdbms)に入った状態からjupyterをインストールします。以降、原則として仮想環境内で各種追加モジュールをインストールします。
rootで環境構築してきてしまったので、「--allow-root」が必須です。root以外のユーザーで環境を立てた場合は不要です。
GUI入でLinuxを立てて、そのGUI内でのコンソールからJupyter Notebookを起動すると、ブラウザが自動起動します。しかし、今回はCLIのみでVirtualBox上に環境構築し、ホストマシンからブラウザでアクセスする利用方法を取るので、「--no-browser」でブラウザ起動を抑制するほか、ホストマシンであるWindowsからアクセス可能にするために「--ip=0.0.0.0」をつけます。
実行すると、token付きのURLが出力されるので、それをホストマシンのブラウザにコピペしてアクセスします。
http://ホスト名 or IPアドレス:8888/?token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
引数の都度入力がめんどくさい場合、固定化する方法もありますが、今回はコレで。
Oracleに接続する環境を整える
「cx_Oracle」を通じて、PythonからOracleに接続可能にします。
このcx_Oracleにはと「Oracle Instant Client」が必要ですが、これはOracleのサイトから入手する必要があります。
https://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html
から、バージョンなど確認しつつ「basic」のものを入手します。
今回は12.1に接続するので、そのバージョンのもので。(多分最新のものでもつながるけど)
oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm
を入手したら、適当なディレクトリ置いて
# rpm -i oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm
でインストールします。
その後、.bash_profileに以下を追加します。。
# echo 'export LD_LIBRARY_PATH=/usr/lib/oracle/12.1/client64/lib:$LD_LIBRARY_PATH' >> .bash_profile # source .bash_profile
その後、仮想環境(venv_rdbms)内のpipでcx_Oracleをインストール。
(venv_rdbms) # pip install cx_Oracle --upgrade
うまく認識しているか、確認します。pythonのインタプリタから確認します。
(venv_rdbms) # python Python 3.6.8 (default, May 2 2019, 19:37:42) [GCC 4.4.7 20120313 (Red Hat 4.4.7-23)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import cx_Oracle >>> cx_Oracle.clientversion() (12, 1, 0, 2, 0) >>> quit()
こんな感じでバージョン情報の照会ができればOKですね。
MySQLに接続する環境を整える
pipでpymysqlをインストールするだけです。Oracleのときのように別のモジュールを追加する必要はないです。
(venv_rdbms) # pip install pymysql
動作確認
(venv_rdbms) # python Python 3.6.8 (default, May 2 2019, 19:37:42) [GCC 4.4.7 20120313 (Red Hat 4.4.7-23)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import pymysql >>> print(pymysql.apilevel) 2.0 >>> quit()
pymysqlのメソッドを叩いて結果が返ってくればOKです。
どんなメソッドを持っているのか、pymysqlのドキュメントから読み取りきれないのがアレだけど。
MySQL本家の「ConnectorPython」の方でのやり方はまだ分かってない。。。
PostgreSQLに接続する環境を整える
「psycopg2」を使用しますが、pg_configも合わせて必要になります。
先に「pg_config」がインストールされていないと、「psycopg2」のインストールがエラーになります。
yumで取得できるPostgreSQLは8.4なので、もっと新しいものをとってくるには、yumリポジトリの追加から。
手元にあるpostgreSQLが10系なので、10対応のものを用意します。
ここまで全くおなじ操作で勧めてきた場合、wgetとgccが入ってない可能性があるので、必要に応じてyumでwgetをインストールしておきます。
# yum -y install gcc # wget https://download.postgresql.org/pub/repos/yum/reporpms/EL-6-x86_64/pgdg-redhat-repo-latest.noarch.rpm # yum -y localinstall pgdg-redhat-repo-latest.noarch.rpm # yum -y install postgresql10-devel.x86_64 # echo 'export PATH=/usr/pgsql-10/bin:$PATH' >> .bash_profile # source .bash_profile
その後、仮想環境(venv_rdbms)から、psycopg2を入れます。
(venv_rdbms) # pip install psycopg2
pg_configのバイナリが入っている/usr/pgsql-10/binに対してPATHを通しておかないと、pg_configエラーがでます。
(venv_rdbms) # python Python 3.6.8 (default, May 2 2019, 19:37:42) [GCC 4.4.7 20120313 (Red Hat 4.4.7-23)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import psycopg2 >>> print(psycopg2.apilevel) 2.0 >>> quit()
pymysqlのメソッドを叩いて結果が返ってくればOKです。
ipython-sqlを入れて、SQLをJupyter Notebookで扱う
仮想環境(venv_rdbms)から、pipでインストールします。
(venv_rdbms) # pip install ipython-sql
これを入れておくと、「%%sql」というマジックワードを指定した後、SQLをそのまま書いて実行して、結果をそのまま表示できるようになります。
GitHub - catherinedevlin/ipython-sql: %%sql magic for IPython, hopefully evolving into full SQL client
Jupyter Notebookのイメージ貼らないけど、こちらに出力イメージやら設定方法の詳細やら書いてあります。
以下、今回やったOracle,MySQL,PostgreSQLへの接続と動作確認方法を列挙しておきます。
なおセミコロンは不要です。あるとエラーになります。
結果がNotebookに表示されます。
結果をDataFrameに格納してゴリゴリ動かしたり、グラフで表示したい場合は、pandasやmatplotlibを入れておいたほうがいいですね。
Oracleに接続してSQLを投げてみる
以下をJupyter Notebookから実行します。
import cx_Oracle
%load_ext sql
%sql oracle+cx_oracle://{ユーザー}:{パスワード}@{接続先}:{ポート番号}/{データベース}
SYSDBAで接続するときは、「?mode=SYSDBA」をつけます。
%%sql select sysdate from dual
MySQLに接続してSQLを投げてみる
以下をJupyter Notebookから実行します。
import pymysql
%load_ext sql
%sql mysql+pymysql://{ユーザー}:{パスワード}@{接続先}:{ポート番号}/{データベース}
%%sql select now()
PostgreSQLに接続してSQLを投げてみる
以下をJupyter Notebookから実行します。
import psycopg2
%load_ext sql
%sql postgres://{ユーザー}:{パスワード}@{接続先}:{ポート番号}/{データベース}
%%sql select now()
まとめ
- CentOS系はPython3系を入れる手間が余計にかかる。
- virtualenvはあってもなくてもいいけど、使った場合は、仮想環境内でJupyter等をpipする必要がある。
- Jupyterは、root起動非推奨なので、rootでセットアップすると起動時にオプションが必要。
- Jupyterにリモートアクセスする際も、追加設定が必要。
- pythonからRDBMSにつなぐ際、コネクタによっては依存するライブラリがある。
- 本当にやりたかったことは、ipython-sqlが担ってる。
Jupyter Notebook使って分析やろうぜ系の本とかWeb記事、まだそんなに読んでないけど、RDBMSに接続するところ書いてないよね。だいたいCSVファイル等のサンプル。
この本にもソコは書いてなかったけど、一通り写経して、わりとわかりやすかったです。(高等数学の数式はほとんど理解できてない私立文系文学部脳
Pythonによるあたらしいデータ分析の教科書 (AI&TECHNOLOGY)
- 作者: 寺田学,辻真吾,鈴木たかのり,福島真太朗
- 出版社/メーカー: 翔泳社
- 発売日: 2018/09/19
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
最後に
今回はJupyter Notebookで頑張っちゃいましたけど、最初から組み込まれているってすばらしいですね。
Oracle Autonomous Databaseにはそういう機能がついています。Zeppelinベースですが、便利です。TryItもあるので、ぜひ使ってみてください。https://t.co/JPZG6Wrvzahttps://t.co/7FT4jzbO0d
— maato (@maato) June 20, 2019