STEP 15:AWS Glue入門

🔄 STEP 15: AWS Glue入門

サーバーレスETLサービスでデータパイプラインを自動化しよう

📋 このステップで学ぶこと

  • AWS Glueとは何か(ETLサービス)
  • Glue Crawlerでのスキーマ自動検出
  • Glue Data Catalogの理解
  • Glue ETL Jobの作成
  • 実践演習:S3→Redshiftパイプライン

🎯 このステップのゴール

このステップを終えると、AWS Glueを使ってデータパイプラインを自動化できるようになります。手作業でのETL処理から卒業し、サーバーレスで効率的なデータ処理を実現しましょう。

🎯 1. AWS Glueとは

Glueの基本

AWS Glueは、AWSが提供するサーバーレスETLサービスです。データの抽出(Extract)、変換(Transform)、ロード(Load)を自動化できます。

💡 例え話:Glue = 自動化された工場

【従来のETL = 手作業の工場】 ・原材料(生データ)を手で運ぶ ・職人が一つ一つ加工する ・完成品を手で運び出す ・設備(サーバー)の管理も必要 ・人手とコストがかかる 【AWS Glue = 全自動の工場】 ・原材料(S3のデータ)が自動で運ばれる ・ロボット(Spark)が自動で加工 ・完成品が自動で出荷(Redshift等) ・設備は使った分だけレンタル(サーバーレス) ・人手不要、コスト削減! 【具体例】 毎日100万件のCSVファイルをParquetに変換してRedshiftにロード ・手作業:エンジニア1人が2時間 × 毎日 ・Glue:自動で30分、人手ゼロ

Glueの特徴

📝 Glueの5つの特徴

  • サーバーレス:インフラ管理不要、使った分だけ課金
  • 自動スケール:データ量に応じて自動拡張
  • スキーマ自動検出:Crawlerが自動的にスキーマを発見
  • Apache Sparkベース:大量データを高速に並列処理
  • 統合メタデータ:Athena、Redshift、EMRとカタログを共有

Glueの主要コンポーネント

💡 例え話:図書館システム

【Glueを図書館に例えると】 📚 Glue Crawler = 司書(本の整理係) ・新しい本(データ)が入ってきたら ・著者、ジャンル、出版日を調べて(スキーマ検出) ・カタログに登録する 📖 Data Catalog = 図書カタログ ・全ての本の情報を一元管理 ・どこにどんな本があるか一目瞭然 ・複数の図書館(Athena、Redshift)で共有 🔧 ETL Job = 翻訳・製本係 ・外国語の本を日本語に翻訳(データ変換) ・ハードカバーに製本(形式変換:CSV→Parquet) ・整理して書庫へ(出力) ⏰ Trigger = タイマー/センサー ・「毎朝9時に新刊チェック」(スケジュール) ・「新しい本が届いたら整理開始」(イベント)

1️⃣ Glue Crawler

S3やRDSのデータをスキャンして、スキーマを自動検出。Data Catalogに登録します。

2️⃣ Glue Data Catalog

テーブルのメタデータを一元管理。Athena、Redshift、EMRと共有できます。

3️⃣ Glue ETL Job

データ変換処理を実行。Python/ScalaでSparkを使って並列処理します。

4️⃣ Glue Trigger

ETL Jobを自動実行。スケジュール、イベント、手動から選択できます。

Glueの料金

💰 料金体系と計算例

コンポーネント 料金 備考
Crawler $0.44 / DPU時間 スキーマ検出時のみ課金
ETL Job $0.44 / DPU時間 変換処理時のみ課金
Data Catalog 無料 100万オブジェクトまで

DPU(Data Processing Unit):Glueの処理能力の単位。1 DPU = 4 vCPU + 16GB RAM

