Snowpark Pythonを使ったクライアントアプリケーション用のローカル開発環境の準備をしてみた
データアナリティクス事業本部 機械学習チームの鈴木です。
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
データベースを例にするので、ほかのテーブルを使う場合は適宜読み替えて下さい。
やってみた
1. Python環境のセットアップ
ガイドではAnacondaを使った環境準備方法が紹介されていましたが、この記事ではvirtualenvとpipを使って準備をしました。
まず作業用のディレクトリを作成しました。
mkdir snowpark cd snowpark
次に仮想環境を作成し、有効化しました。
python3 -m venv snowpark-env source snowpark-env/bin/activate
次に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環境の準備に加えて、ユーザーの作成と設定やアカウント識別子の確認などいくつか追加で必要なポイントがありましたので、ガイドに加えて作業した内容をまとめました。
参考になりましたら幸いです。