Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
AWS ETL祭り - AWS Glue活用事例@primeNumber
Search
Hirokazu Kobayashi
February 15, 2018
Technology
6
6k
AWS ETL祭り - AWS Glue活用事例@primeNumber
データ基盤「systemN」の本番環境で100億レコード/月のETLをGlueで実装した話
Hirokazu Kobayashi
February 15, 2018
Tweet
Share
More Decks by Hirokazu Kobayashi
See All by Hirokazu Kobayashi
dbtでGA4の生ログを扱いやすくする話
hiro_koba_jp
2
1.2k
dbtでアトリビューション分析
hiro_koba_jp
0
1.1k
Data Engineering Study #16 LT troccoデータカタログ
hiro_koba_jp
0
270
trocco Summer Update 2022 - 「dbt連携/グループ機能リニューアル」他ご紹介
hiro_koba_jp
0
370
DES#13 troccoデータカタログ&PdM募集
hiro_koba_jp
0
130
データマネジメントを実現するためのサービス・OSSまとめ
hiro_koba_jp
0
570
広告・マーケROIを可視化するためにETL/データ整備した話
hiro_koba_jp
0
1.6k
Other Decks in Technology
See All in Technology
信頼性に挑む中で拡張できる・得られる1人のスキルセットとは?
ken5scal
2
530
iOS/Androidで同じUI体験をネ イティブで作成する際に気をつ けたい落とし穴
fumiyasac0921
1
110
スクラム成熟度セルフチェックツールを作って得た学びとその活用法
coincheck_recruit
1
140
OCI Security サービス 概要
oracle4engineer
PRO
0
6.5k
Amplify Gen2 Deep Dive / バックエンドの型をいかにしてフロントエンドへ伝えるか #TSKaigi #TSKaigiKansai #AWSAmplifyJP
tacck
PRO
0
380
Introduction to Works of ML Engineer in LY Corporation
lycorp_recruit_jp
0
120
Python(PYNQ)がテーマのAMD主催のFPGAコンテストに参加してきた
iotengineer22
0
470
Engineer Career Talk
lycorp_recruit_jp
0
170
第1回 国土交通省 データコンペ参加者向け勉強会③- Snowflake x estie編 -
estie
0
130
Lexical Analysis
shigashiyama
1
150
データプロダクトの定義からはじめる、データコントラクト駆動なデータ基盤
chanyou0311
2
310
Making your applications cross-environment - OSCG 2024 NA
salaboy
0
190
Featured
See All Featured
Testing 201, or: Great Expectations
jmmastey
38
7.1k
Faster Mobile Websites
deanohume
305
30k
Building Applications with DynamoDB
mza
90
6.1k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
44
2.2k
Facilitating Awesome Meetings
lara
50
6.1k
Keith and Marios Guide to Fast Websites
keithpitt
409
22k
Adopting Sorbet at Scale
ufuk
73
9.1k
The Invisible Side of Design
smashingmag
298
50k
How to Ace a Technical Interview
jacobian
276
23k
Six Lessons from altMBA
skipperchong
27
3.5k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
42
9.2k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
25
1.8k
Transcript
2018年2月15日 AWS Glue活用事例 データ基盤「systemN」の本番環境で、 100億レコード/月のETLをGlueで実装した話
自己紹介 1 CONFIDENTIAL • 小林寛和 ◦ @hiro-koba (Github) ◦ @hiro_koba_jp
(Twitter / Qiita) • 株式会社primeNumber ◦ 執行役員 エンジニア • 好きなAWSサービス ◦ Elastic Beanstalk / AWS Lambda ◦ Redshift / AWS Glue © 2018 primeNumber Inc.
• primeNumber ◦ 中目黒のエンジニアリング・カンパニー • 事業内容 ◦ データエンジニアリングPaaS「systemN」 ◦ マーケティング・コンサルテーション
自社紹介 2 CONFIDENTIAL © 2018 primeNumber Inc.
データエンジニアリングPaaS「systemN」 3 CONFIDENTIAL © 2018 primeNumber Inc.
導入事例: 総合マーケティング企業のDMP 4 © 2018 primeNumber Inc. CONFIDENTIAL • 用途
◦ Webブラウザ・スマホアプリ上の行動ログ収集 ◦ 生ログを使用した分析 ◦ セグメンテーション・広告利用 • 規模感 ◦ 収集ログ量: 100億レコード/月超 ◦ ETLジョブ実行回数: 250回/日 ◦ Redshiftノード数: 20 nodes (dc2.large)
5 CONFIDENTIAL AWS Glue導入事例 © 2018 primeNumber Inc.
1. ログをKinesis Firehose経由でS3に蓄積 2. 1時間に1回バッチETL(クレンジング・変換) 3. prestoでETL後のログを可視化 Glue導入前のデータ基盤@2017年8月 6 CONFIDENTIAL
© 2018 primeNumber Inc.
• 自前でEC2上にHadoop環境を構築 ◦ ETLサービス→Hive + Spark ◦ DWH→Presto • Hadoop専属エンジニア
Glue導入前のETL基盤@2017年8月 7 CONFIDENTIAL © 2018 primeNumber Inc.
• ログ量の増加に伴い、様々な課題が ETL基盤@2017年8月 8 CONFIDENTIAL 応答速度求められると辛い スケールさせるのが手間 最小構成で結構高い インスタンス必要? 再利用しにくい
Hadoop専属エンジニア 以外触れない 重いクエリ走ると ETLに影響が・・・ © 2018 primeNumber Inc.
課題1. コスト改善 9 • 人的コスト ◦ Hadoop専属エンジニアが必要 ◦ 運用上のボトルネック •
料金 ◦ 最小構成: 20万円/月 ◦ 仮に現在と同じレコード処理した場合 ▪ 100億レコード/月を処理するにはEC2 60台構成 ▪ 月間数百万円、全然ペイしない・・・ CONFIDENTIAL © 2018 primeNumber Inc.
• スケールアウトを容易に行えるように ◦ ノードの追加作業が複雑で、ダウンタイムも発生 ◦ 突発的なスパイク来たら死亡 • データ基盤としてのスケーラビリティ ◦ バッチだけでなくリアルタイム集計要件が出てきた
◦ Spark Streaming立てるとなると別クラスタ必要… 課題2. スケーラビリティを上げたい 10 CONFIDENTIAL © 2018 primeNumber Inc.
課題3. ETL・DWHの可用性を上げたい 11 • DWH側が高負荷になるとETLが止まる ◦ prestoで重いクエリが実行されるとクラスタ毎落ちる ◦ 逆もまた然り •
DWHがボトルネックに ◦ ETL後のログは別システムなどで利活用したい ◦ prestoを経由する必要があり、ボトルネック ◦ HDFSだと取り回しにくい CONFIDENTIAL © 2018 primeNumber Inc.
12 CONFIDENTIAL 2017年9月1日、リプレイスPJT始動 0ベースで最適なアーキテクチャを模索 © 2018 primeNumber Inc.
Lambda Architecture 13 CONFIDENTIAL © 2018 primeNumber Inc. 引用: http://lambda-architecture.net/
Batch Layer & Serving Layer for systemN 1. 生ログを汎用的なバッチビューに変換 ◦
ダッシュボードからのクエリなど 2. ビジネス活用のためのバッチビュー構築 ◦ 1の汎用ログバッチビューから生成 ◦ 広告配信用のユーザー単位のサマリービューなど 14 CONFIDENTIAL © 2018 primeNumber Inc.
• リアルタイムなデータ集計に利用 ◦ Batch Layerで処理が間に合わない箇所で利用 ◦ 例: ドメインごとのPV/UU数を3秒以内に集計→可視化 サービスで表示 Speed
Layer for systemN 15 CONFIDENTIAL © 2018 primeNumber Inc.
Lambda Architecture on AWS 16 CONFIDENTIAL © 2018 primeNumber Inc.
17 CONFIDENTIAL 2017年9月中旬、実装開始 © 2018 primeNumber Inc.
• 解決したい課題 ◦ 料金・人的コスト最小化 ◦ スケーラビリティの確保 • 解決方法 ◦ マネージド・サービスAWS
Glueの採用 ▪ インフラ面の運用コストほぼ0 ▪ 学習コストはコードを書くことのみ ▪ 料金は1/4以下に • 最小構成は月間20万円→5万円に ◦ スケーラビリティもLambdaとの統合で解決 Batch Layer実装 18 CONFIDENTIAL © 2018 primeNumber Inc.
Batch Layer - スケーラビリティを上げる工夫 19 CONFIDENTIAL © 2018 primeNumber Inc.
• LambdaでGlueのDPUを自動設定 • 突発的なスパイクが来ても一定時間内に処理が終わるように ① 処理対象のログサイズ取得 ② 1時間以内に処理が終わる DPUの算出 ③ 算出したDPUを設定してJob Run
• 解決したい課題 ◦ DWH側の障害・メンテの影響がETLに波及しない ◦ DWHの処理性能がボトルネックにならない • 解決方法 ◦ ETLの出力先をS3に統一
▪ DWH側の影響はETLに波及しない ◦ RedshiftとRedshift Spectrumの併用 ▪ 性能面のボトルネックは大きく改善 Serving Layer実装 20 CONFIDENTIAL © 2018 primeNumber Inc.
Serving Layer - ETLとDWHの分離 21 CONFIDENTIAL © 2018 primeNumber Inc.
• ETLとDWHを分離するメリット ◦ 外的要因による障害が減る ▪ DWHの障害・メンテの度に止める必要なくなった ▪ 出力先をS3にしたことで、S3が落ちない限りETLは外的要 因で落ちない ◦ コストメリット ▪ 負荷が少ないロードのために、高価なDPUを使わない
Serving Layer - ETLとDWHの分離 22 CONFIDENTIAL © 2018 primeNumber Inc.
• S3→RedshiftへのロードにはRinを採用 ◦ RinはS3→Redshiftのロードを行うためのOSS • ただしジョブ再実行時の冪等性に注意しないと重複発生 ◦ 現状手動でS3オブジェクト削除・DELETE文発行してる ① ETL後のログがS3に置かれたら SQSに通知 ② SQSをポーリングし、メッセージがあ ればRedshiftにCOPY ③ COPYが完了したらメッセージ削除
Serving Layer - 2つのクエリ実行方法 23 CONFIDENTIAL © 2018 primeNumber Inc.
• 応答速度に応じてRedshift or Redshift Spectrumを選択 • どちらもRedshiftのI/Fでアクセスできる点がポイント ある程度時間がかかっても良いアクセス 応答速度が求められる場合は、 Redshiftにデータをロードしておく
Serving Layer - Glue Data Catalog 24 CONFIDENTIAL © 2018
primeNumber Inc. • ETL後のデータはGlueのData Catalogに登録して再利用性向上 ◦ Glue Data CatalogはCrawlerから作成できるメタデータ ◦ Redshift Spectrum、Athena、EMRからテーブルとして扱える ◦ AWS GlueのCrawlerを実行すればすぐ作れる • データのアーカイブ用途でも利用可能 ◦ 過去データ等、利用頻度は少ないが削除するかは悩ましい場合 ◦ S3に退避してData Catalog化しておけば解決 ① Glue CrawlerでS3上のログを クローリングし、Data Catalog作成 ② Redshift上でテーブルとして扱えるように
• ETL後のデータの内、一部のフィールドだけRedshiftに取り込 みたい • Redshift Spectrumからは全フィールドが見たい • AVRO+COPYコマンドで解決 一部の列だけRedshiftにLoad 25
CONFIDENTIAL © 2018 primeNumber Inc. AVRO形式で出力 テーブル定義に存在するフィー ルドだけ取り込まれる Spectrumからは 全フィールドが見える Redshift上には 必要列だけロードし、 容量圧縮
2017年9月末リリース 26 CONFIDENTIAL © 2018 primeNumber Inc. • 2017年9月1日、リプレイスPJT始動 •
2017年9月前半、アーキテクチャ設計 • 2017年9月後半、実装 • 2017年9月末日、本番リリース・完全切替
• ETL後のデータの再利用性もっと上げたい ◦ ETLのバージョン違いでデータ形式などもバラバラ ◦ 全期間のデータが同じスキーマで揃っていると再利用性が 更に高くなる • Spectrumのパフォーマンス上げたい ◦
Parquet形式にしたい(RedshiftのCOPY非対応) ◦ S3のパーティションも最適化したい ▪ Ex. s3://BUCKET/site_id=123/year=2018/… • ETL後のデータに対するETLを作成中 今後の課題1. データマート化 27 CONFIDENTIAL © 2018 primeNumber Inc.
• スモールスタートと実装スピードはGlueの得意とするところだ が、もう少しコスト抑えたい • コードで出来る最適化 ◦ RDDを極力使わないなどPySparkのチューニング ◦ Scala化の検証 •
Glue以外の選択肢も ◦ ログ量が増えたらEMRの方が安かったりするかも? ◦ 便利なDynamicFrameやEC2運用が発生するデメリットを 許容できるか、検証中 今後の課題2. Jobの高速化 28 CONFIDENTIAL © 2018 primeNumber Inc.
29 CONFIDENTIAL AWS Glueの開発Tips © 2018 primeNumber Inc.
• データアクセス層とETL処理層に分けています プログラミングモデル 30 CONFIDENTIAL © 2018 primeNumber Inc. 入力はDynamicFrameで
のロードが便利 ETL処理層のI/FはDataFrame 任意の列でディレクトリを切るなど は、DynamicFrame使えない
• ETL処理層はローカル開発 ◦ 少量データからDataFrameを作り、それをETLする ◦ Jupyter Notebookから実行 • データアクセス層の開発やE2Eで動かしたい時はDevEndpoint ◦
DynamicFrameでデータロードする箇所とか ◦ DevEndpointハマりどころ ▪ SparkContextを再生成しないとtoDF()が動かない ▪ spark.stop() glueContext = GlueContext(SparkContext.getOrCreate()) 開発環境 31 CONFIDENTIAL © 2018 primeNumber Inc.
• Glue Job Script ◦ データアクセス層の処理とロギングがメイン ◦ ETL処理はライブラリの呼び出す • Job
Library ◦ Githubのprivateリポジトリからpip installし、Zipで固めて S3に配置 ◦ このバージョンが変わるとETLの出力も変わるため、バー ジョンごとにS3のディレクトリを変えている • External File ◦ 設定ファイルや変換に必要なインメモリDB等 • Glue Job ◦ 上記のScript、Lib、Fileの参照を持たせるだけ コンポーネントとリリース 32 CONFIDENTIAL © 2018 primeNumber Inc.
• Jobの実行結果 ◦ CloudWatch Eventを使用し、基本全てSNS通知 ◦ SNSはIFTTTに通知し、失敗時のみ通知するよう分岐 ◦ ただしJobのステータスがSUCCEEDEDなのにエラー終了 しているのを見たことがあるので、ちゃんとやるなら
CloudWatch Logsのログでアラート設定すべきかも • Job実行時間 ◦ うまい方法見つけられてない ◦ 毎時GlueのAPI叩いてRunningのジョブの実行時間取る とか・・・? ◦ 現状シビアに監視する必要が無いのでやってない 監視・障害検知 33 CONFIDENTIAL © 2018 primeNumber Inc.
• 念のためE2Eのカウントチェックやってる ◦ ETL前と後のログ数比較 ◦ 異常な乖離がないか、ルールを作ってチェック ◦ 今のところGlue起因のアラートは上がっていない 監視・障害検知 34
CONFIDENTIAL © 2018 primeNumber Inc.
• 改行コードを含むデータは正しく認識できない ◦ 複数行に分割されてテーブルが作られるので件数合わない ◦ Custom Classifierでも対応できないらしい ◦ 現状クロール対象のデータを修正するしか無い •
差分更新的めちゃ遅い ◦ 作成済みData Catalogの再クローリング遅い ◦ ファイル1つしか増えていなくても、全件クロールと同じくらい時間かかる ◦ パーティション追加は手動でやるしか・・・? Glue Crawlerの注意点 35 CONFIDENTIAL © 2018 primeNumber Inc.
• コストが大幅に改善した ◦ Hadoopエンジニアに頼らない開発が出来るように ◦ 料金も約75%カット • スケーラビリティ向上 ◦ DPUを動的に算出すれば自動でスケール
• S3を出力先にすることで可用性向上 ◦ ジョブがコケる外的要因を出来るだけ減らす ◦ Data Catalog + Redshift Spectrumで再利用性向上 まとめ 36 CONFIDENTIAL © 2018 primeNumber Inc.
We are hiring. primeNumberではデータエンジニアリング 基盤を一緒に育ててくれる仲間を募集中です
Any question? 38 © 2017 primeNumber Inc. CONFIDENTIAL ご清聴ありがとうございました