watsonx.data 2.0.0 で Local Staging Directory を構成してみた

# はじめに
Local staging directory は、watsonx.data の Presto (Java) を使用して 大量データの CREATE TABLE AS SELECT (CTAS) (SELECTステートメントの結果に基づいて新しいテーブルを作成する) を実行した時に、Presto のワーカー・ポッドの一時ディスク領域の不足が原因でポッドが再起動する事象を防ぐために使用します。
CTASを実行した時の中間結果は デフォルトでは Presto のワーカー・ポッドの /tmp に置かれます。(Presto が Javaでコーディングされ、JVMの一時ファイル領域の設定である java.io.tmpdir のデフォルトが /tmp であるため)  
CTASのデータが大量の場合、ワーカー・ポッドのディスクがフルになりワーカー・ポッドが再起動してしまう場合があるため、適切な Local staging directory を構成する必要があります。
本投稿内の Presto は全て Presto (Java) を意味しています。

以下に Local staging directory を構成する手順を記述します。

## Local staging directory の構成手順
参考文献 (watsonx.data 2.0.0 のマニュアル)
[Configuring a Local staging directory](https://ibmdocs-test.dcs.ibm.com/docs/en/SSDZ38_2.0.x_test?topic=administering-configuring-local-staging-directory)

Local staging directory は wxdengine カスタム・リソースに Local staging directoryのプロパティーを追加する事により構成します。以下が Local staging directory を構成するプロパティーとなります。
|プロパティー|意味|
|:---|:---|
|hive_s3_staging_directory_enabled|Local staging directory を Enable にするかどうか|
|s3StagingStorageClass|Local staging directoryを作成する ストレージ・クラス|
|s3StagingStorageSize|Local staging directoryとして使用する ストレージのサイズ|

今回は 新規に作成した Persistent Volume (PV)を Local staging directory のストレージとして使用します。
PVを新規に作成作成する事により、ワーカー・ポッドがマウントしたローカル・ボリュームを Local staging directory として使用する事ができます。

### 1.OCPクラスターにログイン
"oc login" コマンドでOCPクラスターにログインします。
### 2.watsonx.data のプロジェクトに変更
作業中のプロジェクトをwatsonx.data がインストールされているプロジェクトに変更します。今回の環境では watsonx.data は 名前スペース zen にインストールされています。
```
$ export PROJECT_CPD_INST_OPERANDS=zen
$ oc project ${PROJECT_CPD_INST_OPERANDS}
```
### 3.ワーカー・ノードの中に必要なディレクトリーを作成
デバッグセッションで、OpenShiftの全ワーカー・ノードの中に必要なディレクトリーを作成します。
#### ① ワーカーノードの確認
"oc get node"でOCPのノードの一覧を出力して、NAMEとROLESからワーカーノードを判断します。ストレージノードは対象外です。
今回の環境では worker-1～worker-5 がワーカーノードになります。
```
$ oc get node
NAME        STATUS   ROLES                  AGE   VERSION
master-1    Ready    control-plane,master   38d   v1.26.13+8f85140
master-2    Ready    control-plane,master   38d   v1.26.13+8f85140
master-3    Ready    control-plane,master   38d   v1.26.13+8f85140
storage-1   Ready    worker                 38d   v1.26.13+8f85140
storage-2   Ready    worker                 38d   v1.26.13+8f85140
storage-3   Ready    worker                 38d   v1.26.13+8f85140
worker-1    Ready    worker                 38d   v1.26.13+8f85140
worker-2    Ready    worker                 38d   v1.26.13+8f85140
worker-3    Ready    worker                 38d   v1.26.13+8f85140
worker-4    Ready    worker                 38d   v1.26.13+8f85140
worker-5    Ready    worker                 38d   v1.26.13+8f85140
```
#### ② ワーカー・ノードの中に必要なディレクトリーを作成
全てのワーカーノードの中に、"/var/<サブディレクトリー>" ディレクトリーを作成します。このディレクトリーを作成するファイルシステムには Local staging directory を作成するために十分な容量が必要となります。今回の環境では /var の下に十分な容量があるため /var の下にサブディレクトリーを作成します。
<サブディレクトリー> の部分は任意のサブディレクトリー名を指定します。今回は stagingStorage とします。
```
oc debug node/<ワーカーノード名> -- chroot /host mkdir -p /var/stagingStorage
```
コマンドを実行するとWarningが表示される場合がありますが無視します。
ワーカー・ノードに /var/stagingStorage ディレクトリーが作成されている事を確認します。
```
oc debug node/<ワーカーノード名> -- chroot /host ls /var | grep stagingStorage
```
### 4.PVを作成するYAMLファイルを作成
PVを作成するための YAMLファイルを作成します。
・name と storageClassName には任意の名前を指定します。
・path には 3 のステップでワーカーノードに作成したディレクトリーを指定します。
・nodeAffinity の values には、ワーカーノード名を列挙します。

例)
```
$ cat local-staging-pv1.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: staging-storage-pv1
spec:
  capacity:
    storage: 50Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: staging-storage
  local:
    path: /var/stagingStorage
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - worker-1
          - worker-2
          - worker-3
          - worker-4
          - worker-5
```
### 5.PVを作成
Presto のポッドが複数ある場合は、name の値のみが異なるYAMLファイルを Presto のポッドの数 (コーディネーター + ワーカー) だけ作成して、複数のPVを作成します。今回の環境は1個のコーディネーター・ポッドと5個のワーカー・ポッドが存在するため6個のPVを作成します。
```
$ oc apply -f local-staging-pv1.yaml
persistentvolume/staging-storage-pv1 created
.....
$ oc apply -f local-staging-pv6.yaml
persistentvolume/staging-storage-pv6 created
```
### 6.Local staging directory を設定する Presto のエンジンIDを確認
```
$ oc get wxdengine -o custom-columns='DISPLAY NAME:spec.engineDisplayName,ENGINE ID:metadata.labels.engineName'
DISPLAY NAME   ENGINE ID
presto-01      presto-01
```
### 7.Local staging directory を設定する Prestoエンジンのステートフルセットを全て削除
```
$ oc delete statefulset -l engineName=presto-01
statefulset.apps "ibm-lh-lakehouse-presto-01-coordinator-blue" deleted
statefulset.apps "ibm-lh-lakehouse-presto-01-presto-worker" deleted
statefulset.apps "ibm-lh-lakehouse-presto-01-single-blue" deleted
```
### 8.wxdengine カスタム・リソース に patch を適用して Local staging directory を構成
"oc patch" コマンドは statefulset を削除した直後に実行する必要があるため、コピー＆ペーストできるように用意しておく事をお勧めします。