【料金計算例】 毎日10GBのCSVをParquetに変換する場合: ・ETL Job: 10 DPU × 0.5時間 × $0.44 = $2.20/日 ・月額: $2.20 × 30日 = $66/月 比較:EC2で同じ処理をする場合: ・m5.xlarge(4 vCPU, 16GB)常時起動 ・月額: $0.192/時間 × 24時間 × 30日 = $138/月 → Glueの方が約50%コスト削減! (しかもインフラ管理不要)

Glueの全体像

📊 Glueパイプラインの流れ

【典型的なGlueパイプライン】 ┌─────────────────────────────────────────────────────────────┐ │ AWS Glue の全体像 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 📁 S3 (Raw) 🔍 Crawler 📚 Data Catalog │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ CSV/JSON │ ───→ │スキーマ │ ───→ │テーブル │ │ │ │ ファイル │ │自動検出 │ │メタデータ│ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ │ │ │ │ │ │ │ ↓ ↓ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ ETL Job │ ←─── │ Trigger │ │ Athena │ │ │ │データ変換│ │ 自動実行 │ │ クエリ │ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ │ │ ↓ │ │ 📁 S3 (Processed) または 🏢 Redshift │ │ ┌──────────┐ ┌──────────┐ │ │ │ Parquet │ │ DWH │ │ │ │ ファイル │ │ テーブル│ │ │ └──────────┘ └──────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ 【処理の流れ】 1. S3にCSV/JSONファイルが保存される 2. Crawlerがスキーマを自動検出 3. Data Catalogにテーブルとして登録 4. TriggerがETL Jobを起動 5. ETL JobがデータをParquetに変換 6. 処理済みデータをS3またはRedshiftに出力 7. AthenaやRedshiftで分析

🔍 2. Glue Crawlerでのスキーマ自動検出

Crawlerとは

Glue Crawlerは、データソース(S3、RDS等)をスキャンしてスキーマを自動検出し、Data Catalogに登録するサービスです。

💡 例え話:探偵のように調査

【Crawlerの動作】 1. S3バケットに新しいCSVファイルが置かれた s3://my-bucket/data/sales/sales_2025.csv 2. Crawler(探偵)が調査開始 「このファイルを調べてみよう…」 3. ファイルを開いて分析 「sale_id, sale_date, amount, quantity…」 「カラムが4つ、数値と日付が混在…」 4. スキーマを推測 sale_id: INT sale_date: DATE amount: DECIMAL quantity: INT 5. Data Catalogに報告 「salesテーブルを発見しました!」 「4カラム、1000行、CSV形式です」 → 手動でCREATE TABLEする必要なし!

Crawler作成手順

📝 ステップ1:Crawlerの作成

  1. Glueコンソールを開く
  2. 左メニューから「Crawlers」を選択
  3. 「Create crawler」をクリック
  4. Crawler名を入力(例:sales-crawler)

📝 ステップ2:データソースの指定

  • Data source type: S3
  • S3 path: s3://my-bucket/data/sales/
  • Subsequent crawl runs: Crawl new folders only(増分スキャン)
【パスの指定例】 s3://my-bucket/data/sales/ → salesフォルダ内の全ファイル s3://my-bucket/data/sales/*.csv → CSVファイルのみ s3://my-bucket/data/ → dataフォルダ内の全サブフォルダ

📝 ステップ3:IAM Roleの設定

  • 新しいIAM Roleを作成、または既存のRoleを選択
  • 必要な権限:S3読み取り、Glue書き込み
【必要なポリシー】 – AmazonS3ReadOnlyAccess(S3読み取り) – AWSGlueServiceRole(Glue操作)

📝 ステップ4:出力先の設定

  • Database: my_database(新規作成または既存を選択)
  • Table prefix: raw_(オプション、テーブル名の接頭辞)

📝 ステップ5:スケジュール設定

  • Frequency: 選択肢
    • On demand(手動実行のみ)
    • Hourly(毎時)
    • Daily(毎日)
    • Weekly(毎週)
    • Custom(cron式で指定)
【cron式の例】 毎日AM 2:00: cron(0 2 * * ? *) 毎週月曜AM 3:00: cron(0 3 ? * MON *) 毎月1日AM 1:00: cron(0 1 1 * ? *)

