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 Glueでリプレースしてみた/gunosy-use-glue
Search
aibou
December 25, 2017
Programming
1.1k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
AWS Glueでリプレースしてみた/gunosy-use-glue
aibou
December 25, 2017
More Decks by aibou
See All by aibou
LegalForceの契約データを脅かすリスクの排除と 開発速度の向上をどうやって両立したか
aibou
0
7.4k
LegalForce社での全文検索インフラ活用事例
aibou
0
140
SRE Lounge #7 Gunosy版「SREミッション」策定
aibou
9
7k
その接続先情報はどこに
aibou
0
3.8k
gunosy-beer-2016-07-27
aibou
1
850
Other Decks in Programming
See All in Programming
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
220
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
170
どこまでゆるくて許されるのか
tk3fftk
0
470
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
120
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
310
信頼性について考えてみる(SRE NEXT 2026 miniLT)
hayama17
0
160
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.3k
えっ!!コードを読まずに開発を!?
hananouchi
0
190
AI時代、エンジニアはどう育つのか -未経験エンジニアの成長を間近で見て考えたこと-
thasu0123
0
110
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
480
SLOをサービス品質の共通言語にするために 取り組んできたこと
wakana0222
0
480
スマートグラスで並列バイブコーディング
hyshu
0
290
Featured
See All Featured
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Speed Design
sergeychernyshev
33
1.9k
Git: the NoSQL Database
bkeepers
PRO
432
67k
Test your architecture with Archunit
thirion
1
2.3k
Evolving SEO for Evolving Search Engines
ryanjones
0
240
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
67
56k
Designing Powerful Visuals for Engaging Learning
tmiket
1
450
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
The Cult of Friendly URLs
andyhume
79
6.9k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
380
Transcript
AWS GlueͰ ϦϓϨʔεͯ͠Έͨ גࣜձࣾGunosy ։ൃຊ෦ ྄ี
͓·͑ͩΕ • @aibou • SREνʔϜͰܯۀͬͯ·͢ • ϏοάσʔλະܦݧͰ͢ • Ξϝϑτ؍ઓ͕͖Ͱ͢
ۀ༰ • άϊγʔɾࠂαʔόͷӡ༻ • ࣗಈԽɾলྗԽΛతʹʑ׆ಈ • ίʔυԽ(codenize.tools, terraform) • ʮ͜ΜʹͪΘʔ
ܯͷͷͰ͕͢ʔʯ • OpsWorks, Kinesis3ܑఋ • X-Ray͍͍ͨͳ͊ɾɾɾ
࣍ • GunosyͰGlueΛಋೖͨ͠ʢ͔͠ยखؒͰʣ • AthenaύʔςΟγϣϯ࡞όονΛGlueʹஔ • ࣗલETLόονΛGlueʹஔ • DynamoDBͷϑΥʔϚοτมΛGlueͰ࣮ݱ
ᶃAthenaύʔςΟγϣϯ࡞ όονΛGlueʹஔ
άϊγʔͷࠂϩάͷྲྀΕ ʢͬ͘͟Γʣ CBUDITFSWFS &.3 4QBSL "1*TFSWFST PS "UIFOB ৴ީิ 'JSFIPTF
AthenaͱRedshiftͷ͍͚ • Athena • ՄࢹԽ༻ • ԕ͍աڈظؒͷूܭͰར༻ • Redshift •
ϩδοΫ༻ • ۙͷσʔλ͔Β৴ީิͷੜ • ετϨʔδ༻ϑϧʹͳΔͱRedshiftೖΕସ͑ΔରԠ • ʹݹ͍σʔλΛࣺͯΔ(S3ʹόοΫΞοϓ͋Γ)
Athena • fluent-plugin-s3ͰϩάΛS3ʹΞοϓϩʔυ • tag͝ͱʹ(imp, click) • hive friendly (
/click/year=2017/... ) ͳkeyͰ • ఆ࣌όονͰADD PARTITION͢Δ • MSCK REPAIRͩͱ࣮͕͕͔͔֬ͩ࣌ؒΔ • MSCK REPAIR ≒ 2h, ADD PARTITION < 1s
Athena ύʔςΟγϣϯ࡞όον • ࣾͰԿނ͔ʮશࣗಈ͍͋΅͏ʯͱݺΕ͍ͯΔ • CloudWatch Events + Lambda •
LambdaJava • codenize-tools/monosasi ͰDSLԽ • s3://bucket/path/to/year=2017/month=11/day=24/hour=18/ • ཁ͕͋Είʔυެ։͠·͢ʢ͕ɺGlueͷํ͕ศརΑͶɾɾɾ • FirehoseϑΥʔϚοτʹରԠՄೳ
Glue DataCatalog • AthenaLambdaͰRate limit • ҙࣝͯͣ͠Β͞ͳ͍ͱ͕࣌ؒूத͢Δ • εΩʔϚཧͱCloudWatch Eventsͷཧਏ͍
• ݱঢ়45ςʔϒϧ͙Β͍ɻطʹ͠ΜͲ͍
to Glue Crawler & DataCatalog "1*TFSWFST "-5&35"#-& "%%1"35*5*0/
ॴײ • Lambda͕ෆཁʹͳͬͨʢͬͨͶʣ • 1ΫϩʔϥͰෳͷSource DataStoreʹରԠ • Ϋϩʔϥ͕ཚཱ͠ͳͯ͘ॿ͔Δ • ϩάྔ͕ଟ͍ͱΫϩʔϦϯάʹ͕͔͔࣌ؒΔ
• ͍·ͷͱ͜Ζ6͔͔࣌ؒͬͯΔ
GlueͰͰ͖ͳ͔ͬͨ͜ͱ • ҟϦʔδϣϯͷAthenaʹAdd table • ઌड़ͷύʔςΟγϣϯՃόονͰରԠ • طଘͷAthena Tableʹରͯ͠DataCatalogͷద༻ •
database/tableͷ࡞Γ͠ʢӨڹ͋ΔͷͰ·ͩʣ • Glueͷςʔϒϧ໊ͷࢦఆɾมߋ • ಛҟͳϑΥʔϚοτʹରԠෆՄ ཌ
ᶄࣗલETLόονΛGlueʹஔ
ϩάͱϚελʔͷJOIN • ϩάσʔλɿS3 ɹɹ Redshift • imp, click etc •
ϚελʔσʔλɿRDS • campaign, creative etc • ʮAthenaɾRedshiftͰJOIN͍ͨ͠ʯ • => Digdag + EmbulkͰରԠ͍ͯͨ͠
Embulk + digdag (+ docker) "-5&35"#-& "%%1"35*5*0/
to Glue Crawler & Glue ETL PSFHPOSFHJPO UPLZPSFHJPO SFQMJDB ᶃ
ᶄ ᶄͷNFUBEBUBͰ BEEUBCMF ᶃͷNFUBEBUBͰ &5-
Additional • statsςʔϒϧɿຖͷूܭࡁΈσʔλ • ςʔϒϧશߦͰͳ͘ຖͷσʔλ͚ͩUpload • ETLͷJobͰFilter transform classΛ༻
TUBUTUBCMF TQBUIUPZFBSNPOUIEBZ
Filter transformer class def filter_function(dynamic_record): if dynamic_record["date"].strftime("%Y-%m-%d") == yesterday.strftime("%Y-%m-%d"): return
True else: return False filtered0 = Filter.apply(frame=datasource0, f=filter_function, transformation_ctx="filtered0")
GlueͰΑ͔ͬͨͱ͜Ζ • ETL͕Glue͚ͩͰ݁͢Δ • Lambdaෆཁ • Digdag + Embulkෆཁ •
αʔό(ECS)ෆཁ • ਓ͕ؒςʔϒϧΛྻڍ͠ͳ͍͍ͯ͘ • ࠓ·ͰLambdaͱ͔EmbulkͷઃఆϑΝΠϧͰશ෦ࢦఆͯͨ͠
GlueͰΑ͘ͳ͔ͬͨͱ͜Ζ • CrawlerͰͳ͘ETLଆͰfilter͍ͯ͠Δ • ൃߦ͞ΕΔSQL SELECT * FROM hoge_stats; •
CrawlerଆͰWHEREઃఆ͍ͨ͠ • 18࣌ؒͰऴΘΒͳ͍Job (3ԯϨίʔυ) • JobͷΫϩʔϯ͕Ͱ͖ͳ͍ʢΘΓͱٸ͗Ͱ΄͍͠ʣ • ͍ͭ͘ࣅͨΑ͏ͳͷΛ࡞Δͷʹख͕ؒ
ᶅDynamoDBͷϑΥʔϚοτมΛ GlueͰ࣮ݱ (ϦϓϨʔεͰͳ͍͚Ͳ)
DynamoDBͷσʔλΛੳ͍ͨ͠ • άϊγʔͷλϒฒͼใ • Ͳ͏͍ͬͨϢʔβ͕Ͳ͏͍͏λϒΛϑΥϩʔͯ͠Δ͔ • ಛఆ݅ͰࣗಈՃ͞ΕΔλϒ • ਖ਼͘͠ػೳ͍ͯ͠Δ͔ •
ͲΕ͙Β͍͍Δͷ͔ • ͝ͱʹूܭ͍ͨ͠
DynamoDBͷFull dumpͱFormat • DataPipelineͰFull dump • DynamoDB Stream ࠓޙΔʢئʣ •
σʔλهड़ࢠ -> JSON • ͦͷ··ਏ͍ • (ͳΜͱ͔ͯ͠) convert͢Δ { "Item": { "Age": {"N": "8"}, "Colors": { "L": [ {"S": "White"}, {"S": "Brown"}, {"S": "Black"} ] }, "Name": {"S": "Fido"}, "Vaccinations": { "M": { "Rabies": { "L": [ {"S": "2009-03-17"}, {"S": "2011-09-21"}, {"S": "2014-07-08"} ] }, "Distemper": {"S": "2015-10-13"} } }, "Breed": {"S": "Beagle"}, "AnimalType": {"S": "Dog"} }
Data Pipeline + Glue ETL Amazon DynamoDB %BUB1JQFMJOF w .BQBQQMZ
w UP%'GSPN%'
ETLͷ࣮ݱʹ͋ͨͬͯ • Built-in Transformer class͚ͩͰͳΜͱͳΒͳ͍͕࣌͋Δ • ΑΓෳࡶͳFilterɾMap࣌ • toDF &
fromDFΛ͏ʢී௨ͷpysparkʣ • job bookmarkΛ͏࣌ try & except ඞਢ • toDFͰίέΔʢύʔςΟγϣϯʹ·ͭΘΔͬΆ͍ • job bookmarkͷϢʔεέʔε͕·ͩΘ͔ͬͯͳ͍
ϋϚΓϙΠϯτ • Built-in TransformerΫϥεͷίʔϧόοΫؔͰൃੜͨ͠ExceptionѲΓͭͿ͞ΕΔ • Exception͕ൃੜͨ͠dynamic recordഁغ͞Εɺ࣍ͷϨίʔυॲཧ͕ҠΔ • σόοά͢ΔͳΒίʔϧόοΫؔશମΛtry-except •
RDSΛSource DataStoreʹ͢Δ߹Subnetʹҙ • ͍ΘΏΔʮLambda in VPCʯ • ඞͣNAT Gateway͔VPC EndpointͰS3ʹΞΫηεͰ͖ΔΑ͏ʹ͓ͯ͘͠(Scriptͷ DL) • NWઃఆөʹԿނ͔30͙Β͍͕͔͔࣌ؒΔ
Glueͷॴײ • ࣗલETLόονશ෦ΛGlueʹஔ͖͍͑ͨ • DataCatalogͱ͔࠷ߴ • ͕ɺݱঢ়ͩͱ৭ʑਏ͍ • ࣮ߦ࣌ؒɾಥવࢮɾ։ൃࠔ
Glueʹର͢Δཁ • ԿΑΓߴԽ • DynamoDBΛSource DataStoreͷରʹ • JobεΫϦϓτͷόʔδϣϯཧ • JobͷσόοάΛ༰қʹ(Τϥʔ͕ѲΓͭͿ͞ΕΔ)
• Built-in Transform Classʹ͍ͭͯυΩϡϝϯτͷॆ࣮ • Crawler & ETL jobͷࢹ΄͍͠ • ScalaͰॻ͔ͤͯ͘Ε • EMR(Spark)ͷࢿ࢈Λྲྀ༻͍ͨ͠