今回は下記のプロパティーの設定で Local staging directory を作成します。
|プロパティー|値|
|:---|:---|
|hive_s3_staging_directory_enabled|true|
|stagingStorageStorageClass|staging-storage|
|stagingStorageStorageSize|50Gi|

"oc patch"コマンドで Local staging directory を設定
```
$ oc patch wxdengine/lakehouse-presto-01 --type=merge -p '{ "spec": { "hive_s3_staging_directory_enabled" : "true", "s3StagingStorageClass": "staging-storage", "s3StagingStorageSize": "50Gi" } }'
wxdengine.watsonxdata.ibm.com/lakehouse-presto-01 patched
```
しばらくすると Presto のステートフルセットとポッドが再起動しますので確認します。
```
$ oc get statefulset | grep presto
ibm-lh-lakehouse-presto-01-coordinator-blue    1/1     8m9s
ibm-lh-lakehouse-presto-01-presto-worker       5/5     8m9s
ibm-lh-lakehouse-presto-01-single-blue         0/0     8m11s

$ oc get pod | grep presto
ibm-lh-lakehouse-presto-01-coordinator-blue-0      1/1     Running     0    8m27s
ibm-lh-lakehouse-presto-01-presto-worker-0         1/1     Running     0    8m27s
ibm-lh-lakehouse-presto-01-presto-worker-1         1/1     Running     0    8m27s
ibm-lh-lakehouse-presto-01-presto-worker-2         1/1     Running     0    8m27s
ibm-lh-lakehouse-presto-01-presto-worker-3         1/1     Running     0    8m27s
ibm-lh-lakehouse-presto-01-presto-worker-4         1/1     Running     0    8m27s
```
### 9.ポッドの中に /mnt/s3Staging ディレクトリーが作成されている事を確認
```
$ oc exec -it ibm-lh-lakehouse-presto-01-presto-worker-0 -- bash
bash-4.4$ ls /mnt
infra  s3Staging
```
/mnt/s3Staging ディレクトリーはコーディネーターのポッドの中にも作成されています。念のため全てのポッドにディレクトリーが作成されている事を確認しましょう。

