AWS Glue for Ray の一般提供が開始されました

昨年のre:Invent 2022で発表されました、AWS Glue for Rayの一般提供が開始されました。
2023.06.12

データアナリティクス事業本部の笠原です。

昨年のre:Invent 2022で発表されました、AWS Glue for Rayの一般提供が開始されました。

re:Invent 2022での記事は以下になります。

また、以下の記事も参考になります。

使い方

Glue Studio上で使うのが、一番簡単です。

「Ray script editor」を選択し、「Create」ボタンをクリックすると、スクリプトエディタが開きますので、適宜コードを記載・ジョブ設定をすることで、ジョブを実行することができます。

ちなみに、Jupyter NotebookからもRayのインタラクティブセッションとしても利用可能ですが、こちらは現時点ではまだプレビューになっています。

サンプルコードを動かしてみる

以下のページにあるサンプルコードを動かしてみます。 Amazonレビューのデータセットを使用します。

1. S3バケットの作成

まずは、出力先となるS3バケットを用意します。

2. IAMロールの作成

次に、今回のRayジョブの実行に必要なIAMロールを作成します。

まずは、IAMロール作成の画面から、Glueを選択し、マネージドポリシー AWSGlueServiceRole 及び AmazonS3FullAccess を追加します。 ロール名は適当な値で作成します。

今回S3はマネージドポリシー AmazonS3FullAccess で権限設定しましたが、 入力データのあるAmazonレビューのバケットの読み取りと、結果出力先となる先ほど作成したバケットへの書き込みの権限を設定すれば問題ないと思います。

3. Rayジョブの作成と実行

Glueの「ETL jobs」から、「Ray script editor」を選択し、「Create」ボタンをクリックします。

「Script」タブが表示されるので、以下のコードを記述します。 最後の行に、作成したS3バケット名を書き直してください。

import ray
import pandas
from ray import data

ray.init('auto')

ds = ray.data.read_parquet("s3://amazon-reviews-pds/parquet/product_category=Wireless/")

# Add the given new column to the dataset and show the sample record after adding a new column
ds = ds.add_column( "helpful_votes_ratio", lambda df: df["helpful_votes"] / df["total_votes"])

# Dropping few columns from the underlying Dataset 
ds = ds.drop_columns(["review_body", "vine", "product_parent", "verified_purchase", "review_headline"])

ds.write_parquet("s3://<作成したS3バケット名>/ray/tutorial/output/")

「Job details」タブにて、NameとIAMロールを設定してください。 IAMロールは先ほど作成したIAMロールを選択してください。

「Save」をクリックして設定を保存した後、「Run」をクリックするとRayジョブが実行されます。 「Runs」タブに実行ジョブ一覧がありますので、Run statusが Succeeded になるまで待ちましょう。

Succeeded になりましたら、出力先のバケット内にファイルが生成されています。

プレビュー時点との違い

Rayのバージョンが、2.0から2.4に上がっています。 また、デフォルトで利用できるパッケージが異なっており、プレビュー時点では利用できたAWS SDK for Pandas (awswrangler) や Modin が外れています。 必要な方は、ジョブパラメータにて --pip-install キーを利用してパッケージインストールするか、カスタムパッケージとしてzipファイルをS3バケットに配置してデプロイしてください。

パッケージ一覧は以下のページに記載があります。

日本語ページはまだプレビューの内容でしたので、パッケージの比較が出来ました。

表にまとめると、以下のようになります。 プレビューからデフォルトのパッケージ数が少なくなりました。

Preview GA
awswrangler[modin,ray]==3.0.0rc2
ray == 2.0.0
pyarrow == 6.0.1
pandas == 1.5.0
modin == 0.16.1
dask == 2022.7.1
pymars == 0.9.0
numpy == 1.23.4
boto3 == 1.26.133
ray == 2.4.0
pyarrow == 11.0.0
pandas == 1.5.3
numpy == 1.24.3
fsspec == 2023.4.0

VPCへの接続

一般公開時点でもVPCへの接続は利用できません。パブリックルートでしかアクセスできないため、RDSやRedshiftへのプライベートアクセスができません。 今後のアップデートに期待しましょう。

利用可能リージョン

現時点で利用可能なリージョンは以下の5つです。 東京リージョンでも利用可能になっています。

  • US East (Ohio)
  • US East (N. Virginia)
  • US West (Oregon)
  • Asia Pacific (Tokyo)
  • Europe (Ireland)

料金

既存のSpark ETL/Python Shell同様に、DPU単位での課金となります。 東京リージョンでは、DPU(M-DPU)時間あたり $0.44 になります。秒単位で課金され、最小単位は1分です。

Rayでは、Graviton2ベースのEC2ワーカータイプでジョブが実行されます。 現在利用可能なワーカータイプは Z.2X です。 Z.2X ワーカータイプは、 2 M-DPU (8 vCPU と 64 GB メモリ) と 128 GB のディスクスペースを持ちます。 通常よりメモリ割り当ての多いM-DPUとなりますが、DPU単位での料金は既存のSpark ETL/Python Shellと変わりません。

  • Spark ETL/Python Shell:
    • 1DPU: 4vCPU・16GBメモリ
  • Ray:
    • 1M-DPU: 4vCPU・32GBメモリ

なお、最小2個のM-DPUが必要で、デフォルトでは各Rayジョブに6個のM-DPUが割り当てられています。

まとめ

Glue for RayがGAしました。 Spark ETLほどの学習コストをあまりかけずにPythonで分散処理をしたいケースで威力を発揮してくれるでしょう。 今後のアップデートにも期待しましょう。