Crawler実行後の確認

— AthenaでCrawlerが作成したテーブルを確認 — データベース一覧 SHOW DATABASES; — テーブル一覧 SHOW TABLES IN my_database; — テーブルのスキーマを確認 DESCRIBE my_database.raw_sales; — データを確認 SELECT * FROM my_database.raw_sales LIMIT 10; — パーティション確認(パーティションがある場合) SHOW PARTITIONS my_database.raw_sales;

Crawlerの便利機能

💡 自動で賢く処理

  • パーティション自動検出:year=2025/month=01/のような構造を自動認識
  • スキーマ変更検出:カラムの追加・削除を自動で反映
  • 増分スキャン:新しいファイルだけをスキャン(2回目以降高速)
  • 形式自動判定:CSV、JSON、Parquet等を自動判定

📚 3. Glue Data Catalog

Data Catalogとは

Glue Data Catalogは、データベースやテーブルのメタデータ(スキーマ、パーティション情報、統計情報)を一元管理するサービスです。

💡 例え話:会社の資産台帳

【Data Catalog = 会社の資産台帳】 資産台帳がない会社: ・「あのデータどこにあったっけ?」 ・「このファイルのカラム名は?」 ・「最新データはどれ?」 → 毎回調べ直す手間 資産台帳がある会社: ・全てのデータが一覧で見える ・カラム名、型、更新日時が記録 ・誰でも同じ情報を参照できる → すぐに必要なデータを見つけられる 【メリット】 ・Athenaで「SELECT * FROM sales」 ・Redshiftで「SELECT * FROM sales」 ・EMRで「spark.table(“sales”)」 → 全て同じData Catalogを参照!

Data Catalogの構造

📊 階層構造

Data Catalog(カタログ全体) ├── Database: sales_db │ ├── Table: raw_sales │ │ ├── Columns: sale_id (int), sale_date (date), amount (decimal) │ │ ├── Location: s3://my-bucket/raw/sales/ │ │ ├── Format: CSV │ │ └── Partitions: year, month │ └── Table: processed_sales │ ├── Columns: sale_id (int), sale_date (date), amount (decimal) │ ├── Location: s3://my-bucket/processed/sales/ │ └── Format: Parquet └── Database: analytics_db └── Table: daily_summary ├── Columns: date (date), total_sales (decimal) └── Location: s3://my-bucket/analytics/

Data Catalogの利点

🔗 統合メタデータ

Athena、Redshift Spectrum、EMR、Glueで同じメタデータを共有。一度登録すれば、どこからでも使えます。

🔍 データ発見

どこにどんなデータがあるか一目瞭然。コンソールで検索、フィルタリング可能。

📊 スキーマ管理

スキーマのバージョン管理、変更履歴を自動記録。誰がいつ変更したか追跡可能。

🚀 クエリ高速化

パーティション情報で無駄なスキャンを削減。Athenaのコスト削減にも効果的。

Data Catalogの確認方法

— コンソールで確認 1. Glueコンソール → Data Catalog → Databases 2. データベースを選択 3. Tables でテーブル一覧を確認 4. テーブルをクリックして詳細を確認 — AthenaでSQL確認 — データベース一覧 SHOW DATABASES; — テーブル一覧 SHOW TABLES IN my_database; — テーブル詳細情報(フォーマット、場所など) DESCRIBE FORMATTED my_database.raw_sales; — パーティション一覧 SHOW PARTITIONS my_database.raw_sales;

⚙️ 4. Glue ETL Jobの作成

ETL Jobとは

Glue ETL Jobは、データ変換処理を実行するジョブです。PythonまたはScalaで記述し、Apache Sparkで並列処理します。

ETL Job作成方法

📊 2つの作成方法

方法 特徴 おすすめ
ビジュアルエディタ GUIでドラッグ&ドロップ
コード不要
初心者、シンプルな処理
スクリプトエディタ Python/Scalaコードを記述
柔軟な処理が可能
複雑な処理、カスタマイズ

