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

# 長めの「はじめに」
SAPのインメモリ・データベース HANA にまずは触れてみたい、使ってみたいという方のために、SAP HANA express editionが用意されています。RAM 32GBまでのPCにインストール可能で、特に試用期限もありません(RAM 32GBを超えていてもインストールできないわけではない)。

OpenSUSE上にHANA express editionがインストールされたVMイメージが配布されており、インストール方法についてはSAP公式ブログの「[SAP HANAに触れてみよう！その２：SAP HANA 2.0, express edition ＋ 各種ツール類のセットアップのご紹介](https://www.sapjp.com/blog/archives/15580)」に詳しいです。

その一方で、私のようにメモリ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](https://www.sap.com/developer/tutorials/hxe-ua-install-using-docker.html))。

なお、ここでの説明の内容はHyper-Vを使わないで、PC上に直接Linux Docker環境を構築された場合であっても、VirtualBoxやVMware Workstation上でLinux Docker環境を構築された場合であっても、クラウド上のLinux環境であっても、適用可能な内容であるかと思います(実Ubuntu環境では同様に動作することを検証済み。動いて当たり前ではあるけれど)。

HANAインストール前の環境構築に関しては、別途、記事にしました。

- [Windows 10 Pro Hyper-V に Ubuntu 18.04 LTS をインストール](https://qiita.com/mfunaki/items/9e2901936b04f00f9cd7)
- [Hyper-V上のUbuntu 18.04LTSにdockerインストール](https://qiita.com/mfunaki/items/be04a6082272bb7e6100
)
 
~~なお、私の勤務先のプロダクト(HANA)に関して言及しているところがありますが、私自身は当該製品を直接技術的に担当しているわけではありません。一ユーザーとしての情報共有であり、特段の社内レビューを経て公開している情報ではない旨、ご了解ください。~~

# インストール
[docker store](https://store.docker.com/)には、

- [SAP HANA, express edition (database services)](https://store.docker.com/images/sap-hana-express-edition)
- [SAP HANA, express edition (database and application services)](https://store.docker.com/images/sap-hana-express-edition-incl-application-services)

の2種類のDockerコンテナが提供されているが、本記事では、後者のdatabase and application servicesの双方が提供されているコンテナをインストールしていきます。

![20180729-024.png](https://qiita-image-store.s3.amazonaws.com/0/19248/59bfc47c-601a-761b-4fad-036e69d60d3b.png)

docker storeの当該ページから、Setup Instructionを、また、RESOURCES→Documentationのリンクから、[Installing SAP HANA, express edition Server + Apps, with Docker](https://www.sap.com/developer/tutorials/hxe-ua-install-using-docker-xsa.html)という、それぞれ、丁寧にステップを追って書かれた(英語版の)手順が公開されているものの、そのままやっても動かない、わかりにくい、もう少しやりようがある点があるので、スクリーンショットと合わせて日本語で紹介することにします。

## /etc/sysctl.conf ファイルの編集
HANA express editionが要求するスペックを満たすため、`/etc/sysctl.conf` ファイルに次の記載を追加します。

```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`使いであれば、

```shell
$ sudo vi /etc/sysctl.conf
```

で`vi`を起動し、こんな感じで編集、保存します。
![20180729-026.png](https://qiita-image-store.s3.amazonaws.com/0/19248/ce6185d8-90e9-1b48-f055-0cac65ef08b8.png)

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

```shell
$ sudo /sbin/sysctl -p
```

でシステムに反映させます(修正内容に誤りがあれば指摘されるので、再修正ののち、再度、上述の方法で反映させます。

## /etc/hosts ファイルの編集
ここで、`/etc/hosts`にdockerコンテナ(='hxehost')のIPアドレスを設定するように記載があるものの、現時点ではコンテナに付与されるIPアドレスがわからないので後回しにします。

## HANA express editionの初期パスワード設定
次に、HANA express editionの初期パスワードをjson形式のファイルに設定します。
まず、後でコンテナ構築時にコンテナ側から見えるファイル共有位置として、'/data/hana'ディレクトリを作成します。

```shell
$ sudo mkdir -p /data/hana
```

次に、'/data/hana'ディレクトリに`password.json`ファイルを作成して、初期パスワードを指定の上、保存します。

```shell
$sudo vi /data/hana/password.json
```

ここで、Setup Instructionには、Here is an exampleということで、

```json
{
  "master_password" : "SAPhxe123"
}
```
なる例が挙がっていますが、**絶対に真似してはいけません**！
ここで設定すべきパスワードは、

```json
{
  "master_password" : "HXEHana1"
}
```
です。
![20180727-030 (2).png](https://qiita-image-store.s3.amazonaws.com/0/19248/a8576670-81cc-0795-cea5-219fae261fc8.png)

`password.json`ファイルを保存したら、`hxeadm`ユーザーだけから見られる様にパーミッションを適切に設定しておきます。

```shell
$ 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を作成するのである、ということで、卒倒する長さのコマンドが挙がっていますが、**絶対に真似してはいけません**！(間違えてコピペしないよう、画像で紹介します)。
![20180727-032 (2).png](https://qiita-image-store.s3.amazonaws.com/0/19248/f518fb53-806f-4e35-75cf-9cb48f23c9d8.png)

なぜなら、ここには2つのトラップが仕掛けられているからです。

## Dockerイメージのダウンロード
HANA express editionのDockerイメージをDocker Storeからダウンロードするためには、あらかじめ、[Docker Hub](https://hub.docker.com/ )でアカウントを作成し、自端末側でもログインしておく必要があります。

```shell
$ sudo docker login
```

[Hyper-V上のUbuntu 18.04LTSにdockerインストール](https://qiita.com/mfunaki/items/be04a6082272bb7e6100)の動作確認でも紹介した、hello-world程度の小さなサイズのイメージであれば、コンテナ作成しながらダウンロードというのもありですが、HANA express editionのDockerイメージはそんなに小さなものではありません。あらかじめ、[SETUP INSTRUCTION](https://store.docker.com/images/sap-hana-express-edition-incl-application-services/plans/6e81dee1-5032-4e3a-b227-80175d70eeb5?tab=instructions)の右上に指定されたのと同じ方法で(ただし、自ユーザがdockerグループに所属していない場合は、頭に`sudo`付けて)、Dockerイメージをダウンロードしておきます(なお、ダウンロード元の場所はバージョンアップ時に更新されて、下記のものと異なる可能性があります)。

```shell
$ sudo docker pull store/saplabs/hanaexpressxsa:2.00.031.00.20180712.1
```

ダウンロード中の画面はこんな感じです。
![20180727-035 (2).png](https://qiita-image-store.s3.amazonaws.com/0/19248/a37ee892-0275-a66b-72b9-8c4524e8dd57.png)

全部で11.73GB + 113.4MB + その他の結構大容量ファイルをダウンロードすることになるので、時間と帯域の余裕のある時にこの作業は行う必要があります。

## Dockerコンテナの作成(今度は本当に作成する)
それでは、ダウンロードしたDockerイメージをもとに、Dockerコンテナの作成、つまり、SAP HANA express editionを起動します。長くなりますが、コマンドラインから次のように入力します。

```shell
$ 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`と表示されています。
![Screenshot from 2018-08-11 09-23-38.png](https://qiita-image-store.s3.amazonaws.com/0/19248/8934233b-d8ee-1db2-daab-4572c36975b9.png)
その次の行に`Exit trap called with exit code 2`と表示されているので、本来であればここで終了してしまい(結果として)Dockerの作成が修正してしまうと、ログを見ることもできなくなってしまうので、先ほどのDockerコンテナ作成時に`--dont-exit-on-error`指定をしておき、Dockerコンテナ自体は終了しないようにしておいたのです。
それでは、原因を究明するために、別コンソールから先ほど作成したDockerコンテナのプロセスにアタッチするようにします。先ほどのメッセージの下に書かれているように、

```shell
$ sudo docker exec -ti hanaexpressxsa /bin/bash
```

を実行することで、Dockerコンテナにアタッチして、シェルを起動することができます。シェルを起動したら、`cdtrace`コマンドでログ(trace)ファイルの格納ディレクトリに移動し、XS Controllerのログがあるか、`ls xscontroller*.log`で確認します。スクリーンショットに挙げた例では、xscontroller_0.logファイルが該当するので、実際にログの中を見てみることにします。

![Screenshot from 2018-08-11 09-42-41.png](https://qiita-image-store.s3.amazonaws.com/0/19248/21a7481a-caf2-97f7-c7d4-423e5f1d2f4f.png)

`less`でログを開いたら、`Shift+G`で末尾に移動すると、何やらJavaのスタックトレースが出力されています。

![Screenshot from 2018-08-11 09-47-11.png](https://qiita-image-store.s3.amazonaws.com/0/19248/c5aa542a-4e4b-77bb-57f1-64912d59bd30.png)

下から順番に眺めてみると、`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アドレスを確認しておくことにします。

![Screenshot from 2018-08-11 10-28-23.png](https://qiita-image-store.s3.amazonaws.com/0/19248/e37e9f89-211b-b352-b817-a27f99f009ba.png)

上の画面の例では、`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コンテナを起動します。

```shell
$ sudo docker start -a hanaexpressxsa
```
今度は問題なく起動したようです。
![Screenshot from 2018-08-11 10-46-15.png](https://qiita-image-store.s3.amazonaws.com/0/19248/3fd9f10e-d709-1965-8313-c704506e2245.png)

## コンテナの確認
別のコンソールからDockerコンテナにアタッチし(`sudo docker exec -ti hanaexpressxsa /bin/bash`)、 `whoami`で自分が`hxeadm`でログインしていることを確認します。

次に、`HDB info`コマンドを実行することで、HANAに関連するプロセスの実行状況を確認することができます。

![Screenshot from 2018-08-11 10-50-50.png](https://qiita-image-store.s3.amazonaws.com/0/19248/194a05f3-20c1-ab00-b4da-d42f02337fb7.png)

## データベースへのログイン
引き続き、システムデータベースにログインします。

```shell
$ hdbsql -i 90 -d SystemDB -u SYSTEM -p HXEHana1
```

すると初期パスワードのHXEHana1を変更しろと指示されるので、適切なパスワードを設定しておきます(前述のインストールプロセスでパスワードにHXEHana1を設定しておかないと、設定したパスワードを使ってもここでログインがうまくいかない)。

例えば、こんなSQL文で動作を確認できます。

```sql
SELECT DATABASE_NAME, ACTIVE_STATUS, RESTART_MODE FROM M_DATABASES ORDER BY 1;
```

![Screenshot from 2018-08-15 03-08-29.png](https://qiita-image-store.s3.amazonaws.com/0/19248/f3a67a53-090e-5655-1af8-4cdf89650e09.png)

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

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

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

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

次に、ユーザー`XSA_ADMIN`でHANA XSAにログインします。パスワードには今変更したパスワードを入力します。

```shell
$ xs login -u XSA_ADMIN -s SAP
```

すると、次のような画面が表示されます。
![Screenshot from 2018-08-15 03-23-32.png](https://qiita-image-store.s3.amazonaws.com/0/19248/7144eb49-b8fa-ebd2-cdbb-07eff104c2fb.png)

(ここまでの前段となる話がSETUP INSTRUCTIONSでは見事に省略されてしまっているのですが)ここで`xs apps`を実行すると、XSAアプリケーションのリストが表示されます。WebIDEが起動しているかどうかを確認するには、`xs apps | grep webide`を実行すれば、`https://hxehost:53075`で起動していることがわかります。

Ubuntu上でウェブブラウザを起動して、上記URLを入力します。`hxehost`にhttpsで接続するのですが、自己署名による証明書を使用しているために警告画面が表示されます。`hxehost`を例外に追加します。追加後、ポート39032に関しても同様の警告が表示されるので、例外に追加しておきます。

![Screenshot from 2018-08-15 03-31-45.png](https://qiita-image-store.s3.amazonaws.com/0/19248/ab6850f1-b93f-d7e4-bfb5-50118ae8fd8e.png)

すると、SAP HANA XS Advancedのログイン画面が表示されるので、ユーザ名 `XSA_DEV` パスワード `HXEHana1` でログインします。

![Screenshot from 2018-08-15 03-36-29.png](https://qiita-image-store.s3.amazonaws.com/0/19248/7399fa1a-ec88-5ae1-2ad3-511b794f6897.png)

すると、こちらも`XSA_DEV`ユーザの初期パスワードを変更するように指示されるので、パスワードを適切に変更するようにします。

ただし、ログイン後の画面は(自己署名証明書を使っているため)こんな感じになってしまうので、

![Screenshot from 2018-08-15 03-40-46.png](https://qiita-image-store.s3.amazonaws.com/0/19248/6e80930b-4ea7-6a8d-da1e-323706915d80.png)

別途、`https://hxehost:51028`、および`https://hxehost:51012`を例外に加えておくようにします。

再度、`https://hxehost:53075`を読み込みなおすと、次のような画面がめでたく表示されます(Firefoxだとこのように、ホスト名＋ポート番号の組み合わせで例外登録していかないといけないので面倒くさいですが、Chromeであればホスト名に対して例外登録するだけなので手間は減ります)。

![Screenshot from 2018-08-15 03-45-39.png](https://qiita-image-store.s3.amazonaws.com/0/19248/b6bca02e-736e-5ccf-cffb-2a1f25cfc1a0.png)

## WebIDEからHANAデータベースに接続
起動したWebIDEからTools→Database Explorerを選択します。すると、まだデータベースへの接続設定を行っていないので、接続設定を追加するか確認するダイアログボックスが表示されるので(Do you want to add one now?)、Yesと答えておきます。

すると、Add Database画面が表示されるので、一番上のDatabase TypeをSAP HANA Database (Multitenant)に指定し、他の項目も合わせて指定していきます。

![2018-08-18 (1).png](https://qiita-image-store.s3.amazonaws.com/0/19248/e45ee224-e82d-2292-f0e8-07659b3e1860.png)

[OK]ボタンを押すと、こんな感じでHANAデータベースに接続ができます。

![2018-08-18 (2).png](https://qiita-image-store.s3.amazonaws.com/0/19248/0bda10b4-a3c6-8ba9-4045-da7b59d1fae3.png)

前述のデータベースへのログインの項では、`hdbsql`コマンドを使ってデータベースに接続し、SQL文で取得していた内容を、WebIDEのGUI画面上でも同様に参照することが可能です。

#まとめ
## HANA express edition Dockerコンテナ起動(Ubuntuから)

```shell
$ sudo docker start -a hanaexpressxsa
```

## シェル起動(Ubuntuから)
```shell
$ sudo docker exec -ti hanaexpressxsa /bin/bash
```

## WebIDE起動(Ubuntu/Windowsのウェブブラウザから。Chrome推奨。)
https://hxehost:53075

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

```shell
$ HDB stop
```

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

```shell
$ sudo docker stop hanaexpressxsa
```

# 終わりに
ここまでのDockerベースでのSAP HANA express editionのインストールはいかがでしたでしょうか？　微に入り細に入り持って回った説明で「面倒くさい」ような印象を持たれたかもしれませんが、実際に手を動かしてみると、自分のお気に入りのLinux環境で簡単にHANAが使い始められる優れモノであることがわかるかと思います。
ぜひインメモリの速さであったり、Spatialな位置情報やGraphエンジン、自然言語によるテキストのハンドリング等、ご自身の興味に合わせて、HANAのパワーを実感していただけるかと思います。
私自身もそういったHANAの実利用イメージをQiita上でご紹介していければと思います。それでは！