CentOS 7でApache Supersetを動かす!初めてのPython仮想環境構築も

ソフトウェア技術
スポンサーリンク
この記事を読むのにかかる時間:20分〜
実際に構築するのにかかる時間:2時間〜

はじめに

この記事は

うぃくとです。

2019年の初頭に、Apache Supersetをインストールしたときの作業記録をコマンドラインベースで書き起こしたものです。そこはそうじゃない、もっと良い方法がある、などあればコメントいただけると幸いです。

Apache Supersetとは

Apache Superset(以降、Superset)とはApache Software Foundation(ASF) incubating projectとして公開されているWEBアプリケーションベースのBIツールです。詳しいことはApache Supersetのサイトに書かれています。

もとは民泊でお馴染みのAirbnbが中心となって開発し、オープンソース化されたものです。ソースを見てわかる通りPythonで実装されています。

目標

  • Supersetのwebコンソールにログインしてサンプルのdashboardが見れる状態まで

環境

  • Cent OS 7.4
  • Python 3.6
Pythonのバージョンは何にする?
いまのところPython 2.x系はCentOS7系で標準インストール(提供)されていますが、Python 3.x系は提供されていないようです。Python 2.xと3.xに互換性はないとされています。さらにInstallationをよく見ると次のようにあります。
Superset has deprecated support for Python 2.* and supports only ~=3.6 to take advantage of the newer Python features and reduce the burden of supporting previous versions.
よって、Python3系を自分でインストールして使うほうがよさそうです。

その他

  • pipでインストールします
    Dockerが使えるようですが敢えて使いません
  • /opt/visual/をインストール先(supersetのホームディレクトリ)として構築します

手順

依存パッケージをインストールする

そもそもyumリポジトリが有効かどうか確認します

# yum repolist

例えば、次のような結果が返ります。CentOSの標準リポジトリが有効(利用可能)になっているのでOKです。

リポジトリー ID               リポジトリー名                      状態
base/7/x86_64               CentOS-7 - Base                   10,019
extras/7/x86_64             CentOS-7 - Extras                 321
updates/7/x86_64            CentOS-7 - Updates          625
repolist: 10,965

有効なリポジトリがない場合には、/etc/yum.repo/直下に.repoファイルを追加します。

 Python以外のパッケージをインストールします

# yum install gcc gcc-c++ libffi-devel openssl-devel libsasl2-devel openldap-devel

次のような結果(抜粋)が返りました。

パッケージ libsasl2-devel は利用できません。

!!

つまり libsasl2-devel がCentOSの標準リポジトリに含まれていないようです。Supersetのgithubのフォーラム(Issues)をみたところ、既知の問題として報告されていました。どうやらcyrus-sasl-develを使うことで代用できるようです。

修正してリトライします。

# yum install gcc gcc-c++ libffi-devel openssl-devel cyrus-sasl-devel openldap-devel 

結果は次のとおりです。

インストール:
  cyrus-sasl-devel.x86_64 0:2.1.26-23.el7                 gcc.x86_64 0:4.8.5-36.el7                           
  gcc-c++.x86_64 0:4.8.5-36.el7                           libffi-devel.x86_64 0:3.0.13-18.el7                 
  openldap-devel.x86_64 0:2.4.44-20.el7                   openssl-devel.x86_64 1:1.0.2k-16.el7                

依存性関連をインストールしました:
  cpp.x86_64 0:4.8.5-36.el7                            glibc-devel.x86_64 0:2.17-260.el7                     
  glibc-headers.x86_64 0:2.17-260.el7                  kernel-headers.x86_64 0:3.10.0-957.1.3.el7            
  keyutils-libs-devel.x86_64 0:1.5.8-3.el7             krb5-devel.x86_64 0:1.15.1-34.el7                     
  libcom_err-devel.x86_64 0:1.42.9-13.el7              libkadm5.x86_64 0:1.15.1-34.el7                       
  libselinux-devel.x86_64 0:2.5-14.1.el7               libsepol-devel.x86_64 0:2.5-10.el7                    
  libstdc++-devel.x86_64 0:4.8.5-36.el7                libverto-devel.x86_64 0:0.2.5-4.el7                   
  pcre-devel.x86_64 0:8.32-17.el7                      zlib-devel.x86_64 0:1.2.7-18.el7                      