ETL Job作成手順(ビジュアルエディタ)

📝 GUIでETL Jobを作成

  1. Glueコンソール → ETL jobs → Visual ETL
  2. 「Create job」をクリック
  3. Sourceを追加:Data Catalog tableを選択
  4. Transformを追加:ApplyMapping、Filter等
  5. Targetを追加:S3、Data Catalog等
  6. 各ノードを線で接続
  7. Job detailsでDPU数を設定(デフォルト10)
  8. SaveしてRun
【ビジュアルエディタの画面イメージ】 ┌─────────┐ ┌──────────────┐ ┌─────────┐ │ Source │ ───→ │ Transform │ ───→ │ Target │ │ (S3) │ │ (ApplyMap) │ │ (S3) │ └─────────┘ └──────────────┘ └─────────┘ ドラッグ&ドロップでノードを配置 → 線で接続するだけでパイプライン完成!

ETL Job作成(Pythonスクリプト)

📝 基本的なETLスクリプト

import sys from awsglue.transforms import * from awsglue.utils import getResolvedOptions from pyspark.context import SparkContext from awsglue.context import GlueContext from awsglue.job import Job # ========================================== # 1. 初期化 # ========================================== args = getResolvedOptions(sys.argv, [‘JOB_NAME’]) sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session job = Job(glueContext) job.init(args[‘JOB_NAME’], args) # ========================================== # 2. データ読み込み(Extract) # ========================================== # Data Catalogから読み込み datasource0 = glueContext.create_dynamic_frame.from_catalog( database = “my_database”, # データベース名 table_name = “raw_sales” # テーブル名 ) # 何件読み込んだか確認 print(f”読み込み件数: {datasource0.count()}”) # ========================================== # 3. データ変換(Transform) # ========================================== # カラムのマッピング(名前変更、型変換) applymapping1 = ApplyMapping.apply( frame = datasource0, mappings = [ (“sale_id”, “string”, “sale_id”, “int”), # string→int (“sale_date”, “string”, “sale_date”, “date”), # string→date (“amount”, “string”, “amount”, “decimal(10,2)”) # string→decimal ] ) # ========================================== # 4. データ書き込み(Load) # ========================================== # S3にParquet形式で出力 datasink2 = glueContext.write_dynamic_frame.from_options( frame = applymapping1, connection_type = “s3”, connection_options = { “path”: “s3://my-bucket/processed/sales/” }, format = “parquet” # Parquet形式(推奨) ) # ========================================== # 5. 完了 # ========================================== job.commit() print(“ETL Job 完了!”)

💡 初期化コードの詳細解説(各行の意味)

【import文の役割】 from awsglue.transforms import * → Glue専用の変換関数をインポート(ApplyMapping、Filter等) from awsglue.utils import getResolvedOptions → コマンドライン引数を取得する関数 from pyspark.context import SparkContext → Sparkの実行環境を作る(エンジン本体) from awsglue.context import GlueContext → SparkをGlue用に拡張したもの from awsglue.job import Job → ジョブの開始・終了を管理 【初期化の各行】 ① args = getResolvedOptions(sys.argv, [‘JOB_NAME’]) ┌─────────────────────────────────────────────────┐ │ Glueがジョブ実行時に渡すパラメータを取得 │ │ 例:–JOB_NAME my_etl_job │ │ 結果:args = {‘JOB_NAME’: ‘my_etl_job’} │ └─────────────────────────────────────────────────┘ ② sc = SparkContext() ┌─────────────────────────────────────────────────┐ │ Sparkエンジンを起動 │ │ これがないと並列処理ができない │ │ ※ 1ジョブに1つだけ作成可能 │ └─────────────────────────────────────────────────┘ ③ glueContext = GlueContext(sc) ┌─────────────────────────────────────────────────┐ │ SparkをGlue用に「ラップ」する │ │ ・DynamicFrame(Glue独自のデータ形式)が使える │ │ ・Data Catalogとの連携が簡単に │ │ ・S3への読み書きが楽に │ └─────────────────────────────────────────────────┘ ④ spark = glueContext.spark_session ┌─────────────────────────────────────────────────┐ │ SparkSQL用のセッションを取得 │ │ df = spark.sql(“SELECT * FROM …”)が使える │ │ ※ DataFrameを使いたい時に必要 │ └─────────────────────────────────────────────────┘ ⑤ job = Job(glueContext) ┌─────────────────────────────────────────────────┐ │ Glueジョブのインスタンスを作成 │ │ ブックマーク(前回処理位置の記録)管理に必要 │ └─────────────────────────────────────────────────┘ ⑥ job.init(args[‘JOB_NAME’], args) ┌─────────────────────────────────────────────────┐ │ ジョブを開始する │ │ 引数のJOB_NAMEでジョブを識別 │ │ ブックマーク機能を有効化 │ └─────────────────────────────────────────────────┘ 【なぜこの順序?】 SparkContext → GlueContext → Job の順で作る必要がある (後のものが前のものに依存しているため)

