View a markdown version of this page

Amazon Athena を使用して SQL でファイルをクエリする - FSx for ONTAP

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon Athena を使用して SQL でファイルをクエリする

エンタープライズシステムは、NFS または SMB ファイル共有に向かうログエクスポート、トランザクション抽出、インベントリスナップショット、システム間ファイルドロップなどのファイルベースの出力を頻繁に生成します。

Amazon S3 アクセスポイントを FSx for ONTAP ボリュームにアタッチすると、Amazon Athena は所定のファイルにクエリを実行します。アプリケーションとユーザーは、常に NFS または SMB 経由でボリュームに書き込んでおり、アナリストはアクセスポイントを介してそのデータに対して標準 SQL を実行します。FSx for ONTAP ボリュームには NFS、SMB、Amazon S3 API から同時にアクセスできるため、同じファイルを 1 つのプロトコルで生成し、コピーなしで別のプロトコルで使用できます。

このチュートリアルでは、Amazon S3 アクセスポイントを介して FSx for ONTAP ボリュームにサンプルデータセットをアップロードし、 に登録して AWS Glue Data Catalog、Amazon Athena でクエリを実行します。

注記

このチュートリアルの所要時間は約 20~30 分です。 AWS のサービス 使用する には、作成したリソースの料金が発生します。クリーンアップセクションを含むすべてのステップをすぐに完了すると、米国東部 (バージニア北部) の予想コストは 1 USD 未満になります AWS リージョン。この見積もりには、FSx for ONTAP ボリューム自体の継続的な料金は含まれません。

前提条件

