watsonx.data: Spark lab を使ってVSCodeからSparkアプリを実行する[2025年5月更新]

> 2025年5月1日: 結構GUI等変わっていたので全面的に更新しました！

Spark labは、watsonx.dataと連携したSparkエンジン上で動作するSparkクラスタ上でSparkアプリケーションをVisual Studio Code(以下VSCode)を使ってインタラクティブにプログラム、デバッグ、サブミット、テストできるSparkベースの開発環境です。

VSCodeの拡張機能として提供されており、ローカルシステムにインストールすることで、VSCodeを使用してSpark IDEにアクセスできます。

[IBM Analytics Engine Sparkからwatsonx.data を操作: 「3. Sparkによる処理」](https://qiita.com/nishikyon/items/732a9c1e56de7560356c) を書いたときはデバッグが難しすぎて困りましたが、Spark labを使えばVSCodeでお手軽に動作確認できます。

[Spark labs - Development environment](https://cloud.ibm.com/docs/watsonxdata?topic=watsonxdata-lab_nsp)にドキュメントがあります~~が、試行錯誤が必要でした~~。
> 2025年5月1日頃確認したら、GUIが改善されていて、試行錯誤なしでいけそうでした!

当記事は試行錯誤なしで使えるように、**SaaS版** watsonx.dataのNative Sparkを使用したVSCodeの設定方法と使い方について説明します。

# 1. 前提
- Native sparkエンジンが追加済み かつ MetadataAdminロールの付与済み
    - 追加していない場合は「[watsonx.data: Sparkエンジンの追加](https://qiita.com/nishikyon/items/0cb71bbc8d89b647ea54)」の方法で追加してください
      - 「5. IAMでMetadataAdminロールの付与 」は必須ですので必ず設定してください
      <p>

- APIKEY取得済み
    - 取得していない場合は以下のどちらかの方法で取得してください

        - [IBM Cloud APIKEYの作成(取得)方法](https://qiita.com/nishikyon/items/fa8b951267efbe911fe7)
        - [IBM Cloudのwatsonx.dataにアクセス可能なAPIKEYをサービスIDから作成](https://qiita.com/nishikyon/items/e42913a63d5f4c5380a8)]
<p>

- [MetadataAdmin ロールの付与](https://qiita.com/nishikyon/items/0cb71bbc8d89b647ea54#6-iam%E3%81%A7metastoreaccess%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E4%BB%98%E4%B8%8E)をお願いします


- VSCode導入済み

# 2.  watsonx.data extensionとRemote SSHのVSCodeへの導入
 watsonx.data extensionをVSCodeに導入します。
### 2.1: 左側のアクティビティバーから「拡張機能」のアイコンをクリックし、表示された検索窓に`watsonx.data`と入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/7a08e452-bdef-8445-1ca5-c486a4557844.png)

### 2.2: 表示された「IBM watsonx.data」をクリックし、「インストール」をクリックします
watsonx.data extensionが導入されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/ae529ae3-22e6-1c28-dec1-7d5239a93ef8.png)

導入が完了すると　左側のアクティビティバーにwatsonx.dataのアイコンが表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/4f9e1579-9daf-13ac-7c2d-8b52b4e11b89.png)

### 2.3: Remote - SSH Extension　をVSCodeへ導入します
「Remote - SSH Extension is required for this extension to work.」と書いてありますので、この拡張機能も導入します。

検索窓に`Remote - SSH`と入力し、表示された「Remote - SSH」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/0c9abd82-ad5b-54d7-45d6-859ac641199b.png)

「インストール」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/f0d5d94a-04fe-185c-816e-0f54c77b73bd.png)

これで`Remote - SSH`は導入完了です。


# 3.　SSH公開鍵・秘密鍵の作成
既に使用可能なSSH公開鍵・秘密鍵を自分のPC(Mac?)上に作成済みであればそれが使用可能ですので、ここはskipして先に進んでください。

Macでしかやってないので、Macでの方法を記載します。
Windowsの場合も「ssh公開鍵作成 windows」　でググれば方法は出てきますので、その方法でやってみてください。あるいは英語であれば「IBM watsonx.data」拡張機能の説明に書いてあります。

参考：　「IBM watsonx.data」拡張機能の説明の出し方
左側のアクティビティバーから「拡張機能」のアイコンをクリック　→ インストール済みに表示された「IBM watsonx.data」をクリック　→ 「拡張機能　IBM watsonx.data」タブが表示される(スクロールすると`Set up SSH on your machine`という記載あり)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/3d3e0f76-c4a1-c953-bf9c-4f494be27665.png)

#### Macのターミナルを開いて、以下のコマンドを入力
```shell
ssh-keygen -t rsa -N ""
```
File名を聞かれますが、デフォルトでよければそのままEnterキーを押下してください
```
Enter file in which to save the key (/Users/<自分のid>/.ssh/id_rsa):
```
コマンドが完了すると、ファイル名をデフォルトにした場合は以下の2つのファイルができます。
- 秘密鍵: `~/.ssh/id_rsa`
- 公開鍵: `~/.ssh/id_rsa.pub`

この2つのファイルパスはオプションで後の設定に入力します。

# 4.　watsonx.data extensionを設定

### 4.1: 　Manage Connectionを設定
左側のアクティビティバーのwatsonx.dataのアイコンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/7143cfb8-558d-f7d4-9d9f-dc3410ab8704.png)