💡 例え話:レストランの開店準備

【Glue ETLの初期化 = レストランの開店準備】 ① args = getResolvedOptions(…) → 今日の予約状況を確認(パラメータ確認) ② sc = SparkContext() → ガス・電気・水道を開ける(エンジン起動) ③ glueContext = GlueContext(sc) → 厨房機器を使えるようにする(Glue機能の準備) ④ spark = glueContext.spark_session → レジを起動する(SQLクエリの準備) ⑤ job = Job(glueContext) → 営業日報の準備(ジョブ管理の準備) ⑥ job.init(…) → 「開店します!」と宣言(ジョブ開始) — 最後の job.commit() → 「閉店しました」と記録(ジョブ終了) ※ これがないとジョブが「実行中」のまま残る!

よく使う変換処理

💡 例え話:料理のレシピ

【ETL変換 = 料理の調理工程】 生の食材(Raw Data)を美味しい料理(分析用データ)に変える 1. 選別(Filter) 「傷んだ野菜は除く」→「金額0以下のデータは除く」 2. カット(SelectFields) 「必要な部分だけ切り取る」→「必要なカラムだけ抽出」 3. 下ごしらえ(ApplyMapping) 「皮をむく、形を整える」→「型変換、カラム名変更」 4. 味付け(Join) 「調味料を加える」→「マスターデータを結合」 5. 盛り付け(Write) 「お皿に盛る」→「Parquetで出力」

🔧 代表的な変換

# ========================================== # 1. フィルタ(条件で絞り込み) # ========================================== from awsglue.transforms import Filter # 金額が1000以上のレコードだけ抽出 filtered = Filter.apply( frame = datasource0, f = lambda x: x[“amount”] > 1000 ) # 複数条件(金額1000以上 AND 数量1以上) filtered = Filter.apply( frame = datasource0, f = lambda x: x[“amount”] > 1000 and x[“quantity”] >= 1 ) # ========================================== # 2. カラム選択(必要なカラムだけ抽出) # ========================================== from awsglue.transforms import SelectFields # 3つのカラムだけ抽出 selected = SelectFields.apply( frame = datasource0, paths = [“sale_id”, “sale_date”, “amount”] ) # ========================================== # 3. カラム削除(不要なカラムを除外) # ========================================== from awsglue.transforms import DropFields # 不要なカラムを削除 dropped = DropFields.apply( frame = datasource0, paths = [“unnecessary_column”, “temp_column”] ) # ========================================== # 4. 重複削除(DataFrameに変換して処理) # ========================================== df = datasource0.toDF() df_unique = df.dropDuplicates([“sale_id”]) # ========================================== # 5. NULL値の処理 # ========================================== from pyspark.sql.functions import col, when, lit df = datasource0.toDF() # NULLを0に置換 df = df.withColumn(“amount”, when(col(“amount”).isNull(), lit(0)) .otherwise(col(“amount”)) ) # ========================================== # 6. 日付変換 # ========================================== from pyspark.sql.functions import to_date, date_format df = datasource0.toDF() # 文字列→日付型 df = df.withColumn(“sale_date”, to_date(col(“sale_date”), “yyyy-MM-dd”) ) # 日付→文字列(フォーマット変更) df = df.withColumn(“sale_month”, date_format(col(“sale_date”), “yyyy-MM”) )

