長めの「はじめに」
SAPのインメモリ・データベース HANA にまずは触れてみたい、使ってみたいという方のために、SAP HANA express editionが用意されています。RAM 32GBまでのPCにインストール可能で、特に試用期限もありません(RAM 32GBを超えていてもインストールできないわけではない)。
OpenSUSE上にHANA express editionがインストールされたVMイメージが配布されており、インストール方法についてはSAP公式ブログの「SAP HANAに触れてみよう!その2:SAP HANA 2.0, express edition + 各種ツール類のセットアップのご紹介」に詳しいです。
その一方で、私のようにメモリ128GBの私物ノートPCを持ち歩く変態の立場から見ると、ノートPCのメインのOSは、CPUや省電力の取り回しに優れたWindows 10にしておきたいし、Windows版のDockerをインストールしてしまうと(Hyper-Vとの併用が前提なので)VirtualBoxやVMware Workstationと併存できず、せっかくメモリに恵まれていても、HANA使えないということになってしまいます(Hyper-V環境でのVMイメージの動作は未サポート)。
そうはいうものの、Docker for Windows/MacでのHANA express editionも未サポートなので、Windows 10上のHyper-VにUbuntu 18.04環境を作成し、Dockerをインストールした後、Hyper-V上のUbuntuのDocker環境にHANA express editionを入れましょうというのが本記事の趣旨です(Docker for WindowsでHANAが動かせる、と思われた方、すみません)。なお、Docker環境でのインストールは、Ubuntuに限らず、openSUSE, CentOS, Debian, Fedora環境でテストされています(Installing SAP HANA, express edition with Docker)。
なお、ここでの説明の内容はHyper-Vを使わないで、PC上に直接Linux Docker環境を構築された場合であっても、VirtualBoxやVMware Workstation上でLinux Docker環境を構築された場合であっても、クラウド上のLinux環境であっても、適用可能な内容であるかと思います(実Ubuntu環境では同様に動作することを検証済み。動いて当たり前ではあるけれど)。
HANAインストール前の環境構築に関しては、別途、記事にしました。
なお、私の勤務先のプロダクト(HANA)に関して言及しているところがありますが、私自身は当該製品を直接技術的に担当しているわけではありません。一ユーザーとしての情報共有であり、特段の社内レビューを経て公開している情報ではない旨、ご了解ください。
インストール
docker storeには、
- SAP HANA, express edition (database services)
- SAP HANA, express edition (database and application services)
の2種類のDockerコンテナが提供されているが、本記事では、後者のdatabase and application servicesの双方が提供されているコンテナをインストールしていきます。
docker storeの当該ページから、Setup Instructionを、また、RESOURCES→Documentationのリンクから、Installing SAP HANA, express edition Server + Apps, with Dockerという、それぞれ、丁寧にステップを追って書かれた(英語版の)手順が公開されているものの、そのままやっても動かない、わかりにくい、もう少しやりようがある点があるので、スクリーンショットと合わせて日本語で紹介することにします。
/etc/sysctl.conf ファイルの編集
HANA express editionが要求するスペックを満たすため、/etc/sysctl.conf
ファイルに次の記載を追加します。
fs.file-max=20000000
fs.aio-max-nr=262144
vm.memory_failure_early_kill=1
vm.max_map_count=135217728
net.ipv4.ip_local_port_range=40000 65535
一般ユーザーでは編集できないファイルなので、vi
使いであれば、
$ sudo vi /etc/sysctl.conf
保存後、設定した内容を、
$ sudo /sbin/sysctl -p
でシステムに反映させます(修正内容に誤りがあれば指摘されるので、再修正ののち、再度、上述の方法で反映させます。
/etc/hosts ファイルの編集
ここで、/etc/hosts
にdockerコンテナ(='hxehost')のIPアドレスを設定するように記載があるものの、現時点ではコンテナに付与されるIPアドレスがわからないので後回しにします。
HANA express editionの初期パスワード設定
次に、HANA express editionの初期パスワードをjson形式のファイルに設定します。
まず、後でコンテナ構築時にコンテナ側から見えるファイル共有位置として、'/data/hana'ディレクトリを作成します。
$ sudo mkdir -p /data/hana
次に、'/data/hana'ディレクトリにpassword.json
ファイルを作成して、初期パスワードを指定の上、保存します。
$sudo vi /data/hana/password.json
ここで、Setup Instructionには、Here is an exampleということで、
{
"master_password" : "SAPhxe123"
}
なる例が挙がっていますが、絶対に真似してはいけません!
ここで設定すべきパスワードは、
{
"master_password" : "HXEHana1"
}
password.json
ファイルを保存したら、hxeadm
ユーザーだけから見られる様にパーミッションを適切に設定しておきます。
$ sudo chmod 600 /data/hana/password.json
$ sudo chown 12000:79 /data/hana/password.json
なお、このファイル(password.json
)自体は、後程、コンテナが正しく作成されると自動的に削除されます。
Dockerコンテナの作成(をここでしてはいけない)
Setup Instructionによると、ここでSAP HANA, express edition containerを作成するのである、ということで、卒倒する長さのコマンドが挙がっていますが、絶対に真似してはいけません!(間違えてコピペしないよう、画像で紹介します)。
なぜなら、ここには2つのトラップが仕掛けられているからです。
Dockerイメージのダウンロード
HANA express editionのDockerイメージをDocker Storeからダウンロードするためには、あらかじめ、Docker Hubでアカウントを作成し、自端末側でもログインしておく必要があります。
$ sudo docker login
Hyper-V上のUbuntu 18.04LTSにdockerインストールの動作確認でも紹介した、hello-world程度の小さなサイズのイメージであれば、コンテナ作成しながらダウンロードというのもありですが、HANA express editionのDockerイメージはそんなに小さなものではありません。あらかじめ、SETUP INSTRUCTIONの右上に指定されたのと同じ方法で(ただし、自ユーザがdockerグループに所属していない場合は、頭にsudo
付けて)、Dockerイメージをダウンロードしておきます(なお、ダウンロード元の場所はバージョンアップ時に更新されて、下記のものと異なる可能性があります)。
$ sudo docker pull store/saplabs/hanaexpressxsa:2.00.031.00.20180712.1
全部で11.73GB + 113.4MB + その他の結構大容量ファイルをダウンロードすることになるので、時間と帯域の余裕のある時にこの作業は行う必要があります。
Dockerコンテナの作成(今度は本当に作成する)
それでは、ダウンロードしたDockerイメージをもとに、Dockerコンテナの作成、つまり、SAP HANA express editionを起動します。長くなりますが、コマンドラインから次のように入力します。
$ sudo docker run \
-p 39013:39013 -p 39015:39015 -p 39041-39045:39041-39045 \
-p 1128-1129:1128-1129 -p 59013-59014:59013-59014 -p 39030-39033:39030-39033 \
-p 51000-51060:51000-51060 -p 53075:53075 \
-h hxehost \
-v /data/hana:/hana/mounts \
--ulimit nofile=1048576:1048576 \
--sysctl kernel.shmmax=1073741824 \
--sysctl net.ipv4.ip_local_port_range='60000 65535' \
--sysctl kernel.shmmni=524288 \
--sysctl kernel.shmall=8388608 \
--name hanaexpressxsa \
store/saplabs/hanaexpressxsa:2.00.031.00.20180712.1 \
--agree-to-sap-license \
--passwords-url file:///hana/mounts/password.json \
--dont-exit-on-error
SETUP INSTRUCTIONのDocker containerの項に書かれている内容とほぼ同じですが、注意していただきたいのは、最後の行に書かれた--dont-exit-on-error
です。
--dont-exit-on-error
はSETUP INSTRUCTIONにも書かれている通り、エラーが発生したところでスクリプトを停止する(だけで、終了しない)ための指定です。この指定がないと、エラー等問題発生時にDockerコンテナが終了してしまうため、ログを見ることもできず、つまり、原因を突き止めることができなくなってしまいます。また、後述しますが、エラーは間違いなく発生するので、原因の追究と対応が必要となります。
XS Controllerが起動しない問題を修正する
前述の方法でDockerコンテナを作成、起動すると、しばらく待って後、次のような画面表示に遭遇します。真ん中より少し下にFAIL: process hdbxscontroller HDB XS Controller not running
と表示されています。
その次の行にExit trap called with exit code 2
と表示されているので、本来であればここで終了してしまい(結果として)Dockerの作成が修正してしまうと、ログを見ることもできなくなってしまうので、先ほどのDockerコンテナ作成時に--dont-exit-on-error
指定をしておき、Dockerコンテナ自体は終了しないようにしておいたのです。
それでは、原因を究明するために、別コンソールから先ほど作成したDockerコンテナのプロセスにアタッチするようにします。先ほどのメッセージの下に書かれているように、
$ sudo docker exec -ti hanaexpressxsa /bin/bash
を実行することで、Dockerコンテナにアタッチして、シェルを起動することができます。シェルを起動したら、cdtrace
コマンドでログ(trace)ファイルの格納ディレクトリに移動し、XS Controllerのログがあるか、ls xscontroller*.log
で確認します。スクリーンショットに挙げた例では、xscontroller_0.logファイルが該当するので、実際にログの中を見てみることにします。
less
でログを開いたら、Shift+G
で末尾に移動すると、何やらJavaのスタックトレースが出力されています。
下から順番に眺めてみると、java.nio.file.DirectoryNotEmptyException: /hana/shared/HXE/xs/app_working/stager
という例外出力が気になります。(さらにログの上の方を見てみても)XS Controllerが起動しないのはここが原因のように思われます。
q
を押してless
を抜け、ls -l /hana/shared/HXE/xs/app_working/stager
で中身を見てみると、作業用と思われるcache
, home
, tmp
, work
ディレクトリが(Dockerイメージに)残存しているようです。rm -rf /hana/shared/HXE/xs/app_working/stager
でこれら作業用ディレクトリを削除してしまいます。
また、せっかくコンテナに入ったので、ifconfig
でコンテナに割り当てられたIPアドレスを確認しておくことにします。
上の画面の例では、172.17.0.2
がIPアドレスとして割り当てられています。exit
でコンテナを抜け、Ubuntu側の/etc/hosts
ファイルにhxehost
のIPアドレス定義を追加しておきます(ただし、コンテナのIPアドレスに直接アクセスできるのはUbuntu側だけなので、Windows側の C:\Windows\System32\drivers\etc
フォルダに格納されているhosts
ファイルにはhxehost
のIPアドレスとして、UbuntuのIPアドレスを追加しておきます。Dockerコンテナ作成時に -p ポート番号:ポート番号の定義を長々としていたのはこのポートフォワーディングのための定義です)。
hosts
ファイルの修正が終わったら、sudo docker stop hanaexpressxsa
でDockerコンテナを終了します。先ほど起動したまま、途中停止していたDockerコンテナ起動コンソール上でもコンテナの終了が確認できるはずです。
Dockerコンテナ(HANA express edition)の起動
それではここからは、SETUP INSTRUCTIONS上の手順に沿って、動作を確認していきます。
改めてDockerコンテナを起動します。
$ sudo docker start -a hanaexpressxsa
コンテナの確認
別のコンソールからDockerコンテナにアタッチし(sudo docker exec -ti hanaexpressxsa /bin/bash
)、 whoami
で自分がhxeadm
でログインしていることを確認します。
次に、HDB info
コマンドを実行することで、HANAに関連するプロセスの実行状況を確認することができます。
データベースへのログイン
引き続き、システムデータベースにログインします。
$ hdbsql -i 90 -d SystemDB -u SYSTEM -p HXEHana1
すると初期パスワードのHXEHana1を変更しろと指示されるので、適切なパスワードを設定しておきます(前述のインストールプロセスでパスワードにHXEHana1を設定しておかないと、設定したパスワードを使ってもここでログインがうまくいかない)。
例えば、こんなSQL文で動作を確認できます。
SELECT DATABASE_NAME, ACTIVE_STATUS, RESTART_MODE FROM M_DATABASES ORDER BY 1;
確認ができたら、\q
でhdbsql
を抜けておきます。
WebIDE起動
次に、WebIDEの動作確認に移りますが、まず、WebIDEにログインする際のユーザーであるXSA_ADMIN
の初期パスワード(HXEHana1)を変更しておきます。変更にはいくつかの方法がありますが、先ほどのSYSTEM
ユーザーのパスワード変更の時と同様、
$ hdbsql -i 90 -d SystemDB -u XSA_ADMIN -p HXEHana1
でデータベースにログインすると、パスワード変更を促されるので、適宜パスワードを変更するようにします。変更が終わったら、\q
でhdbsql
を抜けます。
次に、ユーザーXSA_ADMIN
でHANA XSAにログインします。パスワードには今変更したパスワードを入力します。
$ xs login -u XSA_ADMIN -s SAP
(ここまでの前段となる話がSETUP INSTRUCTIONSでは見事に省略されてしまっているのですが)ここでxs apps
を実行すると、XSAアプリケーションのリストが表示されます。WebIDEが起動しているかどうかを確認するには、xs apps | grep webide
を実行すれば、https://hxehost:53075
で起動していることがわかります。
Ubuntu上でウェブブラウザを起動して、上記URLを入力します。hxehost
にhttpsで接続するのですが、自己署名による証明書を使用しているために警告画面が表示されます。hxehost
を例外に追加します。追加後、ポート39032に関しても同様の警告が表示されるので、例外に追加しておきます。
すると、SAP HANA XS Advancedのログイン画面が表示されるので、ユーザ名 XSA_DEV
パスワード HXEHana1
でログインします。
すると、こちらもXSA_DEV
ユーザの初期パスワードを変更するように指示されるので、パスワードを適切に変更するようにします。
ただし、ログイン後の画面は(自己署名証明書を使っているため)こんな感じになってしまうので、
別途、https://hxehost:51028
、およびhttps://hxehost:51012
を例外に加えておくようにします。
再度、https://hxehost:53075
を読み込みなおすと、次のような画面がめでたく表示されます(Firefoxだとこのように、ホスト名+ポート番号の組み合わせで例外登録していかないといけないので面倒くさいですが、Chromeであればホスト名に対して例外登録するだけなので手間は減ります)。
WebIDEからHANAデータベースに接続
起動したWebIDEからTools→Database Explorerを選択します。すると、まだデータベースへの接続設定を行っていないので、接続設定を追加するか確認するダイアログボックスが表示されるので(Do you want to add one now?)、Yesと答えておきます。
すると、Add Database画面が表示されるので、一番上のDatabase TypeをSAP HANA Database (Multitenant)に指定し、他の項目も合わせて指定していきます。
[OK]ボタンを押すと、こんな感じでHANAデータベースに接続ができます。
前述のデータベースへのログインの項では、hdbsql
コマンドを使ってデータベースに接続し、SQL文で取得していた内容を、WebIDEのGUI画面上でも同様に参照することが可能です。
#まとめ
HANA express edition Dockerコンテナ起動(Ubuntuから)
$ sudo docker start -a hanaexpressxsa
シェル起動(Ubuntuから)
$ sudo docker exec -ti hanaexpressxsa /bin/bash
WebIDE起動(Ubuntu/Windowsのウェブブラウザから。Chrome推奨。)
HANAシャットダウン(コンテナ上=起動したシェルから)
$ HDB stop
コンテナ停止(コンテナ外=Ubuntuから)
$ sudo docker stop hanaexpressxsa
終わりに
ここまでのDockerベースでのSAP HANA express editionのインストールはいかがでしたでしょうか? 微に入り細に入り持って回った説明で「面倒くさい」ような印象を持たれたかもしれませんが、実際に手を動かしてみると、自分のお気に入りのLinux環境で簡単にHANAが使い始められる優れモノであることがわかるかと思います。
ぜひインメモリの速さであったり、Spatialな位置情報やGraphエンジン、自然言語によるテキストのハンドリング等、ご自身の興味に合わせて、HANAのパワーを実感していただけるかと思います。
私自身もそういったHANAの実利用イメージをQiita上でご紹介していければと思います。それでは!