最初は以下のようなメッセージが表示されます。
「Manage Connection」(または日本語で「接続の管理」)をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/6dbca736-ea34-429f-a0fd-0bfb8195064a.png)

以下のような画面が表示されるので、APIキーと接続JSON(取得方法はこのイメージの次に記載)を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/6360f879-1786-4ed4-b7b6-e478a3f6fe8c.png)


接続JSONの取得方法:
watsonx.dataの「インフラストラクチャー・マネージャー」の画面で、使用するSparkエンジンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/95267aff-dcb6-4372-a4e9-aaae70e3aae4.png)

VS コードの接続設定の「ビュー構成」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/94e5cc2f-6ed0-43f0-bdc5-8ed5e92e1202.png)

表示されたJSONが接続JSONなので、コピーして接続JSONの値に入れます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/d033ebab-e3f5-4d2b-bc2c-9e9c26bdb05a.png)

Service IDで接続する場合は、"user_name"の値をIAMの画面で取得できるService IDのID(GUID）に置き換えてください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/94ee2f9b-9569-4a51-99d2-68a73a63e00e.png)

APIキーと接続JSONを入力したら、[+ テスト＆セーブ]をクリックしてください。
エラーが出なければOKです。

SSH系のエラーが出る場合は次の「4.2 IBM:watsonx.ⅾataの設定(オプション)」で3で作成したSSH公開鍵・秘密鍵ファイルの情報を入れてみてください。

### 4.2 IBM:watsonx.ⅾataの設定(オプション)
この設定はオプションです：
で作成したSSH公開鍵・秘密鍵ファイルの情報を設定します。

歯車アイコンをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/9d2f0fca-c4f1-2075-b32e-433d0eec2acf.png)

「設定」タブが開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/22a79e2d-0607-4135-94d6-67ff2a38d516.png)


SSH公開鍵・秘密鍵を入力します。

##### Watsonx-data: Private Key Path
3で作成した秘密鍵のファイルのPATHを入れます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/89e4c7be-890a-46eb-8799-4feb63646494.png)


#### Watsonx-data: Public Key Path
3で作成した公開鍵のファイルのPATHを入れます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/21852f17-342e-46fe-b712-46d3042b8790.png)



# 5. Spark labの作成


#### 1: **+** アイコン クリック
`Spark - Spark running` のあたりにマウスをあてると、**+** アイコンが表示されますので、それをクリックします。　作成Spark Labというタブが開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/458079a7-0ee1-ffb9-f70e-d195296535a2.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/d20f0600-b057-4f9c-a003-d6cf4c6983ce.png)


 必須で値を入れるのは`名前`のみです。
 あとはお好みで設定してください。