エラーハンドリング

⚠️ よくあるエラーと対処法

# ========================================== # エラーハンドリング付きETL Job # ========================================== import sys from awsglue.transforms import * from awsglue.utils import getResolvedOptions from pyspark.context import SparkContext from awsglue.context import GlueContext from awsglue.job import Job import logging # ログ設定 logger = logging.getLogger() logger.setLevel(logging.INFO) args = getResolvedOptions(sys.argv, [‘JOB_NAME’]) sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session job = Job(glueContext) job.init(args[‘JOB_NAME’], args) try: # データ読み込み logger.info(“データ読み込み開始…”) datasource = glueContext.create_dynamic_frame.from_catalog( database=”my_database”, table_name=”raw_sales” ) logger.info(f”読み込み件数: {datasource.count()}”) # データが0件の場合はスキップ if datasource.count() == 0: logger.warning(“データが0件です。処理をスキップします。”) job.commit() sys.exit(0) # データ変換 logger.info(“データ変換開始…”) df = datasource.toDF() # 不正データの除外 df_clean = df.filter( (col(“sale_id”).isNotNull()) & (col(“amount”) > 0) ) removed_count = df.count() – df_clean.count() logger.info(f”除外レコード数: {removed_count}”) # 書き込み logger.info(“データ書き込み開始…”) df_clean.write.mode(“append”).parquet( “s3://my-bucket/processed/sales/” ) logger.info(“ETL Job 正常完了!”) except Exception as e: logger.error(f”エラー発生: {str(e)}”) raise e finally: job.commit()

ETL Jobの実行

— コンソールから実行 1. Glueコンソール → ETL jobs 2. Jobを選択 3. 「Run」をクリック — AWS CLIから実行 aws glue start-job-run –job-name my-etl-job — 実行状況を確認 aws glue get-job-run \ –job-name my-etl-job \ –run-id jr_xxxxxxxxxxxx — 実行履歴を確認 aws glue get-job-runs –job-name my-etl-job

💪 5. 実践演習:S3→Redshiftパイプライン

演習 1 実践

S3のCSVファイルをGlueで処理し、Parquetに変換するパイプラインを構築してください

要件:

  • S3にCSVファイルが保存される(日次)
  • Crawlerがスキーマを自動検出
  • ETL JobでParquetに変換
  • 処理済みデータをS3に出力

【解答例】

1. Crawlerの作成

# Crawler設定 Name: sales-crawler Data source: s3://my-bucket/raw/sales/ Database: sales_db Table prefix: raw_ Schedule: Daily at 01:00 # 実行後、テーブルが自動作成される # Database: sales_db # Table: raw_sales

2. ETL Jobの作成(CSV→Parquet変換)

import sys from awsglue.transforms import * from awsglue.utils import getResolvedOptions from pyspark.context import SparkContext from awsglue.context import GlueContext from awsglue.job import Job from pyspark.sql.functions import col, to_date, year, month args = getResolvedOptions(sys.argv, [‘JOB_NAME’]) sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session job = Job(glueContext) job.init(args[‘JOB_NAME’], args) # Data Catalogからデータ読み込み datasource = glueContext.create_dynamic_frame.from_catalog( database=”sales_db”, table_name=”raw_sales” ) # DataFrameに変換して柔軟な処理 df = datasource.toDF() # データ変換 df = df.select( col(“sale_id”).cast(“int”), to_date(col(“sale_date”), “yyyy-MM-dd”).alias(“sale_date”), col(“customer_id”).cast(“int”), col(“amount”).cast(“decimal(10,2)”), col(“quantity”).cast(“int”) ) # 年月でパーティション用のカラムを追加 df = df.withColumn(“year”, year(col(“sale_date”))) df = df.withColumn(“month”, month(col(“sale_date”))) # Parquet形式で出力(パーティション分割) df.write.mode(“append”) \ .partitionBy(“year”, “month”) \ .parquet(“s3://my-bucket/processed/sales/”) job.commit()