### 10.Persistent Volume Claim (PVC) を確認
マニュアルには記載がありませんが Local staging directory を作成すると PVC が作成され、4 と 5  のステップで作成したPVと接続 (Bound) されている事が確認できます。
```
$ oc get pvc | grep staging
ibm-lh-s3-staging-directory-mount-ibm-lh-lakehouse-presto-01-coordinator-blue-0   Bound  presto-staging-storage-pv5   50Gi   RWO   staging-storage   9m56s
ibm-lh-s3-staging-directory-mount-ibm-lh-lakehouse-presto-01-presto-worker-0      Bound  presto-staging-storage-pv1   50Gi   RWO   staging-storage   9m56s
ibm-lh-s3-staging-directory-mount-ibm-lh-lakehouse-presto-01-presto-worker-1      Bound  presto-staging-storage-pv3   50Gi   RWO   staging-storage   9m56s
ibm-lh-s3-staging-directory-mount-ibm-lh-lakehouse-presto-01-presto-worker-2      Bound  presto-staging-storage-pv6   50Gi   RWO   staging-storage   9m56s
ibm-lh-s3-staging-directory-mount-ibm-lh-lakehouse-presto-01-presto-worker-3      Bound  presto-staging-storage-pv2   50Gi   RWO   staging-storage   9m56s
ibm-lh-s3-staging-directory-mount-ibm-lh-lakehouse-presto-01-presto-worker-4      Bound  presto-staging-storage-pv4   50Gi   RWO   staging-storage   9m56s

```
1番左の列が作成された PVCの名前、3番目の列がPVの名前です。2番目の列が全て Bound であれば、PVC と PV が接続されていて、作成した PV が Local staging directory として正常に使用可能である事が確認できます。Bound ではなく Available になっている場合は PV が Local staging directory として使用されませんので作成手順に問題が無いかどうかを確認して作り直す必要があります。
## Local staging directory の削除手順
作成した Local staging directory を削除する手順の概要は以下になります。

1. Prestoのステートフルセットの削除
2. "oc patch"コマンドにより wxdengine カスタム・リソースからLocal staging directoryの設定の削除
3. Local staging directory の構成により作成された Persistent Volume Claim (PVC) の削除
4. Local staging directory の構成のために作成した Persistent Volume (PV) の削除

### Prestoのステートフルセットの削除
Local staging directory を構成した Prestoエンジンのステートフルセットを全て削除します。
```
$ oc delete statefulset -l engineName=presto-01
statefulset.apps "ibm-lh-lakehouse-presto-01-coordinator-blue" deleted
statefulset.apps "ibm-lh-lakehouse-presto-01-presto-worker" deleted
statefulset.apps "ibm-lh-lakehouse-presto-01-single-blue" deleted
```
### Local staging directory の削除
下記の "oc patch"コマンドで Local staging directory を削除します。
"oc patch"コマンドはステートフルセットを削除した直後に実行します。
```
oc patch wxdengine/lakehouse-presto-01  --type='json' -p='[{"op": "remove", "path": "/spec/hive_s3_staging_directory_enabled"}, {"op": "remove", "path": "/spec/s3StagingStorageClass"}, {"op": "remove", "path": "/spec/s3StagingStorageSize"}]'
```
### PVC の削除
Local staging directory の構成により作成された PVC を "oc delete pvc <PVC名>" コマンドで全て削除します。
```
$ oc delete pvc ibm-lh-s3-staging-directory-mount-ibm-lh-lakehouse-presto-01-coordinator-blue-0
persistentvolumeclaim "ibm-lh-s3-staging-directory-mount-ibm-lh-lakehouse-presto-01-coordinator-blue-0" deleted
$ oc delete pvc ibm-lh-s3-staging-directory-mount-ibm-lh-lakehouse-presto-01-presto-worker-0
persistentvolumeclaim "ibm-lh-s3-staging-directory-mount-ibm-lh-lakehouse-presto-01-presto-worker-0" deleted
.....
$ oc delete pvc ibm-lh-s3-staging-directory-mount-ibm-lh-lakehouse-presto-01-presto-worker-4
persistentvolumeclaim "ibm-lh-s3-staging-directory-mount-ibm-lh-lakehouse-presto-01-presto-worker-4" deleted
```
### PVを削除
Local staging directory を構成する際に作成したPVを"oc delete pv <PV名>" コマンドで全て削除します。
```
$ oc delete pv presto-staging-storage-pv1
persistentvolume "presto-staging-storage-pv1" deleted
.....
$ oc delete pv presto-staging-storage-pv6
persistentvolume "presto-staging-storage-pv6" deleted
```
# おわりに
今回は watsonx.data 2.0.0 の Local staging directory の構成について紹介しました。
watsonx.data 1.1.x でも全く同じ手順で構成する事ができます。