なからなLife

geekに憧れと敬意を抱きながら、SE、ITコンサル、商品企画、事業企画、管理会計、総務・情シス、再び受託でDB屋さんと流浪する人のブログです。

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対応のものを用意します。

ここまで全くおなじ操作で勧めてきた場合、wgetgccが入ってない可能性があるので、必要に応じてyumwgetをインストールしておきます。

# 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)

Pythonによるあたらしいデータ分析の教科書 (AI&TECHNOLOGY)

最後に

今回はJupyter Notebookで頑張っちゃいましたけど、最初から組み込まれているってすばらしいですね。