3. Triggerの設定

# Trigger設定(Crawler完了後にETL Job実行) Name: sales-etl-trigger Type: Conditional Condition: Crawler “sales-crawler” が成功したら Action: ETL Job “sales-etl-job” を実行

4. パイプライン全体の流れ

【日次パイプライン】 AM 1:00 S3にCSVファイルが保存される s3://my-bucket/raw/sales/sales_2025-01-19.csv ↓ AM 1:00 Glue Crawler が起動(スケジュール) スキーマを検出してData Catalogに登録 ↓ AM 1:10 Crawler完了 → Trigger発火 ↓ AM 1:10 ETL Job が起動 CSV→Parquet変換 s3://my-bucket/processed/sales/year=2025/month=01/ ↓ AM 1:30 処理完了! 【処理時間の目安】 ・Crawler: 5〜10分(10GBデータ) ・ETL Job: 10〜20分(10GBデータ、10 DPU)

📝 STEP 15 のまとめ

✅ このステップで学んだこと

  • AWS GlueはサーバーレスETLサービス(インフラ管理不要)
  • Crawlerがスキーマを自動検出してData Catalogに登録
  • Data Catalogでメタデータを一元管理(Athena等と共有)
  • ETL Jobでデータ変換を自動化(Sparkで並列処理)
  • Triggerでジョブの自動実行(スケジュール/イベント)

💡 重要ポイント

  • Crawlerでスキーマ検出を自動化(手動でCREATE TABLE不要)
  • Data CatalogはAthena、Redshift Spectrum、EMRと共有
  • ETL JobはApache Sparkで並列処理(大量データも高速)
  • Parquet形式で出力するとAthenaのコスト削減
  • サーバーレスなので使った分だけ課金

🎯 次のステップの準備

次のSTEP 16では、「Amazon Athena & Lambda」を学びます。
サーバーレスクエリとイベント駆動処理をマスターしましょう!

📝 理解度チェック

問題 1 基礎

Glue Crawler、Data Catalog、ETL Jobの役割をそれぞれ説明してください。

【解答】

  • Glue Crawler:データソース(S3等)をスキャンし、スキーマを自動検出してData Catalogに登録する
  • Data Catalog:テーブルのメタデータ(スキーマ、パーティション)を一元管理。Athena、Redshift Spectrum、EMRと共有できる
  • ETL Job:データ変換処理を実行。PythonまたはScalaで記述し、Sparkで並列処理する
問題 2 応用

Data Catalogを使用するメリットを3つ挙げてください。

【解答例】

  1. 統合メタデータ:Athena、Redshift Spectrum、EMR、Glueで同じメタデータを共有できる
  2. データ発見:どこにどんなデータがあるか一目瞭然で、検索やフィルタリングが可能
  3. クエリ高速化:パーティション情報を管理することで、無駄なスキャンを削減しコストを抑えられる
問題 3 応用

毎日AM 2:00にS3の新しいファイルをスキャンし、Parquetに変換するGlueパイプラインを設計してください。

【解答例】

  1. Crawler:毎日AM 2:00にスケジュール実行
    • S3パス: s3://bucket/raw/
    • Database: my_db
    • Schedule: cron(0 2 * * ? *)
  2. ETL Job:Crawler完了後に実行
    • 入力: Data Catalog (my_db.raw_table)
    • 処理: データ変換(型変換、パーティション追加)
    • 出力: s3://bucket/processed/ (Parquet形式)
  3. Trigger:Conditional Triggerで連携
    • 条件: Crawler成功
    • アクション: ETL Job実行