作業を開始する前に、次の項目があることを確認します。

  • Amazon S3 アクセスポイントがアタッチされた FSx for ONTAP ボリューム。 Amazon S3 アクセスポイントにはインターネットネットワークオリジンが必要です。アクセスポイントの作成手順については、「」を参照してくださいアクセスポイントの作成

  • クエリ結果の場所で設定された Athena ワークグループ。Athena はクエリ結果を FSx for ONTAP ボリュームではなく Amazon S3 バケットに書き込みます。ワークグループがない場合は、primaryワークグループを使用して、Athena コンソールの設定で結果の場所を設定できます。詳細については、Amazon Athena ユーザーガイド」の「ワークグループの管理」を参照してください。

  • AWSGlueServiceRole マネージドポリシーがアタッチ AWS Glue された の IAM ロールと、Amazon S3 アクセスポイントへのアクセスを許可するインラインポリシー。持っていない場合は、次の手順を実行します。

    1. 次の信頼ポリシーを として保存しますglue-trust-policy.json。これにより、 AWS Glue はロールを引き受けることができます。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": {"Service": "glue.amazonaws.com"}, "Action": "sts:AssumeRole" } ] }
    2. 次のアクセス許可ポリシーを として保存しますglue-s3-policy.json。アクセスポイントへのアクセスを許可します。regionaccount-id、 を自分の値access-point-nameに置き換えます。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:region:account-id:accesspoint/access-point-name", "arn:aws:s3:region:account-id:accesspoint/access-point-name/object/*" ] } ] }
    3. ロールを作成し、ポリシーをアタッチします。

      $ aws iam create-role \ --role-name fsxn-tutorial-glue-role \ --assume-role-policy-document file://glue-trust-policy.json aws iam attach-role-policy \ --role-name fsxn-tutorial-glue-role \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole aws iam put-role-policy \ --role-name fsxn-tutorial-glue-role \ --policy-name s3-access-point-policy \ --policy-document file://glue-s3-policy.json
  • Athena クエリを実行し、 AWS Glue データカタログにアクセスするための IAM アクセス許可。

重要

Amazon S3 アクセスポイントはインターネットネットワークオリジンを使用する必要があります。Athena は、VPC からではなく、マネージドインフラストラクチャから Amazon S3 にアクセスします。VPC ネットワークオリジンを持つアクセスポイントは、Athena からのリクエストを拒否します。

ステップ 1: サンプルデータを FSx for ONTAP ボリュームにアップロードする

このチュートリアルでは、ニューヨーク市のタクシー旅行の公開データセットである NYC Taxi and Limousine Commission (TLC) Trip Record Data を使用します。データは、Athena が効率的にクエリできる列形式である Apache Parquet 形式です。

1 か月分の黄色のタクシー旅行データをダウンロードし、Amazon S3 アクセスポイントを介して FSx for ONTAP ボリュームにアップロードします。

$ curl -O https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2024-01.parquet

アクセスポイントエイリアスを使用して、FSx for ONTAP ボリュームにファイルをアップロードします。をアクセスポイントエイリアスmy-ap-alias-ext-s3aliasに置き換えます。

$ aws s3 cp yellow_tripdata_2024-01.parquet \ s3://my-ap-alias-ext-s3alias/taxi-data/yellow_tripdata_2024-01.parquet

アクセスポイントを介してファイルにアクセスできることを確認します。

$ aws s3 ls s3://my-ap-alias-ext-s3alias/taxi-data/ 2024-01-23 02:18:13 49961641 yellow_tripdata_2024-01.parquet

ステップ 2: でデータベースを作成する AWS Glue Data Catalog

テーブルメタデータを保持するデータベース AWS Glue Data Catalog を に作成します。 AWS Glue コンソール、Athena クエリエディタ、または を使用してデータベースを作成できます AWS CLI。

AWS Glue console

  1. https://console.aws.amazon.com/glue/ で AWS Glue コンソールを開きます。

  2. ナビゲーションペインのデータカタログで、データベースを選択します。

  3. [Add database] (データベースの追加) を選択します。

  4. [Name] (名前) に「fsxn_taxi_demo」と入力します。

  5. [データベースの作成] を選択します。

Athena クエリエディタまたは AWS CLI

$ aws athena start-query-execution \ --query-string "CREATE DATABASE IF NOT EXISTS fsxn_taxi_demo" \ --work-group primary

ステップ 3: にデータを登録する AWS Glue Data Catalog

Athena では AWS Glue 、クローラ (推奨) または手動CREATE EXTERNAL TABLEステートメントを使用してデータを登録できます。

オプション A: AWS Glue クローラを使用する (推奨)

AWS Glue クローラはデータのスキーマを自動的に検出し、 にテーブルを作成します AWS Glue Data Catalog。クローラは Parquet ファイルメタデータから正しい列タイプを推測するため、これは推奨されるアプローチです。

  1. アクセスポイントエイリアスを指すクローラを作成します。をアクセスポイントエイリアスmy-ap-alias-ext-s3aliasに、 を IAM ロールの ARN AWS Glue my-glue-role-arnに置き換えます。

    $ aws glue create-crawler \ --name fsxn-taxi-crawler \ --role my-glue-role-arn \ --database-name fsxn_taxi_demo \ --targets '{"S3Targets": [{"Path": "s3://my-ap-alias-ext-s3alias/taxi-data/"}]}'
  2. クローラーを実行します。

    $ aws glue start-crawler --name fsxn-taxi-crawler
  3. クローラのステータスを確認します。通常、クローラは 1~2 分で完了します。

    $ aws glue get-crawler --name fsxn-taxi-crawler \ --query "Crawler.{State:State,Status:LastCrawl.Status}"

    クローラが終了すると、状態は READYで、ステータスは ですSUCCEEDED。クローラは、fsxn_taxi_demoデータベースに taxi_data (フォルダ名から派生した) という名前のテーブルを作成します。

オプション B: Athena でテーブルを手動で作成する

データのスキーマが既にわかっている場合は、 CREATE EXTERNAL TABLEステートメントを使用して Athena でテーブルを直接作成できます。LOCATION 句でアクセスポイントエイリアスを使用します。

CREATE EXTERNAL TABLE fsxn_taxi_demo.yellow_taxi_trips ( VendorID bigint, tpep_pickup_datetime timestamp, tpep_dropoff_datetime timestamp, passenger_count bigint, trip_distance double, RatecodeID bigint, store_and_fwd_flag string, PULocationID bigint, DOLocationID bigint, payment_type bigint, fare_amount double, extra double, mta_tax double, tip_amount double, tolls_amount double, improvement_surcharge double, total_amount double, congestion_surcharge double, Airport_fee double ) STORED AS PARQUET LOCATION 's3://my-ap-alias-ext-s3alias/taxi-data/'
注記

列タイプは、Parquet ファイル内のタイプと一致する必要があります。このデータセットでは、 passenger_countや などのフィールドVendorIDは、 ではなく Parquet ファイルに bigint (INT64) として保存されますdouble。型が一致しない場合、Athena はHIVE_BAD_DATAエラーを返します。 AWS Glue クローラ (オプション A) を使用すると、クローラは正しいタイプを自動的に推測するため、この問題を回避できます。

ステップ 4: データをクエリする

Athena クエリエディタを開くか、 を使用して AWS CLI FSx for ONTAP データに対して SQL クエリを実行します。次の例では、クローラ () AWS Glue によって作成されたテーブルを使用しますtaxi_data。テーブルを手動で作成した場合は、 を taxi_dataに置き換えますyellow_taxi_trips

合計トリップをカウントし、平均を計算する

SELECT COUNT(*) AS total_trips, ROUND(AVG(trip_distance), 2) AS avg_distance_miles, ROUND(AVG(total_amount), 2) AS avg_total_usd, ROUND(AVG(passenger_count), 1) AS avg_passengers FROM fsxn_taxi_demo.taxi_data

出力の例:

total_trips avg_distance_miles avg_total_usd avg_passengers
2964624 3.65 26.80 1.3

最も混雑した集荷時間を検索する

SELECT HOUR(tpep_pickup_datetime) AS pickup_hour, COUNT(*) AS trip_count, ROUND(AVG(total_amount), 2) AS avg_fare FROM fsxn_taxi_demo.taxi_data GROUP BY HOUR(tpep_pickup_datetime) ORDER BY trip_count DESC LIMIT 5

最も収益の高い集荷場所を見つける

SELECT PULocationID AS pickup_location, COUNT(*) AS trip_count, ROUND(SUM(total_amount), 2) AS total_revenue FROM fsxn_taxi_demo.taxi_data GROUP BY PULocationID ORDER BY total_revenue DESC LIMIT 10

考慮事項

  • 読み取り専用アクセス。Athena は、アクセスポイントを介して FSx for ONTAP ボリュームからデータを読み取ります。Athena クエリ結果は、FSx for ONTAP ボリュームに戻るのではなく、Amazon S3 結果バケットに書き込まれます。

  • インターネットオリジンが必要です。Athena は、VPC 外のマネージドインフラストラクチャから Amazon S3 にアクセスします。aws:SourceVpc および aws:SourceVpce条件キーは、Athena リクエストでは使用できません。インターネットオリジンアクセスポイントを使用する必要があります。

  • ファイル形式。Athena は、Parquet、ORC、JSON、CSV、およびその他の形式をサポートしています。Parquet や ORC などの列形式は、Athena がクエリで参照される列のみを読み取るため、最適なクエリパフォーマンスを提供します。

  • ファイルシステムのユーザーアクセス許可。アクセスポイントに関連付けられたファイルシステムユーザーには、クエリ対象のファイルに対する読み取りアクセス許可が必要です。

  • AWS Glue Data Catalog テーブルは再利用可能です。にテーブルを登録すると AWS Glue Data Catalog、Amazon Redshift Spectrum、Amazon EMR AWS Glue Data Catalog、 AWS Glue ETL ジョブなど、 と統合されている他の AWS 分析サービスで使用できます。

クリーンアップ

継続的な課金を回避するには、このチュートリアルで作成したリソースを削除します。

  1. Athena テーブルとデータベースを削除します。

    DROP TABLE IF EXISTS fsxn_taxi_demo.taxi_data; DROP TABLE IF EXISTS fsxn_taxi_demo.yellow_taxi_trips; DROP DATABASE IF EXISTS fsxn_taxi_demo CASCADE;
  2. AWS Glue クローラを削除します。

    $ aws glue delete-crawler --name fsxn-taxi-crawler
  3. FSx for ONTAP ボリュームからサンプルデータを削除します。

    $ aws s3 rm s3://my-ap-alias-ext-s3alias/taxi-data/yellow_tripdata_2024-01.parquet