📋 このステップで学ぶこと
- 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の作成
- Glueコンソールを開く
- 左メニューから「Crawlers」を選択
- 「Create crawler」をクリック
- 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を作成
- Glueコンソール → ETL jobs → Visual ETL
- 「Create job」をクリック
- Sourceを追加:Data Catalog tableを選択
- Transformを追加:ApplyMapping、Filter等
- Targetを追加:S3、Data Catalog等
- 各ノードを線で接続
- Job detailsでDPU数を設定(デフォルト10)
- 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
📝 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」を学びます。
サーバーレスクエリとイベント駆動処理をマスターしましょう!
📊 補足: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を減らす、高ければ増やす