新しい IBM Developer JP サイトへようこそ!サイトのデザインが一新され、旧 developerWorks のコンテンツも統合されました。 詳細はこちら

Db2 for z/OS 内のエンタープライズ・データを対象に Kubeflow を使用する

このチュートリアルはラーニング・パス「Kubeflow 入門」を構成するコンテンツです。

概要

Kubeflow の主要なコンポーネントである Kubeflow パイプラインは、Kubernetes 上の (Docker コンテナーをベースとした) マルチステップ・ワークフローを構築、デプロイ、管理するためのプラットフォームを提供します。Db2® for z/OS® は、セキュリティー、可用性、スケーラビリティー、信頼性を備えた、エンタープライズ・クラスのデータベース管理システムです。このチュートリアルでは、Kubeflow パイプラインを使用してデータベース・サービスを作成、呼び出し、破棄する方法を説明します。学習する内容は以下のとおりです。

  • コンテナーを起動してデータベース REST サービスを作成、呼び出し、破棄する Kubeflow パイプライン・アプリケーションをコンパイルする
  • コンパイル済みパイプラインを Kubeflow Dashboard にアップロードする
  • コンパイル済みパイプラインを Kubeflow Dashboard 内で実行する

シナリオ

このチュートリアルで用いるシナリオでは、通常の SQL 文を使用して SYSIBM.SYSXMLSTRINGS テーブル内の string id から文字列を取得します。SYSIBM.SYSXMLSTRINGS テーブルは、XML ストレージ内で使用する stringstring id のマッピングを格納するカタログ・テーブルです。以下に、SYSIBM.SYSXMLSTRINGS カタログ・テーブルの出力例を示します (表示される値は Db2 for z/OS システムによって異なるはずです)。

SELECT STRINGID, SUBSTR(STRING,1, 35) AS STRING
FROM SYSIBM.SYSXMLSTRINGS
STRINGID    STRING
1001        product
1002        description
1003        name
1004        detail
1005        http://www.w3.org/2000/xmlns/
1006        space
1007        http://posample.org
1008        pid
1009        details
1010        price
1011        weight

これから Kubeflow パイプラインを使用して、Kubernetes 上で Docker コンテナーをベースとする以下のワークフロー・ステップを構築、デプロイ、管理します。

  • SYSIBM.SYSXMLSTRINGS カタログを検索して string id から文字列のマッピングを返す Db2 REST サービスを作成する
  • 新しく作成したサービスを呼び出す
  • 作成したサービスを破棄する

前提条件

このチュートリアルに取り組むには、最小要件として 8 基のコア、16 GB の RAM、250 GB のストレージを搭載した Ubuntu 18 マシンが必要です。また、チュートリアルの手順は root 権限で実行する必要があります。Kubeflow は、クラウド内またはオンプレミス環境内にインストールします。Kubeflow をまだインストールしていない場合は、以下のいずれかのチュートリアルに従ってインストールしてください。

開発環境の構築と、Db2 REST サービスを有効にした Db2 for z/OS バージョン 11 以降のセットアップも必要です。Db2 REST サービスを有効にする方法について詳しくは、「REST サービスに必要なデータベース・オブジェクトの作成」を参照してください。

所要時間

このチュートリアルの所要時間は約 30 分です。

Db2 for z/OS 対応の Kubeflow パイプライン・アプリケーションを作成してコンパイルする

Kubeflow 開発環境がインストールされて構成済みのシステムで、以下の手順に従います。

  1. Db2 for z/OS 対応の Kubeflow パイプライン・アプリケーションを作成してコンパイルします。

     mkdir /root/jane
     touch db2zREST.py
    
  2. 以下のコードをコピーして db2zREST.py ファイル内に貼り付け、ファイルを保存します。

     #!/usr/bin/env python3
    
     import json
     import kfp
     from kfp import dsl
    
     def create_service_op(useridPw, db2ServiceManager, sqlStmt, svsName, description):
         data = {
             "requestType": "createService",
             "sqlStmt": str(sqlStmt) ,
             "serviceName": str(svsName),
             "description": str(description)
         }
         return dsl.ContainerOp(
             name='create REST svs',
             image='tutum/curl:latest',
             command=['sh', '-c'],
             arguments=['curl -u "$0" -X POST -H \'Content-Type: application/json\' -i  "$1" --data "$2" | tee $3',
               str(useridPw), str(db2ServiceManager), json.dumps(data), '/tmp/createResult'],
             file_outputs={
                 'data': '/tmp/createResult'
             }  
         )
    
     def call_service_op(useridPw, actualSvs, query_parm):
         data = {'P1': str(query_parm)}
         return dsl.ContainerOp(
             name='call REST svs',
             image='tutum/curl:latest',
             command=['sh', '-c'],
             arguments=['curl -u "$0" -X POST -H \'Content-Type: application/json\' -i  "$1" --data "$2"',
               str(useridPw), str(actualSvs), json.dumps(data)]
         )
    
     def drop_service_op(useridPw, db2ServiceManager, svsName):
         data = {
             "requestType": "dropService",
             "serviceName": str(svsName)
         }
         return dsl.ContainerOp(
             name='drop REST svs',
             image='tutum/curl:latest',
             command=['sh', '-c'],
             arguments=['curl -u "$0" -X POST -H \'Content-Type: application/json\' -i  "$1" --data "$2"',
               str(useridPw), str(db2ServiceManager), json.dumps(data)]
         )
    
     @dsl.pipeline(
         name='Db2 for z/OS REST pipeline',
         description='A pipeline to create, invoke, and drop a Db2 REST svs'
     )
     def db2zREST_pipeline(db2Host='<hostname>:<port>',
                           userid='<userid>',
                           password='<password>',
                           sqlStmt='SELECT SUBSTR(STRING,1,60) as STRING from SYSIBM.SYSXMLSTRINGS WHERE STRINGID= ?',
                           svsName='selectSYSXMLStrings',
                           description='Select string from XML string id',
                           query_parm='1006'):
         """A pipeline with three sequential steps."""
    
         useridPw =  str(userid) + ':' + str(password)
         db2ServiceManager = 'http://' + str(db2Host) + '/services/DB2ServiceManager'
         actualSvs = 'http://' + str(db2Host) + '/services/SYSIBMSERVICE/' + str(svsName)
    
         create_task = create_service_op(useridPw, db2ServiceManager, sqlStmt, svsName, description)
         call_task = call_service_op(useridPw, actualSvs, query_parm)
         delete_task = drop_service_op(useridPw, db2ServiceManager, svsName)
         call_task.after(create_task)
         delete_task.after(call_task)
    
     if __name__ == '__main__':
         kfp.compiler.Compiler().compile(db2zREST_pipeline, __file__ + '.zip')
    

このパイプライン・アプリケーションでは 3 つのステップを順次実行します。

  • create_task: SQL 文によって Db2 for z/OS REST サービスを作成します。以下に示すのは、アプリケーション内で使用するデフォルトの SQL 文です。

      SELECT SUBSTR(STRING,1,60) as STRING from SYSIBM.SYSXMLSTRINGS WHERE STRINGID= ?
    

    SYSIBM.SYSXMLSTRINGS テーブルは string idstring のマッピングを格納するカタログ・テーブルです。このカタログ・テーブルを機能させるためにユーザー・テーブルを作成する必要はありません。上記の SQL 文を見るとわかるように、作成する REST サービスは string id をパラメーターとして取り、カタログ・テーブルでその string id を検索し、対応する文字列をユーザーに返します。

  • call_task: 作成した REST サービスを呼び出します。実行時に、ユーザーが string id を渡す必要があります。

  • delete_task: 作成した REST サービスを破棄します。

タスクごとに異なるコンテナーを作成して実行します。各コンテナーには Docker Hub 内のデフォルト・イメージが使用され、curl がインストールされます。