#### 2:　「+作成」　ボタンをクリック
右下の　「+作成」　ボタンをクリックします。

右下に｀Creating spark cluster...｀というメッセージが表示されるのでしばし待ちます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/d6ef06d5-a454-85b1-a72c-2f8419afe523.png)

完了すると`Spark - Spark running` の下に作成されたSpark Labが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/1e21f633-dd12-4712-b758-caf808c737cf.png)


# 6. 作成したSpark Labを起動

作成したSpark Labをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/684fe83a-21ec-4ee0-adea-25d540b620c6.png)

新規にウィンドウが開いてSpark Lab（=watsonx.data上のSpark）に接続に行くのでしばし待ちます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/7a93f962-6069-5295-28f2-db973868324c.png)

左下のメッセージが`リモートを開いています`から`SSH 127.0.0.1:xxxx`（xxxxは数字）となったら接続完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/6f062b12-d445-43ca-a5b1-0bb48c43acc5.png)


# 7. Spark Labに拡張機能をインストール
ここからはわかりやすくするためと動作確認用に、あらかじめ準備してある`spark_test.ipynb`というjupyter notebookのファイルと`spark_test.py`というpythonのファイルを使用します。
以下からダウンロードしておいてください:
- `spark_test.ipynb`:　https://github.com/kyokonishito/watsonx_spark/blob/main/spark_test.ipynb
- `spark_test.py`:　https://github.com/kyokonishito/watsonx_spark/blob/main/spark_test.py

### 7.1 ダウンロードした`spark_test.ipynb`をSpark Labの左側のエクスプローラーにドラッグアンドドロップでアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/9267d964-9287-7f5d-d084-9a3cfec01930.png)

### 7.2 アップロードした`spark_test.ipynb`をダブルクリックして開き、'Python' 拡張機能 をインストール
`spark_test.ipynb`を開くと`Python 言語 用のおすすめ拡張機能 'Python' 拡張機能 提供元: Microsoft をインストールしますか?`というメッセージが右下に表示されますで、「インストール」をクリックしてインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/8d41475f-c8a6-33e9-27e6-09ab20823667.png)

左側の拡張機能のエクスプローラー部分に「i」マークが表示されるまで待ちます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/88f98c4f-4150-4b22-9c5a-12d2d90c8577.png)


### 7.3 `spark_test.ipynb` タブをクリックして`spark_test.ipynb`を再度表示し、　右上の「カーネルの選択」をクリックし、拡張機能を導入
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/c7b08c4c-47f9-93f2-b7b2-705b5c329601.png)

しばし待つと`拡張機能の候補をインストールまたは有効にする Python + Jupyter`というドロップダウンが、上部の「カーネルの選択」の下に表示されますので、そこをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/4d510160-a236-8368-8965-bb7ffe56338c.png)

しばし待つと「base」がセットされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/25f47adf-82ed-ba26-b0ef-55d184f243c4.png)


もしセットされない場合は、Python環境をクリックして、baseとついてるものを選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/4625a9d9-efe1-c4cc-2355-a0e13fb8a56a.png)

これでJupyter Notebookが実行できるようになりました！

# 8. Jupyter Notebookを実行
試しに`spark_test.ipynb` を実行してみます。
「全てを実行」をクリックして実行してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/504846a5-50cc-098e-b22e-1cd8a8b3281e.png)
2番目のセルでは、スキーマ一覧を表示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/f56c2062-5d9a-2f75-4067-6571305a69ea.png)

あとは新規に`.ipynb`の拡張子でファイル作成するか、同じようにnotebookのファイルをドラッグアンドドロップでアップロードして自分のコードを実行してみてください。

# 9. Python fileを実行
### 9.1 ダウンロードした`spark_test.py`をSpark Labの左側のエクスプローラーにドラッグアンドドロップでアップロードします

### 9.2 アップロードした`spark_test.py`をダブルクリックして開きます

### 9.3 右上の実行アイコンをクリックして実行します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/34684034-1839-66d9-1eb0-29b3ca3be1ee.png)