完了しました!

今度は問題なくインストールできました。

Python3.6をyumインストールする

Pythonをインストールできるリポジトリを追加します

ここではEPELリポジトリを追加します。

# yum install -y https://centos7.iuscommunity.org/ius-release.rpm

結果(抜粋)は次のとおりです。

インストール:
  ius-release.noarch 0:1.0-15.ius.centos7       

依存性関連をインストールしました:
  epel-release.noarch 0:7-11                                        

完了しました!

リポジトリに含まれる最新版でPythonをインストールします

インストール可能な最新バージョンのPythonを調べます。

# yum search python3

私の環境ではPython3.6だったので、3.6をインストールします。

# yum install python36u python36u-libs python36u-devel python36u-pip python-wheel

結果は次のとおりです。

インストール:
  python-wheel.noarch 0:0.24.0-2.el7                     python36u.x86_64 0:3.6.7-1.ius.centos7
  python36u-devel.x86_64 0:3.6.7-1.ius.centos7           python36u-libs.x86_64 0:3.6.7-1.ius.centos7
  python36u-pip.noarch 0:9.0.1-1.ius.centos7            

依存性関連をインストールしました:
  python36u-setuptools.noarch 0:39.0.1-1.ius.centos7  

完了しました!

動作確認をします。

# python --version
Python 2.7.5

# python3.6 --version
Python 3.6.7

標準でCentOSにインストールされているpythonバージョンは2.7.5なので、明示的にpython3.6を指定する必要があります。



Python仮想環境を構築します

まずPythonの各種ツールを最新版にアップデートします。

#  pip3.6 list
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
pip (9.0.1)
setuptools (39.0.1)
You are using pip version 9.0.1, however version 18.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

pipのバージョンが古い(9.0.1)です。この時点での最新版は18.1なのでアップデートします。

# pip install --upgrade setuptools pip

結果(抜粋)は次のとおりです。

Successfully installed pip-18.1 setuptools-40.6.3

成功しました。次に仮想環境を構築します。ここでは /opt/visual/ を構築します。

# mkdir -p /opt/visual/
# cd /opt/
# virtualenv visual/

結果は次のとおりでした。

Using base prefix '/usr'
New python executable in /opt/visual/bin/python3.6
Also creating executable in /opt/visual/bin/python
Installing setuptools, pip, wheel...
done.

この状態では環境を作成しただけで使える状態でないので、アクティベートします。

# cd visual/
# . ./bin/activate

(visual) #

プロンプトが変わりました。これでPython仮想環境内での操作が可能になりました。

確認のためPythonバージョンを見てみます。3.6系ならOKです。

(visual) # python --version
Python 3.6.7

OKでした。この状態でdeactivateすれば仮想化環境を終了でき、通常のファイルシステムの操作に戻れます。

Supersetのインストールと初期化

pipでSupersetをインストールします

(visual) # pip install superset

結果(抜粋)は次のとおりです。

・・・
Successfully built superset flask-appbuilder flask-compress flower future humanize parsedatetime pydruid pyhive python-geohash pyyaml simplejson sqlalchemy sqlalchemy-utils thrift thrift-sasl unicodecsv billiard Flask-Babel Flask-Login Flask-OpenID alembic tornado geographiclib sasl pycparser Mako python-editor linear-tsv openpyxl et-xmlfile
・・・

Supersetのビルドは成功したようです。続けてSupersetの初期設定をします。

Supersetのadminアカウントを作成します

Supersetの管理者権限を持つユーザを始めに設定します。この類の設定は後で変更可能だと思うので、まずは次のように設定します。

  • ユーザ名:admin
  • パスワード:admin
  • user firstname:admin
  • user lastname:user
(visual) # fabmanager create-admin --app superset --username admin --firstname admin --lastname user --password admin
Email [admin@fab.org]: 
Recognized Database Authentications.
Admin User admin created.