このアプリケーションには改善の余地が大いにあります。ここでの目標は基本的な処理を説明することなので、チュートリアルが完了したら、必要に応じてカスタマイズしてください。

以下のコマンドを実行してソースをコンパイルします。

dsl-compile --py /root/jane/db2zREST.py --output /root/jane/db2zREST.tar.gz

コンパイルの出力は /root/jane/db2zREST.tar.gz 内に保管されます。

コンパイル済みパイプラインを Kubeflow Dashboard にアップロードする

Kubeflow 開発環境を構築する」の「コンパイル済みパイプラインを Kubeflow Dashboard にアップロードする」のセクションに従って、db2zREST.tar.gz ファイルをアップロードします。

コンパイル済みパイプラインを Kubeflow Dashboard 内で実行する

ここでは、db2zREST というパイプライン名でコンパイル済みアプリケーションをアップロードしたことを前提とします。以下の手順に従ってアプリケーションを実行します。

  1. 「Pipelines (パイプライン)」ウィンドウ内の GUI で、「db2zREST」(前のステップでアップロードしたパイプライン) をオンにします。

    パイプラインの GUI のスクリーンショット

  2. db2zREST パイプライン内で、このパイプラインのグラフとソースを確認できます。ご覧のように、3 つのコンテナーを表す 3 つの矩形が表示されます。

    db2zREST パイプラインを示す画面のスクリーンショット

    Create experiment (エクスペリメントを作成)」をクリックします。

  3. 「Experiments (エクスペリメント)」ウィンドウ内の GUI で、エクスペリメント名を入力してから「Next (次へ)」をクリックします。

    エクスペリメントの詳細を示す画面のスクリーンショット

  4. 「Run details (実行の詳細)」ウィンドウ内の GUI で、実行名を入力し、「Run Type (実行タイプ)」で「One-off (1 回限り)」を選択します。

    実行の詳細を示す画面のスクリーンショット

  5. Run parameter (実行パラメーター)」で、「db2host」、「userid」、「password」の各パラメーターに値を入力します。「Start (開始)」をクリックします。

    実行パラメーターを示す画面のスクリーンショット

「Experiments (エクスペリメント)」ウィンドウが再表示されます。このウィンドウで、実行のステータスやその他の情報を確認できます。「Db2Run1」をクリックして、この実行に関する詳細を表示します。

エクスペリメント・ウィンドウのスクリーンショット

Graph (グラフ)」タブで、個々のコンテナーをクリックすると、その入力と出力ならびに他の詳細が表示されます。

グラフを表示する画面のスクリーンショット

上の画像に、create-rest-svs タスクのログが示されています。最後の行に示されている StatusCode 201 は、Db2 REST サービスが正常に作成されたことを意味します。右にスクロールして完全なメッセージを確認できます。

サービスを呼び出す際は、string id 1006 に対応する string を要求しています。結果を確認するには、call-rest-svs タスクのログを調べます。Db2 for z/OS 内に保管されている string id 1006 に対応する string はスペースです。お使いの Db2 サブシステムによって、この値は異なるはずです。

call-rest-svs タスクを示す画面のスクリーンショット

Kubernetes Dashboard を調べると、(Kubeflow 名前空間内に) 3 つのコンテナーが正常に作成され、正常に終了されたことを確認できます。

Kubernetes Dashboard のスクリーンショット

まとめ

このチュートリアルでは、Kubeflow を使用して Db2 REST サービスの作成、呼び出し、破棄を行うパイプライン・アプリケーションを作成する方法と、Kubeflow Dashboard を使用してアプリケーションをテストする方法を説明しました。

このチュートリアルはラーニング・パス「Kubeflow 入門」を構成するコンテンツです。引き続きこのラーニング・パスに従うには、シリーズの次のチュートリアル「Kubeflow を利用して IBM Cloud Private 内で機械学習モデルをトレーニングし、利用可能にする」に取り組んでください。