📊 補足:Glue vs 他のETLツール

🔄 ETLツール比較

ツール 特徴 適したユースケース
AWS Glue サーバーレス、Spark、AWSネイティブ AWS環境でのバッチETL
Lambda 軽量、15分制限、イベント駆動 小規模データ、トリガー処理
EMR Hadoop/Spark、柔軟、管理必要 大規模・複雑な処理
Step Functions ワークフロー管理、オーケストレーション 複数サービスの連携
GCP Dataflow Apache Beam、ストリーミング GCP環境、リアルタイム処理

💡 選択の目安

【どのツールを使うべき?】 Q: データ量は? ├─ 少量(〜100MB)→ Lambda ├─ 中規模(100MB〜100GB)→ Glue └─ 大規模(100GB〜)→ Glue または EMR Q: リアルタイム性は? ├─ バッチ処理(日次/時間毎)→ Glue ├─ ニアリアルタイム(分単位)→ Glue Streaming └─ リアルタイム(秒単位)→ Kinesis + Lambda Q: 複雑さは? ├─ シンプルな変換 → Glue(ビジュアルエディタ) ├─ 複雑な変換 → Glue(Pythonスクリプト) └─ 非常に複雑 → EMR(フル制御) 【おすすめ】 初心者はまずGlueから始めましょう! ・ビジュアルエディタでコード不要 ・サーバーレスで管理が楽 ・AWSサービスとの連携が簡単

❓ よくある質問

Q1: GlueとLambdaの違いは何ですか?
用途とスケールが異なります。

Glue:
・大量データのETL処理(GB〜TB)
・Apache Sparkで並列処理
・長時間実行可能(数時間OK)
・DPU時間課金($0.44/DPU時間)

Lambda:
・軽量な処理(KB〜数百MB)
・単一関数を実行
・最大15分
・実行時間+メモリ課金

大量データの変換はGlue、小規模な処理やトリガーはLambdaが適しています。
Q2: Crawlerの実行時間はどのくらいですか?
データ量とファイル数によります。目安:
・数GB(100ファイル以下):3〜5分
・数十GB(1000ファイル):10〜20分
・数百GB(1万ファイル):30分〜1時間

高速化のコツ:
・増分スキャン(Crawl new folders only)を有効に
・パーティション構造を統一
・不要なファイル(.tmpなど)を除外
Q3: ETL JobでParquet形式を使うメリットは?
3つの大きなメリットがあります。

1. 高速:カラムナー形式なので、必要なカラムだけ読み込める
2. 圧縮:CSVの1/10程度のサイズ(ストレージ節約)
3. コスト削減:Athenaはスキャンしたデータ量で課金されるので、Parquetで大幅削減

例:1TB CSVをAthenaでクエリ → $5
100GB Parquetをクエリ → $0.50(90%削減)
Q4: Glue ETL Jobのデバッグ方法は?
いくつかの方法があります。

1. CloudWatch Logs:ジョブのログを確認
2. Glue Studio:ビジュアルでデータフローを確認
3. 開発エンドポイント:Jupyter Notebookでインタラクティブにデバッグ(有料)
4. ローカルSparkで開発:開発環境でSparkを動かしてテスト

最初は小さいサンプルデータでテストしてから、本番データで実行することをおすすめします。
Q5: DPU数はいくつに設定すべきですか?
データ量と処理時間の要件によります。目安:

・数GB:2〜5 DPU
・数十GB:10 DPU(デフォルト)
・数百GB:20〜50 DPU
・TB級:50〜100 DPU

最適化のコツ:
・最初はデフォルト(10 DPU)で実行
・CloudWatch Metricsでリソース使用率を確認
・使用率が低ければDPUを減らす、高ければ増やす
📝

学習メモ

クラウドデータ基盤(AWS・GCP) - Step 15

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE