はじめに
こんにちは、エクスチュアの石原です。
今回は10月18日にSnowflakeよりGAが発表されたSnowflake Open Catalogのチュートリアルを実施してみました。チュートリアルではAWS環境をベースに構築していましたので、本記事ではGCP環境上にSnowflake Open Catalogを構築してみました。
構築で手間取った部分などご紹介できればと思います。
GCS上でのデータレイクハウス導入手順
Getting started with Snowflake Open Catalog
AWS版のチュートリアルと同様に進んで変更した点をご紹介します。
自分の環境ではminiconda3をインストールしました。また、下記の内容はスキップしています
- Create an IAM policy that grants access to your S3 location
- Create an IAM role
Create an internal catalog in Open Catalog
Storage providerをGCSに変更、Default base locationにGCS上のバケットを入力します。
例:gs://sample_bucket/snowflake_open_catalog(snowflake_open_catalogフォルダ内にデータが格納されます)
Create a trust relationship
GCSの場合はGCP_SERVICE_ACCOUNT情報を保存します。
保存したサービスアカウントへ該当するGCSへの書き込みと読み込みを含むアクセス権限を付与します。
Configure Spark
os.environ['SPARK_HOME'] = '/Users/xxxxx/miniconda3/envs/iceberg-lab/Lib/site-packages/pyspark' # condaでインストールしたpyspark環境の場所を指定してください
自分の環境ではJAVA_HOME
、HADOOP_HOME
も環境変数として必要になったので保存しています。以下でパスが確認できるか試してみてください。必要であれば別途インストールしてください。
print(os.environ['JAVA_HOME']) # /Users/xxxxx/java
print(os.environ['HADOOP_HOME']) # /Users/xxxxx/hadoop/hadoop-3.0.0
spark.jars.packagesをGCPのパッケージに変更し、<open_catalog_account_identifier>
、<client_id>:<client_secret>
、<catalog_name>
、<principal_role_name>
の値をそれぞれ変更します。
はログインした際のURLの英数字を設定します。<open_catalog_account_identifier>
<client_id>:<client_secret>
はCreate a new connection for Apache Spark™セクションで確認したシークレットに入力してください。
<catalog_name>
はCreate an internal catalog in Open Catalogセクションで作成したカタログ名を入力します。
<principal_role_name>
にはSet up catalog privileges for connectionセクションで作成したロール名を入力します。
注意点
10/30現在ではdefaultCatalog
の設定を旧名称のpolarisに設定しなければいけなかったので注意
spark = SparkSession.builder.appName('iceberg_lab') \
.config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,org.apache.iceberg:iceberg-gcp-bundle:1.5.2') \
.config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
.config('spark.sql.defaultCatalog', 'polaris') \
.config('spark.sql.catalog.polaris', 'org.apache.iceberg.spark.SparkCatalog') \
.config('spark.sql.catalog.polaris.type', 'rest') \
.config('spark.sql.catalog.polaris.header.X-Iceberg-Access-Delegation','vended-credentials') \
.config('spark.sql.catalog.polaris.uri','https://<open_catalog_account_identifier>.snowflakecomputing.com/polaris/api/catalog') \
.config('spark.sql.catalog.polaris.credential','<client_id>:<client_secret>') \
.config('spark.sql.catalog.polaris.warehouse','<catalog_name>') \
.config('spark.sql.catalog.polaris.scope','PRINCIPAL_ROLE:<principal_role_name>') \
.getOrCreate()
その後のチュートリアルは変更なしでも行けるはずです。
ただし、Snowflakeが動作している環境がGCPではない場合、同期テーブルの設定時にThe external volume and warehouse must be in the same location for tables using the Snowflake catalog.
エラーが発生してしまうので注意してください。その場合、同期の設定に関してはホストしているクラウドと同一リージョンのストレージを利用してください。
今回の記事は以上となります。同じポイントで困っていた人の助けになれば幸いです。
エクスチュアはマーケティングテクノロジーを実践的に利用することで企業のマーケティング活動を支援しています。
ツールの活用にお困りの方はお気軽にお問い合わせください。