これもスキーマ一覧を表示するコードです。結果はターミナルに表示されます。
いろいろWARNINGは出ますが、最終的にnotebookを実行した時と同じスキーマ一覧が表示されていると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/da7c2ed6-d805-5fc3-fee3-89d5fd938e43.png)

あとは新規に`.py`の拡張子でファイル作成するか、同じようにpythonのファイルをドラッグアンドドロップでアップロードして自分のコードを実行してみてください。

# 10. 作成したファイルのローカルへの保存
環境が消えてしまうとファイルも消えてしまうので、終わる前に必ず残したいファイルはローカルにダウンロードしてください。
エクスプローラー画面から、保存したいファイルを右クリック、「ダウンロード」でダウンロード可能です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/d8ce919c-9f17-97fe-c048-03d5cb7b9a4c.png)

# 11. Spark ラボからの Spark UI へのアクセス
ローカルで「Spark ラボからの Spark UI へのアクセス」 を確認できることが[ドキュメントには記載](https://cloud.ibm.com/docs/watsonxdata?topic=watsonxdata-lab_mon_nsp#lab_nsp-ui)されています。
ドキュメントに従って設定すると、Spark UI へのアクセスが可能です。
ドキュメントに書かれているポート4040はプログラム実行中のみ、データが表示されます。
ポート4040と同様に、ポート8080を「ポートの転送」設定するとSpark history serverの表示も可能です。

サーバー側での確認も可能です:
以下のドキュメントを参照の上、Spark history serverのUIで確認してみてください。
[Accessing the Spark history server](https://cloud.ibm.com/docs/watsonxdata?topic=watsonxdata-wxd_spk_histry)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/9daf6f58-63d6-31cb-fa49-cb8d718310ff.png)

# 12. 接続の切断
必要なファイルをローカルに保存したら、セッションを切断します。尚セッションを切断のみならファイルは通常は消えませんが、うまく復活できなかったことがあったので、念の為のローカル保存をお勧めします(長時間使ってない場合は消えるような気がしてます)。
また、切断前にすべてのファイルは閉じておいてください。

右下の青い「SSH： 127.0.0.1:xxxx」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/0333efc4-7ed6-0e48-5617-23e93350a23c.png)

上部にドロップダウンが表示されますので、「リモート接続を終了する」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/3bb613cb-d7a8-983a-8be1-addb6ac1ed39.png)

接続が切断されるとVSCodeの初期画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/6181739a-96fa-545e-55bc-fd4e9ab07194.png)

# 13. 2回目以降のSpark Labの起動
左側のアクティビティバーのwatsonx.dataのアイコンをクリックすると、Spark Labのメニューが表示されるので、そこから起動して下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/f584f3e0-3ede-635c-fa8a-a2c378a56e6e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/82618921-3eb0-4b7a-9eb3-aeec7798a32a.png)


作成済みのものはクリックすると以前と同じ設定、拡張機能もファイルもそのままで起動します。
が、復活しないこともあったので、何度やってもうまくいかない場合は、削除して作り直してください。

マウスカーソルをあてるとゴミ箱アイコンが表示されるので、クリックすると削除できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/72200ef7-5c38-4b15-9520-fe515cffd121.png)

[5.Spark Labの作成](#5-spark-labの作成)からやり直してください。

# 14. その他
デフォルト Spark 構成はサーバー側のSparkの詳細を表示すると表示可能です。これらの構成は設定済みでコード側で設定不要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/2956ed41-ac2c-e70e-19c7-69cc86a69f42.png)

# 15. 参考情報
pyspark　は以下を参照してください：
https://spark.apache.org/docs/3.3.4/api/python/getting_started/index.html

watsonx.dataでのコードは以下を参考にして下さい:
[Enhancing Spark application submission using Spark access control extension](https://cloud.ibm.com/docs/watsonxdata?topic=watsonxdata-spark-extnsn)

Spark lab公式ドキュメントはこちら:
[Spark labs - Development environment](https://cloud.ibm.com/docs/watsonxdata?topic=watsonxdata-lab_nsp)

以上です。