実際に構築するのにかかる時間: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
その他
- 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アカウント作成時に設定したものです。
ログイン成功するとダッシュボード(Dashboard)が表示されます。
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に置き換えて、より高度な設計にもトライしたい
コメント