Snowpark Pythonを使ったクライアントアプリケーション用のローカル開発環境の準備をしてみた

Snowpark Pythonを使うクライアントアプリケーションのためのローカル開発環境を用意してみました。Python環境準備に加え、Snowflakeのユーザーの準備などいくつかポイントがあったのでご紹介します。
2023.07.28

データアナリティクス事業本部 機械学習チームの鈴木です。

Snowpark Pythonを使うクライアントアプリケーション開発用に、ローカル環境で開発環境を用意したので、試した内容をご紹介します。

この記事の内容

以下のガイドを参考に、Snowpark Pythonのクライアントアプリケーションを開発するため、ローカル環境で開発環境を用意してみました。

標準的な内容を紹介されていますが、PythonバージョンやインストールするPythonライブラリも確認できたため、クライアントアプリケーションを実行するためのコンテナを準備するような際にも参考になると思います。また、クライアントアプリケーションから利用するSnowflakeのユーザーの準備もしました。

なお、上記ガイドでは、Snowpark Pythonでストアドプロシージャを作成したい場合は、Python worksheetの利用が勧められていました。

前提

以下に記載の通り、事前準備をしました。

実行環境

  • macOS Ventura バージョン13.4.1
  • Python 3.8.17

特に自分のローカル環境ではpyenvを使ってPythonのバージョン指定をできるようにしていたので、以下のようにしてバージョン指定をしました。

pyenv local 3.8.17

python --version
# Python 3.8.17

pip -V
# pip 23.0.1 from ローカルのパス/pip (python 3.8)

検証に使うデータベース

下記の『Getting Started with Snowflake - Zero to Snowflake』の『4. Preparing to Load Data』と『5. Loading Data』の手順で、CITEBIKEデータベースを作成しておきました。

データベース詳細からは以下の情報が確認できており、行数はおおよそ61.5M行です。

CITEBIKEデータベース

この記事はCITEBIKEデータベースに限った内容ではありませんが、後ほどの手順でCITEBIKEデータベースを例にするので、ほかのテーブルを使う場合は適宜読み替えて下さい。

やってみた

1. Python環境のセットアップ

ガイドではAnacondaを使った環境準備方法が紹介されていましたが、この記事ではvirtualenvとpipを使って準備をしました。

まず作業用のディレクトリを作成しました。

mkdir snowpark
cd snowpark

次に仮想環境を作成し、有効化しました。

python3 -m venv snowpark-env

source snowpark-env/bin/activate

次にrequirements.txtを準備しました。今回は以下のようにしました。

requirements.txt

pandas==2.0.3
pyarrow<10.1.0,>=10.0.1
snowflake-snowpark-python==1.5.1
notebook==7.0.0

必要なライブラリをインストールしました。

pip install -r requirements.txt

2. Snowflakeのユーザー作成

SnowsightからSQLワークシートを開き、ACCOUNTADMINで以下のようにSNOWPARK_ROLEを作成しました。

-- ROLEの作成
CREATE ROLE SNOWPARK_ROLE;

-- ウェアハウスへのUSAGEアクセス権の付与
GRANT USAGE ON warehouse 使用するウェアハウス TO ROLE SNOWPARK_ROLE;

-- データベースへのUSAGEアクセス権の付与
GRANT USAGE ON DATABASE CITIBIKE TO ROLE SNOWPARK_ROLE;

-- スキーマへのUSAGEアクセス権の付与
GRANT USAGE ON SCHEMA CITIBIKE.PUBLIC TO ROLE SNOWPARK_ROLE;

-- テーブルへのSELECT権限の付与
GRANT SELECT ON ALL TABLES IN SCHEMA PUBLIC TO ROLE SNOWPARK_ROLE;

-- ユーザーの作成
CREATE USER SNOWPARK_OPERATOR
    PASSWORD = 'パスワード'
    DEFAULT_ROLE = 'SNOWPARK_ROLE'
    MUST_CHANGE_PASSWORD = FALSE;

-- ユーザーへのロールの付与
GRANT ROLE SNOWPARK_ROLE TO USER SNOWPARK_OPERATOR;

ロールが期待通りできているかは、作業をしたユーザーからそのロールに切り替えて、SQLを実行してみて確認すると分かりやすかったです。

3. Jupyter Notebook環境からSnowflakeへのアクセス確認

jupyter notebook

ブラウザでJupyter Notebookが起動するので、Python 3(ipykernel)を選択しました。

カーネルの選択

以下のように処理を実行しました。

from snowflake.snowpark import Session

# セッションの作成
connection_parameters = {
   "account": "アカウント識別子",
   "user": "SNOWPARK_OPERATOR",
   "password": "設定したパスワード",
    "warehouse": "使用するウェアハウス"
}

new_session = Session.builder.configs(connection_parameters).create()

# ロールの切り替え
new_session.sql("USE ROLE SNOWPARK_ROLE").collect()
## [Row(status='Statement executed successfully.')]

# SQLの実行
new_session.sql("SELECT COUNT(*) FROM CITIBIKE.PUBLIC.TRIPS").collect()
## [Row(COUNT(*)=61468359)]

アカウント識別子は『アカウント識別子』のガイドの形式1のものを使いました。orgname-account_nameという形式になります。

orgnameおよびaccount_nameは、『組織の使用を始めるにあたり』のガイドの『組織およびそのアカウントの名前の表示』の部分に記載がありました。Snowsightから管理者 > アカウントと開くと確認できました。

Snowsightからクエリ履歴を確認すると、確かにSNOWPARK_OPERATORユーザーでクエリが実行できていました。

クエリ履歴

作業が終わったらセッションはクローズしましょう。

# セッションのクローズ
new_session.close()

セッションのデフォルトのアイドルタイムアウトは4時間のようでした。

最後に

Snowpark Pythonを使うクライアントアプリケーション開発用に、ローカル環境で開発環境を用意しました。

Python環境の準備に加えて、ユーザーの作成と設定やアカウント識別子の確認などいくつか追加で必要なポイントがありましたので、ガイドに加えて作業した内容をまとめました。

参考になりましたら幸いです。