メールアドレスの設定を求められましたが、入力しなくても管理者ユーザの作成はできました。

Supersetを初期化します

(visual) # superset db upgrade
(visual) # superset load_examples
(visual) # superset init

実行後にかなりの分量のメッセージが出力されますが、エラーのような対処が必要なものはなかったので省略します。

Supersetを起動します

(visual) # superset runserver
2019-01-08 22:38:13,335:INFO:root:The Gunicorn 'superset runserver' command is deprecated. Please use the 'gunicorn' command instead.
Starting server with command:

この状態でコマンドラインは止まったように見えますが、これで問題ありません。

superset runserver -p <port>でポート番号を変更することができますが、今回はデフォルトのまま起動させます。
Installationの通りに-dオプションを付けるとデバッグモードで起動します。
実はSupersetの適切な終了方法がわかりませんが、Ctrl + Cで(強制)終了できます。

Supersetの動作確認

SupersetはWEBベースのBIツールです。ブラウザで操作できることを確認してみます。

ブラウザでSupersetログイン画面にアクセスします

ブラウザで次のURLにアクセスします。localhostは各自の環境に合わせて適宜変更してください。

http://localhost:8088 

ユーザ名とパスワードはadminアカウント作成時に設定したものです。

SupersetのWEBコンソールログイン画面

ログイン成功するとダッシュボード(Dashboard)が表示されます。

SupersetのDasboard

Extra Stage;Supersetのサービス化

コマンドsuperset runserverでSupersetを起動しましたが、デーモンなので、ターミナルが起動したままとなります。

このままでも動くのですが、芸がないので、サービス化します。他に方法はあると思いますが、まずは一例です。

サービス起動デーモンにSupersetを登録

Unitファイルを作成します

次のように/etc/systemd/system/superset.serviceを作成します。

[Unit]
Description=superset daemonized by systemd
After=network.target

[Service]
Type=simple
User=root
EnvironmentFile=/etc/sysconfig/superset.conf
ExecStart=/opt/visual/bin/superset runserver -p $PORT
Restart=on-failure

[Install]
WantedBy=multi-user.target

Configファイルを作成します

次のように/etc/sysconfig/superset.confを作成します。

PORT=8088
PATH=/opt/visual/bin:$PATH
PYTHONPATH=/opt/visual:$PYTHONPATH

サービスを追加します

systemデーモンにサービスを追加したことを反映させます。

# systemctl daemon-reload

Supersetをサービスとして起動

systemctlコマンドを使ってSupersetを起動します。特に出力される文字列はありません。

# systemctl start superset

サービスとして起動していることを確認します。

# systemctl status superset

次のような出力が得られます。

● superset.service - superset daemonized by systemd
   Loaded: loaded (/etc/systemd/system/superset.service; disabled; vendor preset: disabled)
   Active: active (running) since 木 2019-01-10 03:18:56 JST; 2s ago
 Main PID: 31202 (superset)
    Tasks: 1
   CGroup: /system.slice/superset.service
           └─31202 /opt/visual/bin/python3.6 /opt/visual/bin/superset runserver -p 8088

 1月 10 03:18:56 visual systemd[1]: Started superset daemonized by systemd.

1行目で期待通りのサービスがステータス表示の対象となっていることが読み取れます。
3行目でSupersetがactiveであることが読み取れます。

まとめ

振り返っての改善点

pip install --upgrade setuptools pip はvirtualenvで仮想環境を作成し、アクティベートしてからの実施でよかったかもしれません。

感想と今後の意気込み

  • 過去に同じ問題に直面した人がいて、解決策や回避策が議論された結果をググるだけで学べるのはオープンソースの大きなメリットだと体感しました
  • サンプル以外のデータソースを構築・連携してみたい
    たとえば自分の家計簿とか
  • ダッシュボードを構築する
  • WEBサーバをApache HTTP ServerやNginxに置き換えて、より高度な設計にもトライしたい

コメント

タイトルとURLをコピーしました