Edited at

Docker版のSAP HANA express editionをインストールする


長めの「はじめに」

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には、

の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

viを起動し、こんな感じで編集、保存します。

保存後、設定した内容を、

$ 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;

確認ができたら、\qhdbsqlを抜けておきます。


WebIDE起動

次に、WebIDEの動作確認に移りますが、まず、WebIDEにログインする際のユーザーであるXSA_ADMINの初期パスワード(HXEHana1)を変更しておきます。変更にはいくつかの方法がありますが、先ほどのSYSTEMユーザーのパスワード変更の時と同様、

$ hdbsql -i 90 -d SystemDB -u XSA_ADMIN -p HXEHana1

でデータベースにログインすると、パスワード変更を促されるので、適宜パスワードを変更するようにします。変更が終わったら、\qhdbsqlを抜けます。

次に、ユーザー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推奨。)

https://hxehost:53075


HANAシャットダウン(コンテナ上=起動したシェルから)

$ HDB stop


コンテナ停止(コンテナ外=Ubuntuから)

$ sudo docker stop hanaexpressxsa


終わりに

ここまでのDockerベースでのSAP HANA express editionのインストールはいかがでしたでしょうか? 微に入り細に入り持って回った説明で「面倒くさい」ような印象を持たれたかもしれませんが、実際に手を動かしてみると、自分のお気に入りのLinux環境で簡単にHANAが使い始められる優れモノであることがわかるかと思います。

ぜひインメモリの速さであったり、Spatialな位置情報やGraphエンジン、自然言語によるテキストのハンドリング等、ご自身の興味に合わせて、HANAのパワーを実感していただけるかと思います。

私自身もそういったHANAの実利用イメージをQiita上でご紹介していければと思います。それでは!